Redis

1.redis简介

redis是一个key-value存储系统。和Memcached类似,它支持存储的values类型相对更多,包括字符串、列表、哈希散列表、集合,有序集合。

1.1企业缓存数据库解决方案对比

Memcached

优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。

缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨房数据同步困难、架构扩容复杂度高

Redis

优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高

缺点:多线程读写较Memcached慢

总结

memcached :更加适合多线程连接,少量读写。多核的处理模式

redis:更加适合于单线程,多次读写,所以说他更加适合时候多实例环境。单核的处理模式。

1.2Redis特性

高速读写,数据类型丰富

支持持久化,多种内存分配及回收策略

支持弱事务,消息队列、消息订阅

支持高可用,支持分布式分片集群

支持的储存数据类型

 {
     'k1':'hiayna',  #第一种字符串格式
     'k2':[11,22,33,44], #第二种列表格式
     'k3':{11,22,33,44}, #第三种集合格式
     'k4':{                 #第四种,字典,也可以叫做哈希散列表,
             'n1':'xxx',
             'n2':'fff'
        },
     'k5':{(11,1),('xxx':5)} #有序集合
 }

2.redis单实例安装

 cd /usr/local/
 wget http://download.redis.io/releases/redis-3.2.10.tar.gz
 tar xzf redis-3.2.10.tar.gz
 mv   redis-3.2.10/   redis
 cd redis/
 make

启动测试

 src/redis-server & 

加入坏境变量

 :/application/redis/src

配置文件配置

 #cp redis.conf{,.bak}
 #grep -Ev '^$|#' redis.conf.bak > redis.conf

vim

 daemonize yes  #后台运行
 port 6379 #端口
 logfile /var/log/redis.log
 protected-mode no #关闭保护模式
 requirepass 123 #密码

配置文件详解

启动

 /usr/local/redis/src/redis-server  /etc/redis.conf

3.redis常用命令

 set key velue 插入数据
 get key 获取值
 keys *         查看所有key
 type key     查看key类型
 expire key seconds(时间)   过期时间
 ttl key     查看key过期剩余时间        -2表示key已经不存在了
 persist     取消key的过期时间   -1表示key存在,没有过期时间
 
 exists key     判断key存在   存在返回1   否则0
 del keys     删除key   可以删除多个
 dbsize         计算key的数量

4.reids字符串操作

 set   设置key
 get   获取key
 append 追加string
 mset   设置多个键值对
 mget   获取多个键值对
 del 删除key
 incr 递增+1
 decr 递减-1

5.list双向队列用法

 lpush         从列表左边插
 rpush         从列表右边插
 lrange         获取一定长度的元素 lrange key  start stop
 ltrim               截取一定长度列表
 lpop                 删除最左边一个元素
 rpop                     删除最右边一个元素
 lpushx/rpushx               key存在则添加值,不存在不处理

6.set集合类型,天然去重

 sadd/srem   添加/删除 元素
 sismember   判断是否为set的一个元素
 smembers   返回集合所有的成员
 sdiff             返回一个集合和其他集合的差异
 sinter           返回几个集合的交集
 sunion         返回几个集合的并集

7.有序集合

都是以z开头的命令

zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据也是非常高效的。

用来保存需要排序的数据,例如排行榜,成绩,工资等。

实例

利用有序集合的排序,排序学生的成绩

 127.0.0.1:6379> ZADD mid_test 70 "a"
 (integer) 1
 127.0.0.1:6379> ZADD mid_test 80 "w"
 (integer) 1
 127.0.0.1:6379> ZADD mid_test 99 "y"

排行榜,zreverange 倒叙 zrange正序

 ZREVRANGE mid_test 0 -1 
 ZRANGE mid_test 0 -1

8.哈希类型

 12.redis哈希类型(字典类型)
 hset 设置散列值
 hget 获取散列值
 hmset 设置多对散列值
 hmget 获取多对散列值
 hsetnx   如果散列已经存在,则不设置(防止覆盖key)
 hkeys     返回所有keys
 hvals     返回所有values
 hlen     返回散列包含域(field)的数量
 hdel     删除散列指定的域(field)
 hexists   判断是否存在

 

 key -field1  -value1 
  -field 2 - value2
  -field 3   - value3

9.发布订阅

 PUBLISH channel msg
    将信息 message 发送到指定的频道 channel
 
 SUBSCRIBE channel [channel ...]
    订阅频道,可以同时订阅多个频道
 
 UNSUBSCRIBE [channel ...]
    取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
 PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所   有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有   以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
 PUNSUBSCRIBE [pattern [pattern ...]]
    退订指定的规则, 如果没有参数则会退订所有规则
 PUBSUB subcommand [argument [argument ...]]
    查看订阅与发布系统状态
 注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。

正则发布-----匹配多个

窗口1,启动两个redis-cli窗口,均订阅 wang*频道(channel)

 127.0.0.1:6379> PSUBSCRIBE wang*
 Reading messages... (press Ctrl-C to quit)
 1) "psubscribe"
 2) "wang*"
 3) (integer) 1
 1) "pmessage"
 2) "wang*"
 3) "wangbaoqiang"
 4) "jintian zhennanshou "

窗口2,启动redis-cli窗口,均订阅wang*频道

 127.0.0.1:6379> PSUBSCRIBE wang*
 Reading messages... (press Ctrl-C to quit)
 1) "psubscribe"
 2) "wang*"
 3) (integer) 1
 
 
 
 1) "pmessage"
 2) "wang*"
 3) "wangbaoqiang"
 4) "jintian zhennanshou "

窗口3,发布者消息

 [root@web02 ~]# redis-cli
 127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
 (integer) 2

10.RDB持久化

可以在指定的时间间隔内生成数据集的时间点快照,生成二进制文件。

优点:速度快,适合于用做备份。

缺点:会有数据丢失

修改配置文件

 save 900 1
 save 300 10
 save 60 10000

配置分别表示:

900秒(15分钟)内有1个更改 300秒(5分钟)内有10个更改 60秒内有10000个更改 当达到以上定义的配置时间时,就将内存数据持久化到磁盘

恢复时可以sava触发

RDB持久化高级配置

 stop-writes-on-bgsave-error yes
 rdbcompression yes
 rdbchecksum yes
 dbfilename dump.rdb
 dir ./redis/data/6379

以上配置分别表示:

 • 后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致
 • 导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做
 • 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
 • 导出来的rdb文件名
 • rdb的放置路径

配置文件简单配置

     daemonize yes #后台运行 
  port 6379 #指定端口
  logfile /data/6379/redis.log #指定日志路径
  dir /data/6379 #redis的数据文件,会存放在这里
  dbfilename dbmp.rdb   #   开启rdb持久化,且指定持久化文件的名字
  bind 0.0.0.0
  save 900 1  #定义触发rdb持久化的时间机制
  save 300 10
  save 60  10000

 

11.AOF持久化

记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。

AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

优点:可以最大程度保证数据不丢

缺点:日志记录量级比较大

 appendonly yes
 appendfsync always
 appendfsync everysec
 appendfsync no

配置分别表示:

 • 是否打开aof日志功能
 • 每1个命令,都立即同步到aof
 • 每秒写1次
 • 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.

配置文件中加入即可

 appendonly yes
 appendfsync everysec

 

AOF持久化高级配置

 no-appendfsync-on-rewrite yes/no
 auto-aof-rewrite-percentage 100
 auto-aof-rewrite-min-size 64mb

配置分别表示:

 • 正在导出rdb快照的过程中,要不要停止同步aof
 • aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
 • aof文件,至少超过64M时,重写

简单配置

 daemonize yes
 port 6379
 logfile /data/6379/redis.log
 dir /data/6379
 appendonly yes #开启aof的俩参数
 appendfsync everysec     #aof的持久化机制

 

12.如何使用哪种持久化方式

一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。

如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug

13.不重启切换RDB为AOF

1.准备一个rdb的redis数据库-切换之前必须备份数据防止丢失 2.通过命令,直接切换aof

 127.0.0.1:6379> CONFIG set appendonly yes   #开启AOF功能
 OK
 127.0.0.1:6379> CONFIG SET save "" #关闭RDB功能
 OK

 

3.正确情况下,会生成aof日志文件了,此时命令操作都是在aof里面了

4.还得修改配置文件,以上命令只是临时生效,改完以后,下次指定配置文件启动,就一直是aof了

     port 6379
  logfile /data/6379/redis.log
  dir /data/6379
  dbfilename dbmp.rdb
  save 900 1
  save 300 10
  save 60  10000
  daemonize yes
  appendonly yes  
  appendfsync everysec    

 

14.AOF文件损坏了怎么办?

服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:

 为现有的 AOF 文件创建一个备份。
 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复: $ redis-check-aof –fix
 使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。(可选)
 重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复

15.备份

写一个crob 任务 将RDB文件定时备份到其他文件中

16.redis慢日志查询

Slow log 是 Redis 用来记录查询执行时间的日志系统。

slow log 保存在内存里面,读写速度非常快

可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改

 slowlog-log-slower-than 10000 超过多少微秒
 CONFIG SET slowlog-log-slower-than 100
 CONFIG SET slowlog-max-len 1000 保存多少条慢日志
 CONFIG GET slow*
 SLOWLOG GET
 SLOWLOG RESET

17.redis主从复制

#redis的主从复制,可以基于redis的多实例完成,基于不同的端口,就能运行各个独立的redis数据库

#redis的主从复制,做一个一主三从的实验

mredis.conf #主库的配置文件 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no

 

准备一个从库s1redis.conf port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了

准备第二个从库s2redis.conf port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 protected-mode no slaveof 127.0.0.1 6380 #也可以在配置文件中,直接定义,直接启动,默认就是主从复制了

#创建三个数据库的数据文件夹 mkdir -p /data/{6380,6381,6382}

#分别启动三个数据库实例 [root@s24_linux myredis]# redis-server mredis.conf [root@s24_linux myredis]# redis-server s1redis.conf [root@s24_linux myredis]# redis-server s2redis.conf [root@s24_linux myredis]# ps -ef|grep redis root 78545 1 0 10:54 ? 00:00:00 redis-server *:6380 root 78550 1 0 10:54 ? 00:00:00 redis-server *:6381 root 78555 1 0 10:54 ? 00:00:00 redis-server *:6382

