Redis,Remote Dictionary Server,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可以基于内存亦可持久化的日志型、kv数据库,并提供多种语言的API。

 

特点:

       Redis支持数据的持久化,可以将内存中的数据保存到磁盘上,重启的时候可以再次加载进行使用。

       Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

       Redis支持数据的备份,即master-salve模式的数据备份。

功能:

       数据结构服务器:值可以是string,map,lsit,sets,sorted sets等类型。

       单进程:CPU并非瓶颈;

       持久化机制:snapshoting,AOF

       Replication:主从,主(rw)从(read-only)

优势:

       性能极高;

       丰富的数据类型;

       原子;

       丰富的特性;

 

命令行客户端命令:

Redis-cli

       redis-cli [OPTIONS] [cmd [arg [arg ...]]]

       常用选项:

       -h <hostname> 

       -p <port>

       -a <password>

演示1:

1.      配置yum源安装redis

#yum install redis –y

2.      查看安装redis生成的文件;

    image.png                                               

3.      修改配置文件;

    image.png

4.      启动服务,并查看端口;

    image.png

5.      用客户端命令连接;

    image.png

 

Redis:k/v

1.      String(字符串):

作用:用于管理redis字符串值;

命令用法:

image.png

image.png

演示:

image.png

2.      List(列表)

作用:redis列表是简单的字符串列表,按照插入顺序,你可以添加一个元素导到列表的头部(左边)或者尾部(右边);

一个列表最多可以包含2^32 – 1个元素。

相关命令:

image.png

LPUSH:将一个或多个值插入到列表头部

RPUSH:在列表中添加一个或多个值;

LPOP:移出并获取列表的第一个元素;

RPOP:移除并获取列表最后一个元素;

LINDEX:通过索引获取列表中的元素;

LSET:通过索引设置列表元素的值;

 

演示:

image.png

3.      Set(集合)

作用:redis的set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1);

      基本命令:

      image.png

       SADD:向集合添加一个或多个成员;

       SINTER:返回给定所有集合的交集;

       SUNION:返回所有给定集合的并集

       SPOP:移除并返回集合中的一个随机元素;

       SISMEMBER:判断member元素是否是结合key的成员;

       SMEMBERS:列出集合中的元素;

       演示:

       image.png

4.      Hash(哈希)

作用:redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

image.png

基本命令:

HSET:将hash表key中的字段field的值设为value

HSETNX:只有在字段field不存在时,设置哈希表字段的值;

HGET:获取存储在哈希表中指定字段的值。

HKEYS:获取所有哈希表中的字段;

HVALS:获取哈希表中的所有值;

HDEL:删除一个或多个哈希表字段;

 

演示:

image.png

5.      Sorted set(有序集合)

作用:redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)确可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为2^32 – 1.

基本命令:

ZADD:向有序集合中添加一个或多个成员,或者更新已存在成员的分数

ZRANGE:通过索引区间返回有序集合成指定区间内的成员;

ZCARD:获取有序集合的成员数;

ZRANK:返回有序集合中指定成员的索引。

 

配置和使用redis:

1.      配置和使用redis;

配置段:

基本配置项;

网络配置项;

持久化相关的配置;

复制相关的配置;

安全相关的配置;

Limit相关的配置;

Slowlog相关的配置;

Includes

Advanced配置;

通用配置项:

Deamonize,supervised,loglevel,logfile,pidfile

Databases

设定设局库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;

切换数据库的方法:SELECT <dbid>

网络配置项:

Bind IP

Port PORT

Tcp-backlog:后援队列长度;

Unixsocket:监听的套接字文件;

Timeout:连接的超时时长;

安全相关的配置:

Repuirepass  <PASSWORD>

        在redis-cli接口中使用AUTH命令完成认证;或者在连接时使用-a指明密码;

Rename-command <COMMAND> <NEW_CMND_NAME>

        在AOF和Replication坏境中,不建议使用

认证实现方法:

1)      Redis.conf

Requirepass   PASSWORD

2)      Redis-cli

AUTH PASSWORD

清空数据库:

FLUSHDB:清空当前库

FLUSHALL:清空所有库

演示:

1)      编辑配置文件,启用认证功能;

image.png

2)      重启redis服务,并测试查看;

image.png

 

2.      事务功能;

通过MULTI,EXEC,WATCH等命令实现事务功能;将一个或多个命令归并为一个操作提醒服务器按顺序执行的机制;不支持回滚操作;

MULTI:启动一个事务;

EXEC:执行事务;

一次性将事务中的所有操作执行完成后返回给客户端;

WATCH:乐观锁;在EXEC命令执行之前,用于监视指定数量键;如果监视中的某任意数据被修改,则服务器拒绝执行事务;

DISCARD:取消事务,放弃执行事务块内的命令;

UNWATCH:取消WATCH命令对所有key的监控;

演示:

1)      开始一个事务,最后由EXEC触发事务;

image.png

2)      用WATCH命令监视一个或多个key,然后启动一个事务,在未执行EXEC之前,在另一个终端修改这个被监视的key;

image.png

在上面的EXEC执行之前,在另一个终端上执行如下命令;

image.png

 

3.      Connection(连接)及Server相关的命令;

Connection命令:

AUTH:认证相关的命令;

ECHO

PING

QUIT

SELECT:切换数据库;

Server命令:

Redis服务器命令主要是用于管理redis服务。

1)      BGREWRITEOF:异步执行一个AOF(AppendOnlyFile)文件重写操作;

2)      BGSAVE:在后台异步保存当前数据库的数据到磁盘;

3)      CLIENT KILL [ip:port] [ID client-id]:关闭客户端连接;

4)      CLIENT LIST:获取连接到服务器的客户端连接列表;

5)      CLIENT GETNAME:获取连接的名称;

6)      CLIENT PAUSE timeout:在指定的时间内终止运行来自客户端的命令;

7)      CLIENT SETNAME connection-name:设置当前连接的名称;

8)      CLUSTER SLOTS:获取集群节点的映射数组;

9)      COMMAND:获取redis命令详情数组;

10)  COMMAND COUNT:获取redis命令总数;

11)  COMMAND GETKEYS:获取给指定命令的所有键;

12)  TIME:返回当前服务器的时间;

13)  COMMAND INFO command-name [command-name]:获取指定redis命令描述的数组;

14)  CONFIG GET parameter:获取指定配置参数的值;

15)  CONFIG REWRITE:对启动redis服务器时所指定的redis.conf配置文件进行改写;

16)  CONFIG SET parameter value:修改redis配置参数,无须重启;

17)  CONFIG RESETSTAT:重置INFO命令中某些统计数据;

18)  DBSIZE:返回当前数据库的key的数量;

19)  DEBUG OBJECT key:获取key的调试信息;

20)  DEBUG SEGFAULT:让redis服务崩溃;

21)  FLUSHALL:删除所有数据库的所有key;

22)  FLUSHDB:删除当前数据库的所有key;

23)  INFO [section]:获取redis服务器的各种信息和统计数值;

24)  LASTSAVE:返回最近一次redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示;

25)  MONITOR:实时打印出redis服务器接收到的命令,调试用;

26)  ROLE:返回主从示例所属的角色;

27)  SAVE:异步保存数据到硬盘;

28)  SHUTDOWN [NOSAVE][SAVE]:异步保存数据到硬盘,并关闭服务器;

29)  SLAVEOF host port:将当前服务器转变为指定服务器的从属服务器;

30)  SLOWLOG subcommand  [argument]:管理redis的慢查询日志;

31)  SYNC:用于复制功能(replication)的内部命令;

 

4.      发布与订阅(publish/subscribe)

频道:消息队列;

SUBSCRIBE:订阅一个或多个队列;

PUBLISH:向频道发布消息;

UNSUBSCRIBE:退订此前订阅的频道;

PSUBSCRIBE:模式订阅;

演示:

1)      在客户端1订阅频道;

image.png

2)      在另外一个客户端向频道发布消息;

image.png

3)      在客户端1上会显示如下的消息;

image.png

 

5.      Redis的持久化;

RDB和AOF

RDB:snapshot,二进制格式;按事先定制的策略,周期性的将数据保存至磁盘;数据文件默认为dump.rdb;

        客户端也可显式使用SAVE或BGSAVE命令启动快照保存机制;

        SAVE:同步,在主线程中保存快照;此时会阻塞所有客户端请求;

BGSAVE:异步,

在配置文件中定义周期性的工作机制:

1)      指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合;

image.png

2)      指定存储至本地数据库时是否压缩数据,默认为yes,redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大;

rdbcompression   yes

image.png

3)      指定本地数据库文件名,默认值为dump.rdb

dbfilename   dump.rdb

image.png

4)      指定本地数据库存放目录;

image.png

 

 AOF:Append Only File

       记录每一次写操作至指定的文件尾部都实现持久化;当redis重启时,可通过重新执行文件中的命令在内存重建数据库;

BGREWRITEAOF:AOF文件重写;不会读取正在使用的AOF文件,而通过将内存中的数据以命令方式保存到临时文件中,完成之后替换原来的AOF文件;

AOF重写过程:

1)      Redis主进程通过fork创建子进程;

2)      子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中;

3)      父进程继承client的请求,并会把这些请求中的写操作继续追加至原来的AOF文件;额外地,这些新的写请求还会被放置于一个缓冲队列中;

4)      子进程重写完成,会通知父进程;父进程把缓冲中的命令写到临时文件中

