redis内存回收

74 阅读1分钟

一.过期删除策略

1.redis怎么知道一个数据有没有过期

redis的数据库结构中会有一个dict expires(他的key存放的是数据的key,但是值存放的过期时间),用来记录过期时间。

image.png

2.是不是TTL到期了就立即删除?

惰性删除:当访问到数据的时候再判断是否到期,到期了就进行删除。

周期删除:服务器初始化的时候可以设置,开启一个定时任务或在每个事件循环前,定时抽样的删除部分过期的key,然后执行删除,删除方式有两种

1.开启定时任务serveCron(),按照sever.hz的频率执行key删除,模式为SLOW(低频多删)

2.在每个事件循环前会调用beforSleep()函数,执行key删除,模式为FAST(高频少删)

二.内存淘汰策略(maxmemory-policy noeviction)

当redis内存使用达到了设置的内存阈值,redis就会主动去删除部分key释放内存,redis会调用processCommand()方法进行内存淘汰

1.noeviction-不删除,不允许写入-报错

2.volatile-ttl,对设置ttl的key,删除ttl小的部分key


3.allkeys-random,对全体key,随机删除

4.volatile-random,对设置了ttl,随即删除


LRU,最近最少使用

5.allkeys-lru,对全体key,基于lru算法进行删除

6.volatile-lru,对设置了ttl,基于lru算法进行删除


LFU,最少频率使用(频率相同的情况下删除最远使用的那个)

7.allkeys-lfu,对全体key,基于lfu算法进行删除

8.volatile-lfu,对设置了ttl,基于lfu算法进行删除