#分别查看三个redis数据库的库信息 [root@s24_linux myredis]# redis-cli -p 6380 info replication [root@s24_linux myredis]# redis-cli -p 6381 info replication [root@s24_linux myredis]# redis-cli -p 6382 info replication

#通过命令,临时给三个数据库添加主从复制信息 redis-cli -p 6381 slaveof 127.0.0.1 6380 #给6381指定为6380的从库 redis-cli -p 6381 info replication #查看6381的复制信息 redis-cli -p 6380 info replication #查看6380的复制信息 redis-cli -p 6382 slaveof 127.0.0.1 6380 #给6382设置为6380的从库 redis-cli -p 6380 info replication

#进行主从复制读写演示 6380可读可写 6381 6382只读,不给写

#杀死从库,无所谓,再把从库重新启动,或者再创建一个新的就行

#杀死主库,必须得手动解决故障,吧从库切换为新的主库,继续主从复制

只需要剔除当前自己的从的身份即可,剔除6381的从的身份 127.0.0.1:6381> slaveof no one OK

#再次启动一个新的从库,以6381为主库即可

 

#redis的哨兵配置,能够自动的解决主从切换故障

1.准备三个redis数据库实例,配置好,主从关系

 [root@s24_linux myredis]# cat mredis.conf 
 port 6380
 daemonize yes
 pidfile /data/6380/redis.pid
 loglevel notice
 logfile "/data/6380/redis.log"
 dbfilename dump.rdb
 dir /data/6380
 protected-mode no
 [root@s24_linux myredis]# cat s1redis.conf 
 
 port 6381
 daemonize yes
 pidfile /data/6381/redis.pid
 loglevel notice
 logfile "/data/6381/redis.log"
 dbfilename dump.rdb
 dir /data/6381
 protected-mode no
 slaveof 127.0.0.1 6380
 [root@s24_linux myredis]# cat s2redis.conf 
 port 6382
 daemonize yes
 pidfile /data/6382/redis.pid
 loglevel notice
 logfile "/data/6382/redis.log"
 dbfilename dump.rdb
 dir /data/6382
 protected-mode no
 slaveof 127.0.0.1 6380

分别启动三个redis数据库节点

2.准备三个哨兵sentinel(哨兵)的配置文件,三个哨兵配置文件,仅仅是端口的不同,默认是26379,26380,26381 s24shaobing.conf port 26379 dir /var/redis/data/ logfile "26379.log"

 // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点
 // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
 // mymaster是主节点的别名
 sentinel monitor s24ms 127.0.0.1 6380 2
 
 //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
 sentinel down-after-milliseconds s24ms 30000
 
 //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
 原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
 sentinel parallel-syncs s24ms 1
 
 //故障转移超时时间为180000毫秒
 sentinel failover-timeout s24ms 180000
 //后台运行哨兵
 daemonize yes

s24shaobing1.conf s24shaobing2.conf #快速生成2个配置文件 [root@s24_linux myredis]# sed 's/26379/26380/g' s24shaobing.conf > s24shaobing1.conf [root@s24_linux myredis]# sed 's/26379/26381/g' s24shaobing.conf > s24shaobing2.conf #创建数据文件夹 mkdir -p /var/redis/data/

 

3.分别启动三个哨兵进程 [root@s24_linux myredis]# ps -ef|grep redis root 78952 1 0 11:42 ? 00:00:00 redis-server *:6380 root 78957 1 0 11:42 ? 00:00:00 redis-server *:6381 root 78963 1 0 11:42 ? 00:00:00 redis-server *:6382 root 79051 1 0 11:51 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 79056 1 0 11:51 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 79061 1 0 11:51 ? 00:00:00 redis-sentinel *:26381 [sentinel]

4.干掉master主库,哨兵会自动的选举一个从库为新的主库

5.将挂掉的主库,重新启动,查看复制信息

 

 

 

#redis-cluster集群的搭建

1.准备6个数据库节点,搭建三主三从的数据库主从机群,6个节点,仅仅是端口的不同 指定7000~7005 6个节点 touch redis-7000.conf

port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #开启集群模式 cluster-config-file nodes-7000.conf  #集群内部的配置文件

touch redis-7001.conf touch redis-7002.conf touch redis-7003.conf touch redis-7004.conf touch redis-7005.conf

sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf

分别启动6个redis节点

 

2.配置ruby环境,一键创建redis机群slot槽位分配 yum直接安装ruby解释器 yum install ruby -y 下载ruby操作redis的模块 wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem 一键开启redis集群槽位分配,先找一下这个ruby工具在哪 find / -name redis-trib.rb

 /s24fuxi/redis-4.0.10/src/redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

3.开启redis集群功能,向集群中写入数据,查看数据重定向

 以集群模式登陆redis-cluster ,写入数据

 

 

转载 https://www.cnblogs.com/pyyu/p/9843950.html

原文地址:https://www.cnblogs.com/zdqc/p/9510301.html