本文主要是介绍Redis 淘汰删除策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Redis 淘汰删除策略
目前,Redis采用的是惰性删除+定期删除的方案
1. 定时删除
在设置键过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作;
1.1 定时删除优劣
- 定时删除操作对于内存来说是友好的,内存不需要操作,而是通过使用定时器,可以保证尽快的将过期键删除;
- 对于CPU来说不是友好的,如果过期键比较多的话,起的定时器也会比较多,删除的这个操作会占用到CPU的资源;
2. 惰性删除
当key被操作时(如get,set)时,Redis 会被动检查该key是否过期, 如果key过期, 会触发惰性删除策略,直接删除掉这个过期key。
2.1 惰性删除的优劣
- 惰性操作对于CPU来说是友好的,
- key只有在程序读/写时,才判断是否过期删除掉,而且只会删除这一个过期键,但是对于内存来说是不友好的,如果多个键都已经过期了,而这些键又恰好没有被访问到,那么这部分的内存就都不会被释放出来;
3. 主动删除
由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key,Redis中通过Max Memory参数来设定内存的使用上限,当前已用内存超过Max Memory限定时,会触发主动删除策略。 目前Redis提供了8种的淘汰策略(默认的是noeviction),配置文件中的策略主要包含以下几种:
- volatile-lru(least recently used):最近最少使用算法,从设置了过期时间的键中选择空转时间最长的键值对清除掉;
- volatile-lfu(least frequently used):最近最不经常使用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉;
- volatile-ttl:从设置了过期时间的键中,选择过期时间最早的键值对清除;
- volatile-random:从设置了过期时间的键中,随机选择键进行清除;
- allkeys-lru:最近最少使用算法,从所有的键中选择空转时间最长的键值对清除;
- allkeys-lfu:最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除;
- allkeys-random:所有的键中,随机选择键进行删除;
- noeviction:不做任何的清理工作,在redis的内存超过限制之后,所有的写入操作都会返回错误;但是读操作都能正常的进行;
前缀为volatile-和allkeys-的区别在于二者选择要清除的键时的字典不同,volatile-前缀的策略代表从RedisDb中的expire字典中选择键进行清除;allkeys-开头的策略代表从dict字典中选择键进行清除。
4. 其他模块的淘汰处理
目前Redis提供了两种持久化方式,分别是RDB和AOF;
4.1 RDB 快照持久化
4.1.1创建
RDB是通过创建快照获取内存中的数据在某一个时间点上的数据的副本;有两个命令可以创建RDB文件,分别是SAVE
和BGSAVE
,两者的区别在于是否阻塞进程去创建RDB文件,这两个命令都不会将数据空间中的过期键给保存到RDB文件中;
4.1.2 载入
在启动Redis服务器时,如果服务器开启了RDB文件,那么服务器就会对RDB文件进行载入,需要注意的是:
-
如果当前服务器是
Master
,那么过期键将会被忽略,不会载入到主服务器中; -
如果当前服务器是
Slave
,文件中所有键(不管是否过期)都会被载入到从服务器中;
4.2 AOF 只追加持久化
4.2.1写入
数据库中的过期键没有被删除时,其不会对AOF文件有任何的影响;当过期键被删除以后,程序会向AOF文件追加一条DEL
命令,标记该键已经被删除;
4.2.2 重写
AOF是通过将执行的写命令添加到AOF文件的末尾,来记录数据的变化;为了避免文件被添加得越来越大,甚至有可能用完硬盘的所有空间,因此Redis提供了Rewrite
的优化策略,分别是REWRITEAOF
和BGREWRITEAOF
,两个命令的区别也是在于是否阻塞主进程,这两个命令都不会将数据空间中的过期键给保存到AOF文件中;
4.3 主从复模式下对过期键的处理
通常在主从模式下,主服务器来读取写命令,从服务器用来读取读命令,分担主服务器的压力,需要注意的是:
- 如果当前服务器是
Master
的话,当服务器通过策略得知某个键过期,则将该过期键给删除,并且同步给其他从服务器让它们删除掉该键; -
如果当前服务器是
Slave
的话,如果有命令读取当前过期键的话,不会惰性删除,因为这会影响读取的性能,因此不会删除,并且返回过期键对应的值;除非是Master
服务器同步告知Slave
服务器,需要删除过期键才会删除。
参考:
-
什么是LRU算法
-
什么是LFU算法
这篇关于Redis 淘汰删除策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!