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 本身不建议保存持久化数据,所以只作为备选方案。
相关推荐
怣50几秒前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
向上的车轮3 分钟前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu5 分钟前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h11 分钟前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了12 分钟前
Java中的集合
java·开发语言
wjhx21 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
YCY^v^25 分钟前
JeecgBoot 项目运行指南
java·学习
冰暮流星32 分钟前
javascript之二重循环练习
开发语言·javascript·数据库
人间打气筒(Ada)37 分钟前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
爬山算法42 分钟前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate