八、删除与淘汰策略

删除策略

定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作

定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键

淘汰策略

6 种数据淘汰策略

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选 最近最少使用的数据淘汰

  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选 将要过期的数据淘汰

  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘 汰

  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  • no-enviction(驱逐):禁止驱逐数据

Redis 4.0 后新增2种内存淘汰策略

volatile-lfu(Redis 4.0 后新增的内存淘汰策略):从已设置过期时间的数据集,挑选最近最少使用的键值

allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值

LRU算法

传统LRU

基于最后一次访问时间淘汰最久未被使用的元素

传统 LRU 算法的实现是基于「链表」结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可,因为链表尾部的元素就代表最久未被使用的元素

存在问题:

  • 需要用链表管理所有的缓存数据,这会带来额外的空间开销;

  • 当有数据被访问时,需要在链表上把该数据移动到头端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能

Redis如何实现LRU

Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的最后一次访问时间

当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 (此值可配置)个值,然后淘汰最久没有使用的那个

优点:

  • 不用为所有的数据维护一个大链表,节省了空间占用;

  • 不用在每次数据访问时都移动链表项,提升了缓存的性能

存在问题:

无法解决缓存污染问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染

LFU算法

根据数据访问次数来淘汰最少被使用的数据的

核心思想是如果数据过去被访问多次,将来被访问的频率也更高

Redis如何实现LFU

实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的访问次数

对比删除策略

Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key

内存淘汰策略是解决内存使用过大的问题

posted @   上好佳28  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示