Redis缓存淘汰策略分析

server/2024/11/15 0:23:00/

一、概述
redis缓存是在内存中保存数据,避免业务从数据库中读取数据,从而提升系统的响应速度,而redis缓存淘汰是指当缓存数据达到一定容量时,为了给新的数据腾出空间,需要按照一定的策略从缓存中移除旧的数据。

二、redis缓存淘汰策略。
1.noeviction:这种方式是不进行淘汰的,当内存不足以容纳新写入数据时,新写入操作会报错。
2.allkeys-lru: 当内存不足以容纳新写入数据时,它会从所有键值对中移除最近最少使用的键。
3.allkeys-lfu:lfu是在Redis 4.0 时引入,当内存不足以容纳新写入数据时,它会从所有键值对中移除最近使用频率最小的键。
4.allkeys-randoms:当内存不足以容纳新写入数据时,从所有键值对选择并随机移除。
5.volatile-lru:当内存不足以容纳新写入数据时,会在设置了过期时间的键中,移除最近最少使用的键。
6.volatile-lfu: lfu是在Redis 4.0 时引入,当内存不足以容纳新写入数据时,它会在设置了过期时间的键中移除最近使用频率最小的键。
7.volatile-random: 它的淘汰策略是在设置了过期时间的键值对中,进行随机移除。
8.volatile-ttl: 它的淘汰策略是当内存不足以容纳新写入数据时,会在设置了过期时间的键空间中,移除即将过期的键。

三、LRU和LFU算法分析

1.LRU算法

LRU 算法的全称是 Least Recently Used,即按照最近最少使用的原则来淘汰数据。把最不常用的数据筛选出来,而最近频繁使用的数据则会留在缓存中。

(1)LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近常使用的数据和最近不常用的数据。

LRU算法其实可以这样理解,就是认为刚刚访问的数据可能还会被访问到,就会放在MRU端,长时间不访问的数据放在LRU端,缓存满了就删除它。

不过,LRU 算法在实际实现时,需要用链表管理所有的缓存数据,这会带来额外的空间开销。而且,当有数据被访问时,需要在链表上把数据移动到 MRU 端,如果有大量的数据被访问,就会带来很多链表移动操作,会耗时,进而降低 Redis 缓存性能。

因此在 Redis 中,LRU 算法被做了简化,以减轻数据淘汰对缓存性能的影响。具体来讲,就是Redis 默认会记录每个数据最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)。然后redis在淘汰数据时会随机选出N个数据,作为一个候选集合,接下来redis会比较这N个数据的lru字段。把其中最小的淘汰出去。

(2)Redis 提供了一个配置参数 maxmemory-samples,这个参数就是 Redis 选出的数据个数 N。例如,我们执行如下命令,可以让 Redis 选出 100 个数据作为候选数据集:

CONFIG SET maxmemory-samples 100

当需要再次淘汰数据时,Redis 需要挑选数据进入第一次淘汰时创建的候选集合。这儿的挑选标准是:能进入集合数据的lru字段必须小于集合中最小的lru值。当有新数据进入候选数据集后,如果候选数据集中的数据个数达到了 maxmemory-samples,Redis 就把候选数据集中 lru 字段值最小的数据淘汰出去。

这样Redis 缓存不用为所有数据维护一个大表,也不用在每次数据访问时都移动链表项,提升了缓存的性能。

2.LFU算法

LFU(Least Frequently Used)是Redis 4.0 引入的淘汰算法,它通过key的访问频率、访问时间比较来淘汰key,重点突出的是Frequently Used,LFU 算法更加重视元素的访问频率,而非最近一次访问时间。

(1)LFU算法根据缓存块的使用频率来决定哪些块应该被清除。具体来说,它会记录每个缓存块的使用次数,并按照使用次数从低到高排序。当缓存达到容量上限时,LFU算法会选择使用次数最少的缓存块进行清除,也就是最不经常使用的缓存块。

LFU算法的优点是能够有效地防止缓存溢出,并且能够最大限度地减少清除重要数据的概率。但是,由于需要记录每个缓存块的使用次数,因此LFU算法需要较大的内存空间,并且由于需要经常更新使用次数,因此其时间复杂度相对较高。

(2)Redis LFU 缓存淘汰算法。
Redis 中实现了基于 LFU 的缓存淘汰策略:volatile-lfu 和 allkeys-lfu。
Redis使用LFU策略淘汰数据时,选择 lru 字段最小的数据进行淘汰。等价于 优先淘汰访问次数少的数据,访问次数相等则淘汰时间戳最小 的数据。

总结:
在实际应用中,选择哪种淘汰策略取决于应用的需求和数据的重要性。对于重要的数据,应选择能够保留数据的策略,如volatile-lru,而对于非关键数据,可以选择随机淘汰random策略,或者完全不淘汰noeviction策略。


http://www.ppmy.cn/server/16798.html

相关文章

每日两题 / 46. 全排列 41. 缺失的第一个正数(LeetCode热题100)

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 经典回溯题&#xff0c;每次搜索选择未选择数字中的一个 当选择了n个数时&#xff0c;将已经选择的数加入答案 class Solution { public:vector<vector<int>> permute(vector<int>& nums) {vector…

图论应用——拓扑排序

拓扑排序的原理和宽度优先搜索差不多 #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N 100010; int n,m; int h[N],e[N],ne[N],idx; int q[N],d[N];void add(int a,int b) {e[idx]b,ne[idx]h[a],h[a]idx; }…

外包干了9天,技术退步明显。。。。。

时光荏苒&#xff0c;转眼我已是一个拥有近四年功能测试经验的大专生。19年&#xff0c;我满怀激情地通过校招进入湖南某知名软件公司&#xff0c;期待在这里开启我的职业生涯。然而&#xff0c;长时间的舒适环境让我渐渐失去了前进的动力&#xff0c;技术停滞不前&#xff0c;…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…

linux DNS域名解析服务

目录 一.DNS DNS系统的作用 域名结构&#xff1a; 根域 顶级域 二级域 子域 主机 二.DNS解析过程 迭代查询&#xff1a; 递归查询&#xff1a; 三.实验模拟 主、从服务器设置 1.搭建本地DNS服务器------(主服务器配置) 1&#xff09;初始化系统 ​编辑2&#xf…

redis模糊查询redis中的key

redis模糊查询redis中的key 方式一&#xff1a;使用keys命令 /*** 查找匹配的key** param pattern* return*/ public Set<String> keys(String pattern) {return redisTemplate.keys(pattern); }方式二&#xff1a;使用san命令 /*** 查找匹配的key** param pattern* r…

一个网络空间安全的小游戏

为了编写一个网络空间安全的小游戏&#xff0c;我们可以模拟一些基本的网络安全概念&#xff0c;如防火墙、入侵检测、病毒清理等。以下是一个简单的Python小游戏示例&#xff0c;其中玩家需要保护自己的网络免受攻击。 python复制代码 import random class Network: def __…

R可视化:桑基图展示数据层流动

介绍 以桑基图形式展示数据分布情况 加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(ggalluvial)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2) 导入数据 metadata…