Redis

1.redis的概述:

    redis是一款内存高速缓存数据库,全称是remote dictionary service(远程数据服务),典型的nosql数据库服务器,redis是一个key-value存储系统,存储类型包括String,list,hash,set,zset。纯内存操作,读写是目前最快的key-value db,但其主要缺点是:受物理内存的限制,不能作为海量数据的高性能读写,如果需要进行海量数据的高性能读写推荐使用MongoDB

2.Redis的安装:

(1)安装环境

先下载安装包:Redis官方网址

安装Redis需要将下载的源码进行编译,编译依赖gc++,如果没有gc++环境需要安装gcc,执行命令:yum install gcc-c++

(2)安装:

1.将软件安装在/usr/local目录下,执行命令:tar -zxvf redis-3.2.10.tar.gz -C  /usr/local/redis
2.解压编译:make PREFIX=/usr/local/redis/redis-3.2.10  install          此时能够看到在该路径下多出一个bin目录

3拷贝配置文件到安装目录下(方便以后的启动),进入解压后的redis目录,里面有一份配置文件reids.conf,将其拷贝到安装目录bin目录下

执行命令:cp /usr/local/redis/redis-3.2.10/redis.conf      /usr/local/redis/bin/redis-3.2.10

(3)、Redis启动

后端模式启动,修改安装目录(即bin目录)下的redis.conf配置文件,将daemonize no改为daemonize yes如下图所示:

并在redis服务启动时加载该配置文件:

执行命令:cd /usr/local/redis/redis-3.2.10/bin
执行命令:./redis-server redis.conf

(4)、关闭Redis

首先进入redis安装目录(即bin目录),执行命令:cd /usr/local/redis/bin

关闭redis:

方式一:执行命令: ./redis-cli shutdown

也可以根据redis服务的端口号来进行关闭

方式二:执行命令: ./redis-cli -p 6379 shutdown

3.关系型数据库和nosql数据库的区别

        (1)  概述上:关系型数据库是按照行和列形式展示,行和列组织起来的数据的集合                
         非关系型数据库是按照key-value形式存在,key是唯一的,value是可以有多个重复的数据
  nosql的优势:(1)成本上:nosql简单易部署,代码开源免费,oracle数据库收费
          (2)查询速率上:nosql的查询速率更快    
          (3)存储数据格式:key-value可以存储String,hash,list,list,set,zeset等类型的数据,关系型数据库只能存储结构化数据类型
         (4)拓展性:关系型数据库有join这样的多表查询机制的限制拓展性难
                 缺点:(1)维护和资源有限,nosql属于新技术
        (2)不支持sql语句
        (3)不提供关系型数据库对事物的处理
        (4)存储在内存上,局限于物理内存的大小  

 

4.Redis 最适合的场景有哪些?

 (1)会话缓存    (2)全页缓存   (3)排行版/计数器    (4)队/列   (5)发布/订阅(ActiveMq消息中间件的俩种模式)

5.Memcache 与 Redis 的区别都有哪些?

  (1)存储方式:memcache是数据全部存储于内存的,数据大小不能超过内存大小,如果突然断电,数据库会挂掉;redis是部分存储于磁盘的,便于数据的持久化存储

   (2)存储数据类型:memcache存储简单数据类型(String),redis存储复杂的数据类型(String,hash,list,set,zest)

   (3)存储大小:memcache内存大小为1Mb,redis为1Gb

 (4)底层模型:他们的底层实现方式以及客户端之间的通行协议不一致。redis直接直接自己构建VM机制(一般的系统调用系统函数会浪费时间去移动和请求)。

6.为什么 redis 需要把所有数据放到内存中?

redis为了达到最快的读写速度将数据添加到内存中,并通过异步的方式将数据存储到磁盘中,所以redis具有快速和数据持久化的特征。如果不放在内存中,磁盘I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis会越来越受欢迎,如果设置了最大使用的内存,则数据达到内存限值后无法继续添加新值。

7.Redis 常见的性能问题都有哪些?如何解决?

(1)Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大的时候对性能影响是比较大的,会间断性暂停服务,所以master最好不要写内存快照

(2)Master AOF持久化,如果重写AOF文件,这个持久化方式对性能的影响是最小的,单数AOF文件不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何的持久化工作,包括内存快照和AOF日志文件,特别是不要启用内寸快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

(3)Master调用BGREWRITEAOF 重写AOF文件,AOF在重写的时候回占用大量的cpu和内存资源,导致服务load过高,出现短暂服务暂停现象

(4)Redis主从赋值的性能问题,为了主从赋值的速度和连接的稳定性,slave和master最好在同一个局域网

8. Redis 用过 RedisNX 吗?Redis 有哪几种数据结构?

见过没使用过,Redis中含较多的nx后缀,nx为: SETNX SET if Not eXists  

数据类型:

(1)String 字符串类型:  简单的key-value类型   value不仅可以是String,也可以是数字

(2)Hash  字典    将一些数据化的信息打包成hashmap,在客户端序列化后存储在一个字符串的值(一般是json格式的字符串),比如用户的昵称,年龄,性别,积分等。

(3)list  -- 列表   redis使用双端链表实现的List

(4)Set---集合    Set就是一个集合,集合的概念就是一堆无序不重复的组合,利用Redis提供的Set数据结构,可以存储一些集合性的数据。

(5)zset(Sorted set)有序集合   和set相比,sorter set是将set中的元素添加一个权重参数score,是的集合中的元素能够按照score进行有序排列

9.Redis的优缺点:

