Redis过期策略和淘汰策略

1 过期删除策略

1.1 定时删除

当对一个key设置了过期时间,当该时间到,立即执行对该key的删除。

优点:定时删除对内存最友好,保证key一旦过期就能立即从内存中删除。

缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响。

1.2 惰性删除

当一个key被设置过期时间后,当key的过期时间到了,并不会立即从内存中删除;在我们使用该key时,先检查其是否过期,过期则将其从内存中删除。

优点:对CPU友好、只在使用的时候才会进行过期检查,对于没用到的key不会浪费时间进行过期检查。

缺点:对内存不好用,key过期了,却一直没被使用,就会一直占这内存。如果数据库中存在很多过期键不被使用,便永远不会被被删除,内存不会被释放,从而造成内存泄漏。

1.3 定期删除

每隔一段时间(该时间段可设置),随机抽取一些设置了过期时间的key进行检查,删除里面过期的键。

在Redis的配置文件redis.conf中有一个属性"hz",默认为10,表示1s执行10次定期删除,即每隔100ms执行一次,可以修改这个配置值。

随机抽取,抽取多少?

同样是由redis.conf文件中的maxmemory-samples属性决定的,默认为5。

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。

   如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。

   如果执行的频率小,就和惰性删除一样了,过期键占用的内存不会及时得到释放。

另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

2 Redis过期删除策略

redis过期删除策略:惰性删除定期删除

3 内存淘汰策略

内存淘汰机制能保证在redis内存占用过高的时候,去进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高,那么它会淘汰哪些key呢?Redis目前共提供了8种内存淘汰策略,含Redis 4.0版本之后又新增的两种LFU模式:volatile-lfu和allkeys-lfu。

LRU:最近最久未使用

LFU:最近最少使用

no-eviction 当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据,一般不采用。
allkeys-lru 当内存不足以容纳新写入数据时,移除最近最少使用的key,这个是最常用的
allkeys-random 当内存不足以容纳新写入的数据时,随机移除key
allkeys-lfu 当内存不足以容纳新写入数据时,移除最不经常(最少)使用的key
volatile-lru 当内存不足以容纳新写入数据时,在设置了过期时间的key中,移除最近最少使用的key
volatile-random 内存不足以容纳新写入数据时,在设置了过期时间的key中,随机移除某个key 
volatile-lfu 当内存不足以容纳新写入数据时,在设置了过期时间的key中,移除最不经常(最少)使用的key 
volatile-ttl 当内存不足以容纳新写入数据时,在设置了过期时间的key中,优先移除过期时间最早(剩余存活时间最短)的key

※ 什么时候会执行内存淘汰策略,内存占用率过高的标准是什么?

    redis.conf配置文件中的 maxmemory 属性限定了 Redis 最大内存使用量,当占用内存大于maxmemory的配置值时会执行内存淘汰策略。

※ 内存淘汰策略的配置

    内存淘汰机制由redis.conf配置文件中的maxmemory-policy属性设置,没有配置时默认为no-eviction模式。

※ 淘汰策略的执行过程

    > 客户端执行一条命令,导致Redis需要增加数据(比如set key value);

    > Redis会检查内存使用情况,如果内存使用超过 maxmemory,就会按照配置的置换策略maxmemory-policy删除一些key;

    > 再执行新的数据的set操作;
 


 

你可能感兴趣的:(redis)