Redis中数据的过期策略与淘汰策略

335次阅读
没有评论

共计 1626 个字符,预计需要花费 5 分钟才能阅读完成。

内容目录

Redis 的数据过期策略与淘汰策略

一、数据过期策略

 Redis 对数据设置的有效时间,数据过期后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略)。

 在 Redis 中提供了两种处理过期数据的策略,分别是:惰性删除定期删除

惰性删除

 惰性删除是指:设置数据 Key 的过期时间后,我们不去管它,当需要该 Key 时,我们再检查这个 Key 是否过期,如果过期,就删掉该 Key,反之返回该 Key

 这种策略对 CPU 友好,只会在使用该 Key 时才会进行过期检查,对于很多用不到的 Key 不用浪费时间进行过期检查;但缺点是:对内存不友好,如果一个 Key 已经过期,但后面一直没用使用,则该 Key 会一直存在内存中,内存永远不会被释放掉

定期删除

 定期删除是指:每隔一段时间,我们就对一些 Key 进行检查,删除里面过期的 Key

 这种策略有在 Redis 中有两种模式,分别是:Slow模式Fast模式

  • Slow模式Slow 模式是定时任务,执行频率默认为 10hz,每次不超过 25ms,以通过修改配置文件redis.conf的 hz 选项来调整这个次数.
  • Fast模式执行频率不固定,但两次间隔不低于 2ms,每次耗时不超过 1ms.

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

Redis 中的删除策略是:惰性删除 + 定期删除两种策略配合使用。

二、淘汰策略

当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 Key,那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略

 在 Redis 中,提供了 8 种策略来选择要删除的 key 进行删除,详情可参考官方文档:https://redis.io/docs/reference/eviction

  • noeviction:不淘汰任何 Key,当内存不够用时,不允许写入任何新 Key。这是 Redis 的默认策略
  • allkeys-lru:针对所有 Key,采用 LRU 算法进行淘汰。
  • allkeys-lfu:针对所有 Key,采用 LFU 算法进行淘汰。
  • volatile-lru:针对所有设置了过期时间的 Key,采用 LRU 算法进行淘汰。
  • volatile-lfu:针对所有设置了过期时间的 Key,采用 LFU 算法进行淘汰。
  • allkeys-random:针对所有 Key,采用随机策略进行淘汰。
  • volatile-random:针对设置了过期时间的 Key,采用随机策略进行淘汰。
  • volatile-ttl:针对所有设置了过期时间的 Key,越快过期了,就淘汰谁。

LRU 算法和 LFU 算法

 1. LRU (Least Recently Used): 最近最少使用。用当前时间减去最后一次访问的时间,这个值越大,则淘汰的优先级越高。

Key1 在 3s 前访问过,Key2 在 9s 前访问过,则 Key2 倍删除。

 2. LFU (Least Frequently Used): 最少频率使用。统计每个 Key 的访问频率,访问频率越低,淘汰的优先级越高。

Key1 在 3s 内访问过 10 次,Key2 在 3s 内访问过 15 次,则 Key1 倍删除。

使用场景

  • 优先使用allkeys-lru策略。将最近最常访问的数据留在缓存中。当业务中有明显的冷热数据区分,可以使用该策略将热点数据保留在 Redis 中。
  • 若业务中没用明显的冷热数据区分,数据的访问频率也相差不大,则使用allkeys-random,对数据进行随机淘汰。
  • 若业务中有置顶的需求,可以使用volatile-lru策略,同时置顶数据不设置过期时间,则这些数据就可以一直不被删除,会淘汰其它设置了过期时间的数据。
  • 若业务中有短时高频访问的数据,可以使用allkeys-lfuvolatile-lfu策略,根据 LFU 算法,会将某个时间段内访问频率高的数据留在 Redis 中。
正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2024-01-30发表,共计1626字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
以太坊网站导航

以太坊网站导航

以太坊网站导航