目录
- redis安装与登录
- redis 持久化
- RDB(Redis DataBase)
- AOF(Append Only File)
- RDB-AOF混合持久
- 纯缓存模式
- redis 的 key
- redis 的数据类型和常见应用场景
- String
- List
- HashMap
- Set集合
- ZSet有序集合
- bitmap位图
- HyperLogLog基数统计
- GEO 地理空间
- Stream 流
- bitfiled
- redis 事务
- 事务的正常执行的情况
- 事务放弃的情况
- EXEC之前发生异常
- EXEC之后发生异常
- 使用 WATCH/UNWATCH
- redis 管道
- redis高可用
- redis 复制(replica)
- 主从都有的配置(修改配置文件,开放port为6379的redis为例)
- 主库的配置(测试环境设定开放端口为6379的redis为主库)
- 从库的配置
- 启动一主二从
- 主从的日志观察
- 查询主从的信息(`info replication`)
- 常见问题
- 主从传递
- 从库升级为主库
- 主从复制的缺陷
- redis 哨兵(sentinel)
- redis 主从搭建
- 哨兵的搭建
- 哨兵的配置文件
- 主观下线和客观下线
- 哨兵节点的启动
- 发生主从节点切换
- redis 集群(cluster,AP)
- redis 集群的 slot 槽
- 为什么 redis 集群的最大槽数 16384 个?
- slot 槽位映射的三种常见方法
- Hash取余
- 一致性Hash算法
- Hash槽分区
- 三主三从 redis 集群搭建
- redis 集群 读写
- 主从容错切换(自动故障转移)
- 主从动态扩容
- 主从动态缩容
- 集群常用指令总结
redis安装与登录
- 默认安装目录:usr/local/bin
- 在redis存放的目录,备份原系统的 redis.conf,新建一个 redis.conf
- 修改配置文件内容如下
1 默认daemonize no 改为 daemonize yes
2 默认protected-mode yes 改为 protected-mode no
3 默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能本机访问),否则影响远程IP连接
4 添加redis密码 改为 requirepass 你自己设置的密码
-
启动redis,并登录
- 在安装目录:usr/local/bin下执行
redis-server 自定义配置文件的路径
启动redis服务 - 默认的redis服务端口是6379(可改)
- 紧接着输入
redis-cli -a 配置文件中设置的requirepass的值
orredis-cli -a 配置文件中设置的requirepass的值 -p redis端口号
- 中文乱码问题,只需要在上面的登录指令后面加上
--raw
- 在安装目录:usr/local/bin下执行
-
退出登录
- 退出从客户端
quit
后,可以关闭redis服务redis-cli -a requirepass 的值 shutdown
orredis-cli -p 6379 shutdown
- 或者直接在客户端输入
shutdown
,然后再退出quit
- 退出从客户端
redis 持久化
RDB(Redis DataBase)
-
什么是RDB
- 在指定的条件下对redis中的所有键值对数据以快照的形式保存到磁盘中,形成dunmp.rdb文件
-
启动/关闭RDB:修改配置文件 redis.conf 根据配置文件中提示(配置文件中的SNAPSHOTTING模块)修改
- 关闭:
save “”
or 登录redis客户端reids-cli config set save ""
- 启动:
save 60 1000
只要60s内,有超过1000个key发生改变,则开始产生快照
- 关闭:
-
RDB 其它配置项
dbfilename
生成的 rdb 文件的名字dir
生成的rdb文件的存放目录stop-writes-on-bgsave-error yes/no
用于保证数据一致性,当备份过程中出现问题是否停止写入,默认是yesrdbcompressiong yes/no
rdb文件的压缩存储,默认为开启yesrdbchecksum yes/no
存储快照后是否用CRC64算法来进行数据校验,默认开启yesrdb-del-sync-files
在没有持久性的情况下删除主从复制中使用的RDB文件启用。默认情况下no,此选项是禁用的
-
触发RDB的情况
-
关于
save/bgsave
命令save
不建议使用
bgsave
命令(默认)
-
RDB优势
-
RDB 劣势(数据丢失)
-
修复RDB文件
redis-check-rdb rdb文件命
AOF(Append Only File)
- AOF 的工作流程
- 三种写回策略对比(推荐使用Everysec)
- AOF的配置(配置文件的APPEND ONLY MODE模块中)
- 启动配置
appendonly yes
,默认是关闭no - 写回策略配置
appendfsync everysec
,默认是每秒 - AOF 重写机制设置,改变如图所示三项
.aof
文件的保存目录 = rdb 的保存目录(dir
) /自定义的.aof
文件目录(appenddirname "xxxxx"
)- 设置
.aof
文件的保存文件名- redis 6 及之前的
.aof
文件只有一个 - redis 7 及之后的
.aof
文件有3个 appendfilename "appendonly.aof"
配置的是.aof
文件的前缀,后面还要跟redis 设置的有关序列和类型的附加信息- 关于 序列 涉及到 AOF 的重写机制,重写就是当一个
.aof
文件太大时,需要执行的操作
- redis 6 及之前的
- 启动配置
- AOF 的重写机制
!- 重写过程展示
- 重写过程展示
- AOF 的紧急恢复
- AOF 记录的都是写指令,所以当不小心使用了
flushdb
,只要 AOF 文件没有发生重写,就可以通过手动删除 AOF 文件中的flushdb
,然后重启redis 服务就能恢复数据 - AOF 文件的修复
redis-check-aof --fix 增量AOF文件名
- AOF 记录的都是写指令,所以当不小心使用了
- AOF总结
RDB-AOF混合持久
纯缓存模式
- 同时关闭 RDB、AOF
redis 的 key
redis 的数据类型和常见应用场景
String
List
- 当涉及到范围时,起始为0,终止是-1时,表示整个 list 范围
HashMap
Set集合
ZSet有序集合
bitmap位图
HyperLogLog基数统计
GEO 地理空间
Stream 流
bitfiled
redis 事务
- 一个事务中的所有指令,都会先加入一个队列,然后执行事务的时候,再依次取出顺序执行
- redis 命令执行是单线程架构
- redis 事务以
MULTI
开始,以DISCARD/EXEC
结束,然后才是 redis 服务器执行事务中的指令
事务的正常执行的情况
事务放弃的情况
EXEC之前发生异常
EXEC之后发生异常
使用 WATCH/UNWATCH
redis 管道
- 管道 专注于 批量执行 一组指令,但是不是事务,因为redis 命令执行是单线程架构,中间 redis 线程可以去处理其它请求,意味着这一组指令执行过程中可以被中途插入执行其它指令
redis高可用
redis 复制(replica)
主从都有的配置(修改配置文件,开放port为6379的redis为例)
- 开启
daemonize
- 注释掉
bind
,或改成bind 0.0.0.0
- 指定端口
port
,不同机器,指定的端口不同
- 指定工作目录(RDB文件存放目录)
dir
,配置文件和myredis目录都在redis存放目录
- pid文件
pidfile
- 日志文件存放目录(用于排查问题)
logfile
,日志文件、配置文件和myredis目录都在redis存放目录
- rdb文件的名字
dbfilename
,rdb文件存放在myredis目录中,二者又都在redis存放目录
- 关闭保护模式
protected-mode
- 开启aof可选(因为已经有主从复制了)
主库的配置(测试环境设定开放端口为6379的redis为主库)
- 添加密码
从库的配置
- 从库访问主库的同行密码
masterauth
,值为主库的 requirepass 的值
- 告诉从库需要跟随的主库地址和端口
- 通过配置文件这种方式就算从库重启也依然有效
- 通过指令的形式(先启动后,再指定)
slaveof 主库IP 主库端口号
,这种方式可用于更换(更换后前一个主库的数据会被清除)或指定主库,但是从库重启后需要重新设定
- 通过配置文件这种方式就算从库重启也依然有效
启动一主二从
- 注意:需要提前设置防火墙开放对应的端口,保证三台机器之间能够
ping
通 - 从库登录redis客户端时,需要指定端口号(虽然配置文件已经修改了端口号,redis 的默认端口号是6379)
- 从库的密码,可以和主库不一样,这里懒得设置,就都一样了
主从的日志观察
- 主库日志上看从库的信息
- 在从库日志上看主库的信息
查询主从的信息(info replication
)
- 主库上查询
- 从库上查询
常见问题
- 从机不可以执行写命令
- 不管从库连上主库的时间是什么什么时候,都遵循以下规律
- 不管主库因为何原因shutdown,主从关系都会一直保持,从库的数据可以正常访问
主从传递
从库升级为主库
- 修改从库配置文件,注释掉
replicaof
后重启,如果是通过注释实现主从关联的,直接重启 - 通过指令
slaveof no one
,使当前从库停止与其他数据库的同步,转成主数据库
主从复制的缺陷
- 默认情况下,主节点出现问题,不会在slave节点中重新选一个master节点,需要人工干预
redis 哨兵(sentinel)
redis 主从搭建
- 参照 redis 复制,唯一需要改动的是原来主库的配置文件
哨兵的搭建
- 哨兵节点数,一般三台足够
- 哨兵节点虽然也是 redis,但是只负责监控等功能,不存放数据
- 可以同时监控多个主节点,如下图所示(来源官网)
哨兵的配置文件
- 在 redis 的存放目录,按照惯例,复制一份到同目录的/myredis,保留原样的配置文件
- 参数的配置,参照 redis 复制中的 主从都有的配置,哨兵节点的port默认为26397,以下为专属哨兵节点的配置内容
- 以下的配置项脚本相关可以不用理会
主观下线和客观下线
哨兵节点的启动
- 配置文件名,也说明了它们各自配置的端口
发生主从节点切换
- 兵王日志内容展示,其它哨兵日志内容相同
- 完成新的主节点切换后,可以发现哨兵节点、原来的主从节点配置文件均发生了变化
- 哨兵节点的配置文件中,监控的节点改成了新的主节点
- 新的主节点配置文件中,新增了改变为主节点的配置
- 旧的主节点配置文件中,原来的主节点配置被去掉,新增从节点的配置
redis 集群(cluster,AP)
redis 集群的 slot 槽
为什么 redis 集群的最大槽数 16384 个?
- CRC16算法产生的hash值有16bit,该算法可以产生2^16=65536个值
slot 槽位映射的三种常见方法
Hash取余
一致性Hash算法
Hash槽分区
三主三从 redis 集群搭建
- 修改配置文件,一共六个,都参照 redis 复制 中的主从都有的配置修改(注意配分原来的配置文件)
- 为每一个配置文件新增如下修改,配置文件名随意,最好是有规律,node-redis端口号.conf 下面的步骤执行成功后会自动在每个 redis 实例的工作目录中生成(设置的rdb目录)
- 为每一个配置文件新增如下修改,配置文件名随意,最好是有规律,node-redis端口号.conf 下面的步骤执行成功后会自动在每个 redis 实例的工作目录中生成(设置的rdb目录)
- 启动6台 redis 实例
redis-server /redis存放目录/自定义目录/redisCluster+端口号.conf
,在每台redis实例执行对应的指令
- 构建三主三从
- 在 需要搭建 redis 集群中的任意一个服务器上输入
redis-cli -a 密码 --cluster create --cluster-replicas 1 IP1:端口1 IP2:端口2 IP3:端口3 IP4:端口4 IP5:端口5 IP6:端口6
--cluster-replicas 1
表示为每个主节点创建一个从节点- 一共6个IP+端口号,模拟6个 redis 服务
- 在 需要搭建 redis 集群中的任意一个服务器上输入
- 以其中一台 redis 实列为切入点 登录,查看 集群状态
-
登录
redis-cli -a 密码 -p redis端口号 -c
,加上-c
是为了让 redis 执行指令时,自动路由到对应的 slot 槽,不加的话,在当前 redis 实例 执行了 写入 了不属于 当前 redis 实例 对应 slot 槽分区 的键值对时会报错
-
查看集群状态和信息
cluster nodes
,显示所有 redis 实例的 ID信息和从属关系
-
redis 集群 读写
- 查看集群中某个 key 的 slot 槽位值
CLUSTER KEYSLOT key名
主从容错切换(自动故障转移)
- 自动进行,主库挂了,从库自动成为主库,旧的主库恢复后,自动成为新主库的从库
- 节点从属调整(手动故障转移):原来的主库因为 redis 集群自动 容错切换(自动故障转移),导致从属关系发生了改变,可以登录原来的主库(现在的从库),执行指令
cluster failover
,回复原来的从属关系
主从动态扩容
- 对新加入的两台 redis 实例 修改配置文件,参照 集群中的其它 redis 实例配置
- 启动新加入的两台 reids 实例,暂时不构建从属关系,此时它们都是主库,启动指令参照 集群中的其它 redis 实例
- 输入指令
redis-cli -a 密码 --cluster add-node 新加入redis实例的IP:端口号 集群中任意一个redis实例的IP:端口号
,为集群新加入一个主节点
- 通过随意一个 redis 实例 执行指令
redis-cli -a 密码 --cluster check 集群中任意一个redis实例的IP:端口号
查看 集群中 slot 槽的分配情况
- 重新分派槽号
redis-cli -a 密码 --cluster reshard 新添加的redis实例的IP地址:端口号
,集群中 其它 redis 实例 会匀出适当数量的 slot 槽给新加入的 redis 实例
- 为新的主节点添加子节点
redis-cli -a 密码 --cluster add-node 新Slave的IP:端口 新master的IP:端口 --cluster-slave --cluster-master-id 新master的ID
主从动态缩容
- 先获取要下线的 redis 从节点 的 ID
redis-cli -a 密码 --cluster check 192.168.111.174:6388
- 删除要下显得从节点
redis-cli -a 111111 --cluster del-node 192.168.111.174:6388 218e7b8b4f81be54ff173e4776b4f4faaf7c13da
- 将已经删掉的从节点的 主节点 的 slot 槽 清空(转给集群中其它主节点)
redis-cli -a 111111 --cluster reshard 192.168.111.175:6381
,指令中 redis 实例的IP和端口号可以是集群中任意一个 redis 实例 的IP和端口,主要目的是执行如下如所示的 reshard,按照提示进行即可
- 清空 要删除的 主节点的 redis 实例 的 slot 槽以后,直接执行指令
redis-cli -a 111111 --cluster del-node 192.168.111.174:6387 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
删除该主节点
集群常用指令总结
redis-cli -a 密码 --cluster check 192.168.111.174:6388
通过集群的任意一个 redis 实例查看集群所有 redis 的ID、分配的 slot 槽等信息、从属关系cluster nodes
查看集群所有 redis 的ID、从属关系cluster info