优点: (1)性能高    ---redis能支持10万每秒的读写频率

   (2)丰富的数据类型:redis支持二进制的数据类型操作:String,list,hash,set和Sorter Set等

   (3)原子性:redis的所有操作都是原子性的,同时redis还支持几个操作全并后的原子性执行。执行要么全部成功,要么全部失败回滚。

   (4)丰富的特性:redis还支持publish/subscribe(发布/订阅),通知,key过期等特性。

缺点:

  (1)内存数据库,存储局限于内存的大小,虽然redis有key过期策略,但还是需要提前预估和节约内存,如果内存增长过快,需要定期删除数据

  (2)如果进行完整重同步,需要生成rdb文件,需要传输,会占用主机的cpu,会消耗现网的宽带。redis2.8之后,已经有了部分重同步的功能,但还没用全部重同步。比如,新上线的备机。

  (3)修改配置文件,需要重启,将硬盘的数据加载到内存,时间比较久,这个过程中,redis不能提供服务。

10.Redis 的持久化

RDB持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)默认的redis持久化方式

AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾。redis还可以在后台对AOF文件进行重写(rewirte),使得AOF文件的体积不会超出保存数据集状态所需的实际大小。(追加文件)

无持久化:让数据只能在服务器运行时存在。

同时应用AOF和RDB:但redis重启时,他会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。

RDB的优缺点:

    优点;RDB是一个非常紧凑的文件,他保存了redis在某个时间状态下的数据集。这种文件非常适合备份。

    缺点:如果需要尽量避免在服务器故障时丢失数据,那么RDB不适合。虽然redis允许设置不同的保存点(save point) 来控制保存RDB文件的频率,但redis文件需要保存整个数据集的状态,所以他不是一个轻松的操作,可能5分钟才会保存一次RDB文件。在这种情况下,一旦发生故障停机,就会丢失好几分钟的数据。每次保存RDB的时候,redis第一台fork()一个子线程,并由子进程来进行实际的持久化工作。在数据集比较庞大的时候,fork()非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常大,并且cpu非常紧张,把你这种停止时间甚至可能会长达一秒

AOF的优缺点:

  优点:

    1.使用AOF持久化会使redis变得非常耐久

    2.redis可以在AOF文件体积非常大的时候,自动在后台对AOF进行重写;重写后的心AOF文件包含了回复当前数据集所需要的最小命令集合。整个重写操作是绝对安全的,因为redis在创建新的AOF文件的过程中,会继续将命令追加到AOF文件中,即使重写过程中发生停机,现有AOF文件也不会丢失。而一旦新AOF文件创建完毕,redis就会从旧AOF文件切换到新的AOF文件,并开始对新AOF文件进行追加操作。

  缺点:

      对于相同的数据集来说,AOF的体积比RDB的体积大,根据使用的fsync策略,AOF的速度可能会慢于RDB,在一般情况下,每秒的fsync的性能依然非常高,而关闭fysnc可以让AOF的速度和RDB一样快,即使是在高负荷下,不过在处理巨大的写入载入时,RDB可以提供更有保证的最大延迟时间(latency).

      AOF发生过bug:个别命令的原因,导致AOF文件在重新载入的时候们无法将数据集恢复成原来的样子

俩者的区别:

两种区别就是,一个是持续的用日志记录写操作,crash后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。

选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

一,为什么要是用Redis?(为什么要使用缓存)

  主要从高性能和高并发两方面讨论

高性能:

  当用户第一次访问数据库中的某些数据的时候,数据是从硬盘中获取的,速度比较慢,如果将数据存储到缓存中,下一次用户查数据时就可以直接从缓存中获取,而操作缓存,将相当于操作内存,速度非常快,如果数据库中数据之后发生改变,同步改变缓存中的数据就可以了

高并发:

  直接操作缓存的能够承受的请求是远远大于直接操作数据库的,如果将数据库中的一部分数据转存到缓存中,那么用户的一部分请求就会直接到缓存中查询数据,而不是数据库

二,为什么使用redis而不用map做缓存?

  缓存分为本地缓存和分布式缓存。以Java为例,使用map和guava实现的属于本地缓存,最主要特点是轻量以及快速,生命随着JVM的销毁而结束,当有很多实例的时候,每个实例都需要为各自保存一份缓存,缓存不具有一致性

  使用redis和memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存,缓存具有一致性。缺点是需要保证redis或memcached服务的高可用,整个程序结构比较复杂。

四,redis常见数据结构以及使用场景分析

String:

  String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字,常规key-value缓存应用,常规计数:微博数,粉丝数等

Hash:

  Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值,比如我们可以Hash数据结构来存储用户信息,商品信息等等

List:

   list就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的list结构来实现

  Redis list 的实现为一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,

  另外可以通过lrang命令,就是从某个元素开始读取多少个元素,可以基于list实现分页查询,这个很棒的一个功能,基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能很高

Set:

  set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。

  当你需要 存储一个列表数据,又不希望出现重复数据的时候,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于set轻易实现交集,并集,差集的操作

  比如:zai微博应用中,可以将一个用户所有的关注人存在存在一个集合中,将其所有粉丝存在一个集合,Redis可以非常方便的实现如共同关注,共同粉丝,共同喜好等功能。这个过程也就是求交集的过程,具体命令如下:sinterstore  key1  key2  key3  将交集存在key1内

ZSet:

  和set相比,zset增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息等信息,适合使用Redis中的SortedSet结构进行存储

v>

五. redis 内存淘汰机制。
redis 提供 6 种数据淘汰策略:
1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的).
5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
 
 
原文地址:https://www.cnblogs.com/wufeng6/p/11973590.html