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 本身不建议保存持久化数据,所以只作为备选方案。
相关推荐
青云交15 分钟前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
CHEN5_021 小时前
【Java基础面试题】Java基础概念
java·开发语言
二十雨辰1 小时前
[TG开发]照片机器人
java·web3
武昌库里写JAVA2 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
xiep14383335102 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
落霞的思绪3 小时前
Java设计模式详细解读
java·开发语言·设计模式
Java小白程序员3 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
老虎06273 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
拂晓银砾3 小时前
Java数据结构-栈
java·数据结构
甄超锋3 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven