Redis 服务等过期策略和内存淘汰策略解析

redis服务是基于内存运行的,所以很多数据都存放在内存中,但是内存又不是无限的,所以redis就引出了key的过期和淘汰策略。

一、Redis的过期策略:

我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key在60s后过期,60s后那redis是如何处理的嘛?

我们先来介绍几种过期策略:

1、定时过期:

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。

优点:该策略可以立即清除过期的数据,对内存很友好;

缺点:但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

2、惰性过期:

只有当访问一个key时,才会判断该key是否已过期,过期则清除。

优点:该策略可以最大化地节省CPU资源;

缺点:却对内存非常不友好。

注:极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

3、定期过期:

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。

该策略是前两者的一个折中方案。

通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。

键空间是指该Redis集群中保存的所有键。

4、惰性过期和定期过期结合使用:

假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。
但是呀,如果定期删除漏掉了很多过期的key,然后也没走惰性删除。就会有很多过期key积在内存内存,直接会导致内存爆的。或者有些时候,业务量大起来了,redis的key被大量使用,内存直接不够了,Redis用8(2^3)种内存淘汰策略保护自己~ 

二、Redis 内存淘汰策略:

1、volatile-lru:

当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;

2、allkeys-lru:

当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。

3、volatile-lfu:

4.0版本新增的策略,当内存不足以容纳新写入数据时,在过期的key中,使用LFU(最不经常使用)算法进行删除key。

4、allkeys-lfu:

4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU(最不经常使用)算法进行淘汰;

5、volatile-random:

当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;

6、allkeys-random:

当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。

7、volatile-ttl:

当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;

8、noeviction:

默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

三、 LRU算法与LFU算法:

Redis 在 4.0 版本之前的缓存淘汰算法,只支持 random 和 LRU。random 太简单粗暴了,可能把热点数据给淘汰掉,一般不会使用。

LRU比 random 好一点,会优先淘汰最久没被访问的数据,但是它也有一个缺点,就是无法真正表示数据的冷热程度。

1、什么是LRU算法:

LRU是一种基于时间的内存淘汰策略(最近最少使用,会淘汰掉长时间不使用的数据)。它假设最近被访问的数据在未来也更有可能被访问,而较长时间未被访问的数据更可能不再被使用。根据这个策略,LRU算法会淘汰最久未被访问的数据,以腾出内存空间。

LRU算法示意图:

流程解析: 

  1. 向一个缓存空间依次插入三个数据A/B/C,填满了缓存空间;
  2. 读取数据A一次,按照访问时间排序,数据A被移动到缓存头部;
  3. 插入数据D的时候,由于缓存空间已满,触发了LRU的淘汰策略,数据B被移出,缓存空间只保留了D/A/C。

2、如何实现LRU算法:

LRU算法比较核心的思想是要记录最近被访问的、最早被访问的数据,在访问数据和修改数据(编辑、新增、删除)数据时,该部分数据就会变成最新的数据,内存不够时会把最早被访问的数据删除掉。

​ 很快我们锁定了List,最近被访问的数据(最新的数据) 可以存在在List的第一个位置,最早被访问的(最老的数据)可以存放在List的最后一个位置。

但是由于数据的访问、数据的修改都会导致数据位置的变动,所以使用List会存在一定的性能问题,因此我们可以采用一个双向链表来暂时解决该问题,可以采用一个双向链表维护缓存的上一次使用时间,并且可以使数据插入/删除等操作的时间复杂度是O(1)。

此外当链表(linkedlist)越来越长时,我们访问某个元素时需要遍历访问,性能较差,因此新增一个哈希表(hashtable),记录链表节点的映射关系,解决如果只使用双向链表每次判断key是否存在时都需要遍历整个链表的问题。

3、什么是LFU算法:

LFU是一种基于访问频率的内存淘汰策略(最不经常使用,会淘汰掉使用次数最少的数据)。它假设经常被访问的数据在未来仍然频繁被访问,而较少被访问的数据更可能不再被使用。根据这个策略,LFU算法会淘汰访问频率最低的数据,以释放内存空间。

4、如何实现LFU算法:

实现LFU算法的一种常见方法是使用三个数据结构:

哈希表(keyToValue):用于存储键值对,提供快速的键值查找功能。
哈希表(keyToFreq):用于存储键的访问频率,记录每个键被访问的次数。
哈希表(freqToKeys):用于存储相同访问频率的键的集合,以便快速获取具有相同访问频率的键。

LFU算法的实现步骤如下:

(1)、初始化缓存容量、最小访问频率为0以及上述三个哈希表。

(2)、当需要获取缓存中的数据项时,首先检查键是否存在于keyToValue哈希表中。如果不存在,则返回-1表示未找到;如果存在,则获取对应的值,并更新该键的访问频率。

(3)、当需要插入新的数据项时,首先检查缓存是否已满。如果已满,则根据LFU原则淘汰一个访问频率最低的数据项。然后将新的键值对添加到keyToValue哈希表中,并将访问频率设置为1,并将键添加到对应访问频率的键集合中。如果缓存未满,则直接将新的键值对添加到keyToValue哈希表中,并将访问频率设置为1,并将键添加到对应访问频率的键集合中。

