一、redis中发布与订阅
1 什么是发布与订阅
2 发布与订阅的命令
订阅:subscribe channel 订阅频道channel。
发布:publish channel msg向频道channel 发送一条msg消息。
二、Redis持久化
1、 持久化操作-RDB
1.1 RDB是什么?
1.2 备份过程
1.3 dump.rdb文件
2. rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。
redis.conf中配置文件路径
1.4 如何触发快照?
1. 快照默认配置
save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存
save 300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存
save 60 10000:表示60秒内如果至少有 10000个key的值变化,则保存
注意:可以自己配置新的保存规则。配置修改后,需 要重启Redis服务。
redis-cli shutdown
redis-server # 开启服务
redis-cli 启动客户端
1.4.2 flushall
1.4.3 save与bgsave
1.4.4 stop-writes-on-bgsave-error
1.4.5 rdbcompression
1.4.6 rdbchecksum
1.5 恢复数据
2 持久化操作-AOF
2.1 AOF是什么?
2.2 AOF持久化流程
2.3 AOF默认不开启
2.4 AOF启动/修复/恢复
重启服务 服务器启动后,生成appendonly.aof文件,且大小为0。
redis-cli shutdown
redis-server # 开启服务
redis-cli 启动客户端
2.5 AOF同步频率设置
2.6 Rewrite
二、Redis 事务
2.1 redis事务简介
2.2 Redis事务基本操作
multi 开始事务
set k1 v1 进行组队,并不执行
set k2 v2 进行组队,并不执行
exec 执行队列命令,依次设置k1 k2
multi 开始事务
set k3 v3 进行组队,并不执行
set k4 v4 进行组队,并不执行
discard 取消组队,都不执行
2.3 Redis中的乐观锁
watch key # 用乐观锁监听这个key 注意:要在开启事务之前使用
multi # 开启事务,把命令加载缓存队列中,但不会执行
exec # 开始执行队列缓存中的命令
unwatch # 取消watch 对所有key的监听
# 如果在执行watch命令之后,exec命令或discard命令先执行的话,那么就不需要再执行unwatch。
三、Redis主从复制
1、简介
2、主从复制的作用
3、Redis主从复制-一主多从环境搭建
3.1 在reids配置文件的文件夹下 创建新建三个配置文件,分别为redis6379.conf、 redis6380.conf、redis6381.conf,由文件名可知,redis的端口号分别为6379、6380、6381。
touch reids6379.conf
touch redis6380.conf
touch redis6381.conf
创建出3个空文件,redis.conf是原有的配置文件。
3.2 在三个配置文件写入内容
例如 :
redis6379.conf 文件配置
include /usr/local/bin/myredis/redis.conf # 导入公共配置基础文件
pidfile /var/run/redis_6379.pid # 进程的具体文件
port 6379 # 端口号
dbfilename dump6379.rdb # 恢复文件名
redis6380.conf 文件配置
include /usr/local/bin/myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
redis6381.conf 文件配置
include /usr/local/bin/myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
3.3 通过不同的redis6379.conf 、redis6380.conf、redis6381.conf ,分别启动3个redis服务
redis-server ./myredis/redis6379.conf
redis-server ./myredis/redis6380.conf
redis-server ./myredis/redis6381.conf
3.4 查看redis三个服务开启的情况
netstat -ltnp
3.5 在redis客户端中,通过info replication命令可以查看Redis服务器当前状态 可以给redis-cli命令添加-p参数,来指定链接哪个服务器
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
info replication
3.6 把端口6380、6381追加到master的端口6379上
slaveof host port # 链接主节点
slaveof no one # 将slave变成master
3.7 redis主从复制遇到的问题
1. 如果Master断开(宕机),Slave依然连接着Master,可以正常使用读操作,但是没有写操作。如
果Master恢复正常,Slave依旧可以直接获取Master写的信息。
2. 如果Slave断开(宕机),当该Slave重启成功,则会变为Master,需要通过slaveof 恢复成Slave,
只要变为Slave,立刻可以从Master同步所有数据
3.8 reids 主从复制原理
Slave启动成功连接到Master后会主动发送一个同步(sync)命令。
Master接到Slave的命令,把Master数据进行持久化,把rdb文件发送给Slave,Slave拿到rdb进行
读取。
每次Master进行写操作之后,会和Slave进行数据同步。
4、Redis主从复制之哨兵模式(Sentinel)
反客为主的自动版,能够后台监控Master是否故障,如果故障了,根据投票数自动将Slave转换为
Master。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独
立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
4.1 哨兵模式的使用
1、redis服务器弄成一主多从
2、在redis配置文件夹下创建建sentinel.conf文件(名字一定不能错)。
3、配置哨兵, sentinel.conf添加内容
# sentinel monitor <master-name> <ip> <port> <count>w
sentinel monitor myredis 127.0.0.1 6379 1
如果Master存在密码,需要配置sentinel auth-pass 服务器名 密码
sentinel auth-pass myredis 123456
daemonize yes
4、启动哨兵,在/usr/local/bin/文件夹下执行./redis-sentinel /usr/local/myredis/sentinel.conf命 令
四、Redis集群
1、redis集群简介
1.1 Redis集群(RedisCluster)
RedisCluster实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分布存储在这N个节点当中,每个节点存储总数据的1/N。
RedisCluster通过分区(partition)来提供一定程度的可用性(availability):即集群有一部分节点失效或者无法进行通讯,集群也可以继续处理命令。(当主节点挂掉的时候,开启redis哨兵模式,把子节点升为主节点,那ip就改变了,redis集群中当一部分节点挂掉,可以使用其他节点来处理命令)
Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,用来交换彼此的信息。
为了使得集群在一部分节点宕机或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作,
Redis 集群对节点使用了主从复制功能。
2、redis集群环境的搭建
1. 删除持久化数据,aof、rdb
2. 创建6个实例,即在/usr/local/bin/myredis文件夹下分别创建6379、6380、6381、6389、6390、6391的conf。
3. 在redis.conf中关闭appendonly
4. 在不同的conf文件中,配置对应的内容可以通过include /usr/local/myredis/redis.conf将公共基础配置直接引入文件。将include /usr/local/myredis/redis.conf统一添加到这三个文件中
在各个文件中,添加对应的pidfile、port、dbfilename、cluster-enabled(是否打开集群)、cluster-config-file(设定节点配置文件名)、cluster-node-timeout (设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换)
例如:
redis6379.conf中添加
# 引入公共配置文件
include /usr/local/myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
# 是否打开集群
cluster-enabled yes
# 设定节点配置文件名
cluster-config-file nodes-6379.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
5. 启动该6个redis,并确保是否全部生成nodes-xxxx.conf文件。(启动之前务必保证redis服务支持远程连接,redis.conf中 bind 0.0.0.0)
6. 进入redis安装目录下的src文件夹
7. 在/opt/redis-6.2.6/src文件夹下执行命令
redis-cli --cluster create --cluster-replicas 1 ip:6379
ip:6380 ip:6381 ip:6389 ip:6390 ip:6391
此处使用真实ip地址,-replicas 1代表采用最简单的方式配置集群,一台主机,一台从机。
replicas表示每个master需要有几个slave。
执行命令后,redis提供推荐的主从配置建议,执行同意。
集群创建成功。
8. 通过./redis-cli -c -p 6379可连接至集群(由于所有节点相通,任意端口号均可)
在redis客户端中执行cluster nodes查看节点状态。
3、每个节点存储的数据
一个 Redis 集群包含 16384 个哈希槽(hash slot),每个键都属于这 16384 个哈希槽的其中一个。
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key
的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个节点, 其中:
1. 节点 1 负责处理 0 号至 5500 号哈希槽。
2. 节点 2 负责处理 5501 号至 11000 号哈希槽。
3. 节点 3 负责处理 11001 号至 16384 号哈希槽。
3.1 命令执行
set k1 v1
根据k1计算出的槽值进行切换节点,并存入数据。
不在一个槽(slot)下的键值,是不能使用mget、mset等多建操作。
mset k1 v1 k2 v2 k3 v3 # 这样使用会报错
解决方法:
可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到同一个slot中
mset k1{test} v1 k2{test} v2 k3{test} v3
3.2 故障修复
1. 关闭6379服务器,进入redis-cli执行cluster nodes
6379服务器fail,6390成为了新的master
2. 重新启动6379服务器,再次查看,6379成为了Slave
五、redis分布式
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。
将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作
解锁:使用 del key 命令就能释放锁
解决死锁:
1)通过Redis中expire()给锁设定最大持有时间,如果超过,则Redis来帮我们释放锁。
2) 使用 setnx key “当前系统时间+锁持有的时间”和getset key “当前系统时间+锁持有的时间”组合的命令就可以实现。