持久化就是把数据保存在本地,重启也不会丢失数据。
设置怎么存储数据
RDB
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
redis在停机的时候会自动save,保存在运行目录,这样下次重启的时候就会加载上一次的数据。
Save 900 1 表示900秒内,如果至少有1个key被修改,则执行bgsave,如果是save”“则表示禁用RDB
Save 300 10 在300秒内至少有10次修改,则执行bgsave
RDB的其他配置也可以在redis.conf文件中设置:
Rdbcompression yes 是否压缩,建议不开启,压缩会消耗cpu,磁盘的话不值钱
RDB文件名称
Dbfilename dump.rdb
文件保存的路径目录
Dir ./
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。
当主进程执行读操作时,访问共享内存;执行写操作时,执行写操作。
设置怎么存储记录命令
AOF的命令记录的频率也可以通过redis.conf文件来配
Appendfsync always 表示每执行一次写命令,立即记录到AOF文件
Appendfsync everysec 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
Appendfsync no 写命令执行完先放入AOF缓冲区,由系统决定何时将缓冲区内容写回磁盘
AOF因为是记录命令,AOF文件会比RDb文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
Auto-aof-rewrit-percentage 100 AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof- rewrite-min-size 64mb。AOF文件体积最小多大以上才触发重写
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。
搭建主从架构
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
单节点的Redis的并发能力不够,要提升Redis的并发能力,就要搭建主从集群,实现读写分离。
Redis的集群是由1个master和多个slave组成的,写操作是访问master,读操作是访问slave
在同一台虚拟机开启3个redis实例,模拟主从集群,信息如下:
每个master都可以有多个slave节点
master之间通过ping监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会被转发到正确节点
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:
key中包含“{}”,且“{}”中至少包含1个字符,“{}”中的部分是有效部分
key中不包含“{}”,整个key都是有效部分
例如:key是num,那么就根据num计算,如果是itcast num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
Redis如何判断某个key应该在哪个实例?
将16384个插槽分配到不同的实例
根据key的有效部分计算哈希值,对16384取余
余数作为插槽,寻找插座所在实例即可
如何将同一类数据固定地保存在同一个Redis实例?
这一类数据使用相同的有效部分,例如key都以{typeId}为前缀
故障转移
当集群中有一个master宕机会发生什么呢?
1、首先是该实例与其它实例失去连接
2、然后是疑似宕机
3、最后是确定下线,自动提升一个slave为新的master
数据迁移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:
集群伸缩:就是添加或者移除节点
单点Redis的问题:
1、数据丢失问题
实现Redis数据持久化
2、并发能力问题
单节点Redis并发能力虽然不错,但也无法满足如618这样的高并发场景
搭建主从集群,实现读写分离
3、故障恢复问题
如果Redis宕机,则服务不可用,需要一种自动的故障恢复手段
利用Redis哨兵,实现健康检测和自动恢复
4、存储能力问题
Redis基于内存,单节点能存储的数据量难以满足海量数据需求
搭建分片集群,利用插槽机制实现动态扩容
RDB
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
快照文件称为RDB文件,默认是保存在当前运行目录
Save 和 bgsave都是把内存中的所有数据记录到磁盘中。它们的区别在于,save由Redis主进程来执行RDB,会阻塞所有命令;而bgsave是开启子进程执行RDB,主进程不受影响。
按control+c 退出redis,我们可以看到控制台,它是会先保存然后再退出的。
RDB
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。
fork采用的是copy-on-write技术
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
RDB方式bgsave的基本流程?
fork主进程得到一个子进程,共享内存空间
子进程读取内存数据并写入新的RDB文件
用新RDB文件替换旧的RDB文件。
RDB会在什么时候执行?save 60 1000代表什么含义?
默认是服务停止时
代表60秒内至少执行1000次修改则触发RDB
RDB的缺点?
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。
AOF相当于操作日志。
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF
搭建主从架构
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。