一、持久化策略
1.基本概念
Redis的数据是存在内存中的,若redis宕机,数据就会全部丢失
(1)RDB快照,是一次全量备份,快照是内存数据的二进制序列化形式,存储上非常紧凑;
(2)AOF日志,是连续的增量备份,AOF日志记录的是内存数据修改的指令记录文本,当数据库重启时要加载AOF日志进行指令重放,所以需要定期进行AOF重写,对日志进行瘦身。
2.怎么进行备份的
(1)RDB通过Redis主进程fork子进程,让子进程执行磁盘 IO 操作来进行 RDB 持久化,记录的是数据;
(2)AOF日志只记录对内存进行修改的指令记录,记录的是指令。
3.要选择哪种策略?
(1)只用RDB: RDB是隔一段时间进行备份,容易丢失很多数据;
(2)只用AOF: AOF没有RDB恢复快且恢复复杂;
(3)Redis4.0使用混合持久化:将RDB文件的内容和增量的AOF日志保存在一起。增量日志指:自持久化开始到持久化结束的这段时间发生的增量 AOF 日志。当在redis重启时,先加载 rdb 的内容,然后再重放增量 AOF 日志。替代之前的 AOF 全量文件重放。
二、内存淘汰策略
1.noeviction :默认淘汰策略,不淘汰,如果内存已满,添加数据是报错。//eviction逐出
2.allkeys-lru:在所有键中,选取最近最少使用的数据抛弃。
3.volatile-lru:在设置了过期时间的所有键中,选取最近最少使用的数据抛弃。//Least Recently Used
4.allkeys-random: 在所有键中,随机抛弃。
5.volatile-random: 在设置了过期时间的所有键,随机抛弃。//volatile不稳定,易变的
6.volatile-ttl:在设置了过期时间的所有键,抛弃存活时间最短的数据。//time to live 生存时间
三、定期策略
1.定期删除:Redis会将每个设置过期时间的key放入到一个独立的字典,其会定期遍历这个字典来删除到期的key。
2.定期删除策略(集中处理)
(1)默认每秒进行10次过期扫描(100ms一次),这种过期扫描采用了一种简单的贪心策略,并不会遍历过期字典中所有的key。
从过期字典中随机 20 个 key;
删除这 20 个 key 中已经过期的 key;
如果过期的 key 比率超过 1/4,那就重复步骤 1;
3.惰性删除(零散处理)
是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除,不会给你返回任何东西。
4.为什么采用定期删除+惰性删除的策略?
(1)只采用定期删除,会导致很多过期的key并没有被删掉。
假设redis里放了10万个key,都设置了过期时间,你每隔几百毫秒,就检查10万个key,那redis基本上就死了,cpu负载会很高的,消耗在你的检查过期key上了。
(2)另外采用惰性删除,保证过期的key一定会被删除。
在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。