当有 key 设置了过期时间,就会有删除策略
-
定时删除
以 cpu 定时执行的方式换 Redis 内存(因为会使用轮询的方式一直耗用 cpu 资源),及时性不高,但是内存不会浪费
-
惰性删除
在 get 的时候,先判断 key 是否会过期,如果过期了,会进行删除,会导致有大量的垃圾数据占用内存空间(因为过期的数据在没有进行 get 时,就会一直存在)
-
定期删除
hz 10
-
每次执行会一次执行:
serverCron() --> databaseCron() --> activeExpireCyle()
三个函数
-
activeExpireCyle() 对每个 expires[*] (过期库,* 代表对应的数据库,一共 0~15 个,每一个过期库都会和 Redis 的数据库对应)进行逐一检查,每次执行 250ms/hz,默认情况就是 25ms
current_db 用于记录 activeExpireCyle() 进入哪一个 expire[ * ] 执行,如果时间到了,那么下次根据 current_db 继续执行
Redis 淘汰策略
当 Redis 内存满了,在进行 set 的时候,就会触发淘汰策略
-
逐出算法
LRU(Least recently used):最近最少使用,针对时间
LFU(Least frequently used):最近最不频繁使用,针对访问次数
-
maxmemory:最大可使用内存,占用物理内存的比例,默认为 0,表示不限制,生产环境一般根据需求设置,通常在 50 以上
-
maxmemory-policy:达到最大内存后,对挑选出来的数据进行删除策略(volatile:针对过期数据的策略,allkeys:针对所有数据的策略)
-
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最长时间没有使用的数据(推荐)
-
allkeys-lru:从数据集(server.db[i].dict)中挑选最长时间没有使用的数据淘汰
-
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰(推荐)
-
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最近使用次数最少的数据淘汰
-
allkeys-lfu:从数据集(server.db[i].dict)中挑选最近使用次数最少的数据淘汰
-
allkeys-random:从数据集(server.db[i].dict)中随机挑选数据淘汰
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。