(4)、当更新键的访问频率时,首先从原访问频率的键集合中移除该键。如果原访问频率的键集合为空且等于最小访问频率,则更新最小访问频率。然后将键添加到新访问频率的键集合中,并更新键的访问频率。

(5)、当需要淘汰数据项时,从最小访问频率的键集合中选择一个键进行淘汰,并从keyToValue、keyToFreq和freqToKeys哈希表中移除该键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接: MikTeX ( https://mikt…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手,而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次,挥手是四次? 三次握手流程 首先是客户端(也就是我们的浏览器)发送一个SYN标志位…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一,队列的概念 队列是一种特殊的受限制的线性表。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的t(First In First Out)的线性表,简称FIF…

请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

NDK 基础(五)—— C++ 高级特性2

1、左值右值 在 C 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。 **左值(lvalue)**是指可以出现在赋值操作符左侧的表达式&a…

商店数据(九)

目录 65.店铺入驻字段表 66.店铺分类表 67.店铺配置表 68.店铺快递公司关联表 69.店铺资料附加表 70.店铺入驻流程表 71.店铺运费模板表 72.消息类型表 65.店铺入驻字段表 CREATE TABLE wst_bases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,flowld int(11)…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言,进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持,且初始流量相当有限。因此,开店的首要任务便是积极展开测评工作,努力积累初始的评论和销售记录。测评的益处颇为显著,它不…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动,传参有哪些方式? 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住:一般是对于Spring Boot应用特有的配置参数,确保它们遵循Spring Boot的配置属性命…

【视频打架行为数据集】打斗场景视频数据集简要介绍

一、UBI-Fight(异常事件检测数据集) 介绍 UBI-Fights 数据集是一个独特的全新大型数据集,涉及特定的异常检测并仍然在打斗场景中提供广泛的多样性,该数据集包含 80 小时的视频,在帧级别进行了完全注释。由 1000 个视…

# 从浅入深 学习 SpringCloud 微服务架构(五)Consul(2)

从浅入深 学习 SpringCloud 微服务架构(五)Consul(2) 段子手168 一、consul 集群:consul 集群的基础知识 1、启动 sonsul 服务命令: 以开发者模式快速启动: consul agent -dev -client0.0.0…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

移动端日志采集与分析最佳实践

前言 做为一名移动端开发者,深刻体会日志采集对工程师来说具有重要意义,遇到问题除了 debug 调试就是看日志了,通过看日志可以帮助我们了解应用程序运行状况、优化用户体验、保障数据安全依据,本文将介绍日志采集的重要性、移动端…

高级防爬还得是公众号

平时一天也就1K的流量,最近流量暴涨,已经用自研的WAF防火墙阻挡了很多恶意攻击和爬虫,已经过滤掉很多低级攻击和爬取了。 多出的流量,也仅仅多了一个导航 dh.yu7s.com 用户,多时没有用的机器人爬虫,不封掉浪…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中,有时会发现公司里的报表,经过多人多次的重复的使用和修改后,会出现这种情况: 1.在表格里按照需要输入数字,保存工作簿。 2.然而,再次打开工作簿,里面的数字变成日期&a…

c#学习入门2

十、运算符 1)算术运算符是用于数值类型变量计算的运算符,它返回的结果是数值 1.赋值符号 2.算数运算符 加 减- 乘* 除/ 取余% 3.算数运算符的优先级 4.算术运算符的复合运算 5.算术运算符的自增减 2)字符串拼接 1.字符串拼接方式1 注意&…

自定义View-旋转变色圆角三角形的绘制

本文字数:3151字 预计阅读时间:20分钟 在现代设计中,动效图在APP的UI界面中所起到的作用无疑是显著的。相比于静态的界面,动效更符合人类的自然认知体系,它有效地降低了用户的认知负载,UI动效俨然已经成为了…

错误代码126:加载d3dcompiler_43.dll失败,分享多种解决方法

在正常使用电脑的过程中,当我尝试启动并运行一款心仪的游戏时,系统却突然弹出一个令人困扰的错误提示“错误代码126:加载d3dcompiler_43.dll失败”,它会导致游戏无法正常运行。为了解决这个问题,我经过多次尝试和总结,…

VMware ESXi虚拟机备份的方法和步骤

关于虚拟机备份 VMware ESXi 是 VMware vSphere 企业虚拟化套件的核心组件。在版本4.1之前,它一直被称为ESX。ESXi是一种裸机管理程序,直接安装在物理服务器上,它提供对底层资源的直接访问和控制,允许您在单个物理主机上创建和运…

网鼎杯-2018-unfinish解题方法

BUUCTF在线评测这里可以解题无需搭建 进入这题后我们会得到这样一个界面 这里我们会发现登录不进去也没有注册界面以及源码,这里我们需要获取它其他的一些界面找注入机会,这里有两种方式找其他界面,一种是猜这里是登录界面那么必定就会有注册…

网络安全新挑战:通用人工智能(AGI)等级保护指南

通用人工智能(AGI)的发展现状及趋势 随着2023年大语言模型应用的划时代突破,以ChatGPT为杰出代表的此类技术犹如一股洪流,彻底颠覆了人类与机器智能交互的疆界,引领通用人工智能(AGI)步入一个崭…