RDB
: Redis DataBase,将某一时刻的内存闪照,以二进制的方式写入磁盘
手动触发
:自动触发
:1.整个redis数据库将只包含一个文件dump.rdb,方便持久化
2.方便备份
3.性能最大化,会fork一个子进程进行写操作,让主线程继续处理命令,所以使IO最大化。
4.数据集大的时候,比AOF的启动效率更高
1.数据安全性低,RDB使间隔一段时间进行持久化,如果持久化之间redis发生了故障,会发生数据丢失
2.由于RDB使通过for子进程来协助完成数据持久化工作,因此,如果数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。会占用cpu
AOF
: Append Only File 以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录,调操作系统命令进程刷盘
1.所有的写命令会追加到AOF缓冲区
2.AOF缓冲区根据对应的策略向硬盘进行同步操作
3.随着AOF文件越来越大,需要定期对AOF文件进行重写
3.当Redis重启时,可以加载AOF文件进行数据恢复
同步策略:
每秒同步:异步完成,效率非常高,一旦出现宕机现象,那么这一秒钟之内修改的数据将会丢失
每修改同步:同步持久化,每次发生的数据变化都会被立即记录到磁盘中,最多丢失一条
不同步:由操作系统控制,可能丢失较多数据
1.数据安全
2.通过append模式写文件,即使中途服务器宕机也不会破坏已经存在的内容,可以通过 redis-check-aof工具解决数据一致性问题
3.AOF机制的rewrite模式。定期对AOF文件进行重写,以达到压缩的目的
1.AOF文件比RDB文件大,且恢复速度慢
2.数据集大的时候,比RDB启动效率低
3.运行效率没有RDB高
惰性过期
:只有访问的时候,才会判断该key是否已过期,过期则清除。好处是可以最大化节省CPU资源,对内存不友好
定期过期
:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。这个好处是使CPU和内存资源达到最优的平衡效果
Redis同时使用了惰性过期和定期过期
1.先更新mysql,再更新Redis,如果更新Redis失败,可能仍然不一致
2.先删除Redis缓存数据,再更新Mysql,再次查询的时候再将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发下性能较低,而且仍然会出现数据不一致的问题。
3.延时双删。先删除redis缓存数据,再更新mysql,延迟几百毫秒再删除redis缓存数据,这样就算在更新mysql时,有其他线程读了Mysql,把老数据读到了Redis中,那么也会被删除掉,从而保持数据一致性。
redis采用的sentinel进行集群处理的。