Redis对于过期键有三种清除策略:
持久化策略(内存到磁盘上):RDB(全部选中的数据进行全量备份)、AOF日志记录修改指令(增量备份针对上一次选中的数据)两种方案
内存淘汰策略:noeviction–默认策略,不删除数据 allkeys-lru–所有key中,删除最近最少使用的数据 volatile-lru–设置过期时间的所有key中,选取最近最少使用的数据删除 volatile-random–在所有key中,随机删除设置过期时间key的数据 volatile-ttl–设置过期时间key中,删除存活时间最短的数据
过期(定期)策略:定期删除(过期key放入独立字典中,定期删除字典数据)、定期删除策略(定期删除)、惰性删除(过期了,删除,不返回任何数据)
==============================================
被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
当前已用内存超过maxmemory限定时,触发主动清理策略
被动删除
只有key被操作时(如GET),REDIS才会被动检查该key是否过期,如果过期则删除之并且返回NIL。
1、这种删除策略对CPU是友好的,删除操作只有在不得不的情况下才会进行,不会对其他的expire key上浪费无谓的CPU时间。
2、但是这种策略对内存不友好,一个key已经过期,但是在它被操作之前不会被删除,仍然占据内存空间。如果有大量的过期键存在但是又很少被访问到,那会造成大量的内存空间浪费。expireIfNeeded(redisDb *db, robj *key)函数位于src/db.c。
但仅是这样是不够的,因为可能存在一些key永远不会被再次访问到,这些设置了过期时间的key也是需要在过期后被删除的,我们甚至可以将这种情况看作是一种内存泄露—-无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不

Redis过期键清除包括持久化策略、内存淘汰策略和过期策略。持久化策略有RDB全量备份和AOF日志增量备份。内存淘汰策略包括noeviction、allkeys-lru、volatile-lru、volatile-random、volatile-ttl。过期策略包含定期删除和惰性删除。Redis会通过serverCron主动删除和被动删除过期键,以防止内存浪费。在达到maxmemory时,根据maxmemory-policy进行内存清理。
最低0.47元/天 解锁文章
2058

被折叠的 条评论
为什么被折叠?



