Redis的数据淘汰策略——Java全栈知识(19)

Redis的数据淘汰策略

什么是数据淘汰策略

数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候,

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

redis 的内存删除策略有:

·noeviction: 不会淘汰任何键值对,而是直接返回错误信息。

·allkeys-lru: 从所有 key 中选择最近最少使用的那个 key 并删除。

·volatile-lru: 从设置了过期时间的 key 中选择最近最少使用的那个 key 并删除。

·allkeys-random: 从所有 key 中随机选择一个 key 并删除。

·volatile-random: 从设置了过期时间的 key 中随机选择一个 key 并删除。

·volatile-ttl: 从设置了过期时间的 key 中选择剩余时间最短的 key 并删除。

·volatile-lfu: 淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。

·allkeys-lfu: 淘汰的对象则是所有键值对中,访问频该最低的那个。

大概可以分为几类分别是:LRU,LFU,random 等。

Random 没什么好说的随机就是了。接下来详细谈一下 LRU 和 LFU 算法。

LRU 算法

LRU 算法的思想是:如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。

因此,当空间满时,最久没有访问的数据最先被淘汰。

算法的流程是以一个链表实现:

  1. 当我们新插入缓存中的数据添加到链表的头部。
  2. 当我们使用的缓存也放到链表的头部。
  3. 当内存不足需要 Redis 内存淘汰的时候,淘汰链表尾部的缓存(最近访问最少的)即可。

LFU 算法

LFU (Least Frequently Used, 最近最不常用)

顾名思义,LFU 算法的思想是:如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。

LFU 的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排

序。

算法流程:

  1. 当我们新添加的缓存计数为 1 然后添加到队列尾部(按照计数排序)
  2. 每使用一次的数据计数+1
  3. 淘汰队列最后的元素。

推荐使用的方案

Redis 中默认使用的是:noeviction,也就是当内存满的时候不添加新的元素,不删除元素,新添加的元素报错。

当然这不是最优解,上述我们介绍了两种淘汰算法:

  • 当 Redis 作为缓存使用的时候,推荐使用 allkeys-lru 淘汰策略。该策略会将最近最少使用的 Key 淘汰。默认情况下,选择最近最少使用的那个 key 并删除。
  • 当 Redis 作为半缓存半持久化使用时,可以使用 volatile-ru。但因为 Redis 本身不建议保存持久化数据,所以只作为备选方案。
相关推荐
l1t4 分钟前
一个clickhouse易错的语法问题
数据库·sql·clickhouse
啵啵啵鱼5 分钟前
六、联合查询
数据库·oracle
蓝胖的四次元口袋5 分钟前
Redis 知识梳理(4)
数据库·redis
Light6014 分钟前
企业自建 AI 智能体,成本差 8 倍还是 46 倍?
java·人工智能·算法·知识图谱·rag·ai agent 上下文·token 成本
Wang's Blog22 分钟前
Java 项目实战: 交友项目 - 阿里云 OSS 对象存储介绍
java·阿里云·交友
Yyyyyy~25 分钟前
【Maven】基础
java·maven
foolishlee26 分钟前
Neon compute GetPage
数据库
我不会起名字32232 分钟前
Redis 从 0 到 1(十一):缓存穿透/击穿/雪崩三连击,Go 3 套防御代码
redis·缓存·go·布隆过滤器·雪崩
weixin_BYSJ198733 分钟前
【计算机毕设】基于Spring_Boot_Vue的马拉松报名与选手成绩追踪系统05445
java·vue.js·spring boot·学习·spring·django·课程设计