5)      父进程用临时文件替换老的aof文件;

  相关参数:

1)      appendonly  no:指定是否在每次更新操作后进行日志记录,redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断点时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no;

2)      appendfilename  appendonly.aof:指定更新日志文件名,默认为appendonly.aof;

3)      appendfsync everysec:指定更新日志条件,共有3个可选值;

no:表示等操作系统进行数据缓存同步到磁盘(快)

always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)

everysync:表示每秒同步一次(折中,默认值)

4)      no-appendfsync-on-rewrite   no

5)      auto-aof-rewrite-percentage   100:表示现有的aof文件是上次文件大小的2倍,即改变已达到100%,就再次重写;

6)      auto-aof-rewrite-min-size   64mb:表示重写的大小至少达到64M之后才开始重写;

note:持久本身不能取代备份;还应该指定备份策略,对redis数据库定期进行备份;

BDF与AOF同时启用:

1)      BGSAVE和BGREWRITEAOF不会同时执行;

2)      在redis服务器启动用于数据恢复时,会优先选用AOF;

 

6.      Redis的主从复制;

1)      特点

一个master可以有多个slave;支持链式复制;master以非阻塞方式同步数据至slave;

2)      Slave节点操作;

> SLAVAOF MASTER_IP MASTER_PORT

 Note:如果master使用requirepass开启了认证功能,从服务器要使用masterauth <PASSWORD>来连入服务请求使用此密码认证;

如果当前服务器已经是个主服务器的从属服务器,那么执行SLAVEOF host port将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步;

另外,对一个从属服务器执行命令SLAVEOF NO ONE将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会丢弃;

利用SLAVEOF NO ONE不会丢弃同步所得到的数据集,这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行;

演示:

1)      准备一个新的节点node2(192.168.19.145),安装redis,将其配置为node1(192.168.19.140)的从库;

image.png

Note:由于一开始两台主机上的iptables和selinux没有关闭,导致数据不能同步过来;

 

从节点node2上查看INFO信息及日志如下:

image.png

image.png

主节点查看INFO信息及日志如下:

image.png

image.png

 

7.      Redis的sentinel机制

用于管理多个redis服务实现HA;

监控、通知、自动故障转移;

流言协议,投票协议;

程序:

Redis-sentinel  /path/to/file.conf

Redis-server  /path/to/file.conf  --sentinel

1)      服务器自身初始化,运行redis-server中专用于sentinel功能的代码;

2)      初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;

3)      创建连向master的连接;

       专用配置文件:/etc/redis-sentinel.conf

1)      # sentinel monitor <master-name> <ip> <redis-port> <quorum>

连接的主节点,可以有多行,quorum表示法定票数,建议sentinel节点为奇数个;

只需要指明主节点即可,从节点会通过主节点自动获取;

sentinel monitor mymaster 127.0.0.1 6379 2

2)      sentinel down-after-milliseconds <master-name> <milliseconds>

判断某主节点不在线的超时时长;

sentinel down-after-milliseconds mymaster 30000

3)      sentinel parallel-syncs <master-name> <numslaves>

执行故障转移时,允许最多有多少个从服务器可以向主服务器发起连接请求;

entinel parallel-syncs mymaster 1

4)      sentinel failover-timeout <master-name> <milliseconds>

故障转移的超时时间,即当主服务器出现故障时,提升新的服务器为主服务器的超时时间;

sentinel failover-timeout mymaster 180000

5)      sentinel  auth-pass <master-name> <password>

连接主节点的认证密码

       主管下线,客观下线:

       主管下线:一个sentinel示例判断出某节点下线;

       客观下线:多个sentinel节点协商后判断出某节点下线;

        专用命令:

       SENTINEL masters

      SENTINEL slaves <master name>

      SENTINEL get-master-addr-by-name <master name>

      SENTINEL reset

      SENTINEL failover <master name>

演示:

实验环境:

       Node1节点为master节点,也为sentinel节点,地址:192.168.19.141;node2:192.168.19.145和node3:192.168.19.134为从节点;

1)      准备操作环境;

主节点node1:

image.png

从节点node2:

image.png

从节点node3:

image.png

2)      在主节点node1上配置启用sentinel机制,编辑配置文件/etc/redis-sentinel.conf文件并启动;

image.png

Note:要启用daemonize yes选项,让sentinel以守护进程的方式启动;否则,会出现启动问题;而将Protected-mode设为no,因为在后面的启动连接操作中,不讲保护模式取消,不能执行操作;

开启服务,查看26379端口;

image.png

3)      连接sentinel执行命令;

image.png

查看从节点服务器信息;

image.png

4)      测试,让主节点下线,再次查看sentinel信息;

让node1下线:

image.png

查看主节点变成了node2;

image.png