Redis学习篇3:缓存更新策略与数据更新、淘汰策略

news2024/11/15 20:47:43

一、缓存更新策略        

二、主动更新 

三、过期策略 

3.1 如何知道过期?

3.2 删除策略

四、内存淘汰策略

数据淘汰策略-使用建议


一、缓存更新策略        

        Redis是基于内存的数据库,它的优点就是在对数据进行操作的时候快,并且通过多种方案而形成的承载能力高。其缺点也非常的明显,那就是它不像基于磁盘的数据库一样可以一直存储大量的数据,所以我们需要定期的更新Redis中的数据以保证数据不会冗余,并且都是最新的数据。

关于内存淘汰、超时剔除、主动更新在文章中都会详细的讲到

内存淘汰超时剔除主动更新
说明不用自己维护,利用Redis的内存淘汰策略,当内存不足时自动淘汰部分数据。下次查询时更新缓存。给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存。编写业务逻辑,在修改数据库的同时,更新缓存。
一致性
维护成本

        在上述表格中列举了三种缓存更新的策略,其中保证一致性最高的无疑是主动更新,其在写业务逻辑时就主动更新Redis中的缓存数据。其次就是超时剔除,在过期之后直接查询数据库也能在一定程度上保证查询到的数据的准确性,那么这三种缓存更新策略我们该如何的进行选择呢?

低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存;
高一致性需求:主动更新,并以超时剔除作为兜底方案。例如店铺详情查询的缓存;

二、主动更新 

根据上文,主动更新共有三种方法:

1. Cache Aside Pattern:由缓存的调用者,在更新数据库的同时更新缓存

2. Read/Write ThroughPattern:缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性

3.Write Behind cachingPattern:调用者只操作缓存,由其它线程异步的将缓存数据持久化到数据库,保证最终一致。

方案一是我们开发中常常用到的,因为二、三都会因为某些不稳定性因素从而导致一致性失效。

同时来看三个问题

关于先删除缓存还是先操作数据库这个问题,我们一般都会采用先操作数据库,在删除缓存的方法,因为先删除缓存在操作数据库,此时如果第二个线程进来会造成缓存中存在脏数据的情况。
但是无论这两种用哪一种方案,他都不是目前最优的解决方案
这个问题你也可以为如何保证双写一致性?

答案是:延时双删

问题一:为什么要删除两次?

答:上文提到,先删除缓存在操作数据库会造成缓存中存在脏数据的情况,所以在操作完成数据库之后在删除缓存可以极大程度的保证缓存中没有脏数据

问题二:为什么要延迟?

答:当前数据库都是主从模式,需要等一段时间主服务器同步到从服务器

那么随之的问题也就来了,延时双删虽然在很大的程度上保证了双写一致性,但是由于是延时,这个时间不好控制,所以还是会有脏数据的可能性,这会导致不是强一致性,关于如何保证强一致性可以使用互斥锁,这里不多展开。

三、过期策略 

在上文中我们提到过,Redis是有最大存储上限的,所以为了能存储更多更有用的数据,我们通常会对添加的key设置ttl(过期时间),以保证内存中不会有过多的冗余的key。
这里有两个问题需要我们思考:

  1. Redis是如何知道一个key是否过期呢?
  2. 是不是TTL到期就立即删除了呢?

3.1 如何知道过期?

我们来看一下redisDb,我们都知道Redis中有0-15这16个库,而每一个库都类似于redisDb这样的结构体,他有如下属性

那么第一个问题的答案也呼之欲出了,即利用两个Dict分别记录key-value对及key-ttl对

3.2 删除策略

在redis中,一个key过期了并不是会立即删除的,这样对性能的开销是非常严重的,我们需要监视每一个key的ttl,这是不能接受的,所以redis提供了两种删除策略:惰性删除与定期删除。

惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key

优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查
缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

周期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key,即从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key

执行周期有两种:
Redis会设置一个定时任务serverCron(),按照server.hz的频率来执行过期key清理,模式为SLOW
Redis的每个事件循环前会调用beforeSleep()函数,执行过期key清理,模式为FAST

SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的 hz 选项来调整这个次数
FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

四、内存淘汰策略

当我们的项目非常庞大的时候,内存中的数据量可能会非常的多,此时如果仅仅删除过期的key是可能不够的,所以当Redis内存使用达到设置的阈值时,Redis会主动挑选部分key删除以释放更多内存的流程,就叫内存淘汰机制。

Redis支持8种不同策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据默认就是这种策略,通过修改配置文件修改
  • volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
  • allkeys-random:对全体key,随机进行淘汰。也就是直接从db->dict中随机挑选
  • volatile-random:对设置了TTL的key,随机进行淘汰。也就是从db->expires中随机挑选
  • allkeys-lru:对全体key,基于LRU算法进行淘汰
  • volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
  • allkeys-lfu:对全体key,基于LFU算法进行淘汰
  • volatile-lfu:对设置了TTL的key,基于LFI算法进行淘汰

LRU(Least RecentlyUsed):最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU(Least FrequentlyUsed):最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

数据淘汰策略-使用建议

  1. 优先使用 alkeys-ru 策略。充分利用 LRU 算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
  2. 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用alkeys-random,随机选择淘汰
  3. 如果业务中有置顶的需求,可以使用 volatile-lru 策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
  4. 如果业务中有短时高频访问的数据,可以使用 allkeys-lfu 或 volatile-lfu 策略。

最后我们来思考两个问题

问题1:根据数据淘汰策略,如何保证Redis中的数据都是热点数据?

答:使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据。

问题2:Redis的内存用完了会发生什么?

答:主要看数据淘汰策略是什么?如果是默认的配置(noeviction),会直接报错。

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

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

相关文章

【全开源】驾校管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的驾校管理系统,驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理,让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工作,让工作更有条理。改变驾校传统的手工或半手工Excel文档管理的工作方式。多驾…

深入探索C++继承机制:从概念到实践的全面指南

目录 继承的概念及定义 继承的概念 继承的定义 定义格式 继承方式和访问限定符 继承基类成员访问方式的变化 默认继承方式 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 继承的方式 菱形虚拟继承 菱形虚拟继承原理 继承…

vue项目关于loading问题

前言 因全局加loading会出现全白屏的遮罩层,影响美观,所以一般考虑局部加loading,比如是表格,表单等就加上loading 解决办法 v-loading“loading” element-loading-background“rgba(255, 255, 255, 0.6)” const loading re…

精酿啤酒:品质与口感在消费者选择中的权重分析

在啤酒市场中,消费者选择的影响因素众多,其中品质与口感是两个核心要素。对于Fendi club啤酒而言,品质与口感的权重分析在消费者选择中显得尤为重要。 品质是消费者选择啤酒的首要因素。随着消费者对啤酒认知的提高,他们对品质的…

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析 摘要 该论文对自动驾驶汽车中的传感器和传感器融合技术进行了全面回顾。它评估了各种传感器(如相机、LiDAR、雷达)的能力和技术性能,并讨论了多传感…

c++11特性(详细)

文章目录 前言一、C11介绍二、列表初始化1.{}初始化2.initializer_list 三、auto与decltype四、STL中变化五、右值引用六.C中关于类的新功能七.可变参数模板八.lambda表达式总结 前言 在本篇文章,我们将会详细介绍一下C11新增的一些特性,其中最重要的是…

有1,2,3,4这四个数字,能组成多少个互不相同且无重复数字的三个数?分别是什么?

有1,2,3,4这四个数字,能组成多少个互不相同且无重复数字的三个数?分别是什么? 提示:123,321就是符合要求,数字既不相同,而且每个数字的个十百位也不重复;而121,212就不行&#xff0c…

Facebook海外三不限企业广告账户-Facebook的ROI是什么?

1. 什么是ROI? ROI是指投资回报率(Return on Investment),是衡量投资效益的一种指标。在市场营销领域,ROI是一个非常重要的概念,用于衡量营销活动的效果和价值。它通常用于评估一项投资的效益,即…

获取和设置代理的动态IP的方式

引言 大家好,今天我来给大家分享一下如何通过编程技术来获取和设置代理的动态IP。在网络世界中,代理和动态IP是非常常见的概念,尤其对于需要大规模访问网站或者需要隐藏真实IP地址的应用程序来说,更是必不可少的工具。接下来&…

钛媒体首发 | 百度沈抖回应大模型价格战:希望大家别再天天拉表格比价格

ITValue “有这个时间,不如去卷场景、卷应用。” 作者|张帅 编辑|盖虹达 首发|钛媒体APP ITValue 钛媒体App 5月28日消息,在2024智能经济论坛上,百度集团执行副总裁、百度智能云事业群总裁沈抖介绍了文心系…

视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案

为了实现“以信息化推动应急管理能力现代化”的目标,应急管理部提出了加速现代信息技术与应急管理业务深度融合的计划。这一计划是国家加强和改进应急管理工作的关键举措,也是满足日益严峻的应急管理形势和人民群众不断增长的公共安全需求的紧迫需求。 为…

qq音乐sign逆向

qq音乐sign参数逆向 1.概览 参数sign长度40 多次调试发现,前缀zzb不变 2.打日志 跟站发现是vpm,在apply调用打上日志断点: 连蒙带猜知道,最终字符串四部分构成,zzb 24DC2798 HI0TvE4tOMqzN4w88oZCjQ EE0A88FE 1.把…

云平台教程 | 手把手教你GSEA富集分析和解读

爱基百客云平台小工具使用 1.1 爱基百客云平台之GSEA分析 1.2 GSEA富集分析原理图 1.3 GSEA富集分析过程 1.4 参数设置 1.5 任务查看 1.6 结果 1.6.1 富集结果表格 1.6.2 富集可视化图解读 01 爱基百客云平台小工具使用 首先,打开爱基百客官网:http://w…

Linux系统下安装配置nginx,本地访问服务器nginx

一、先安装依赖包 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 二、官网下载Nginx压缩包 官网地址:nginx: download 三、安装Nginx 1.这里我们下载稳定版本即可,在命令行输入以下命令,会在当前目录下生成…

智源与HuggingFace联合推出开放中文大语言模型榜单 - 旗鉴榜

近日,智源研究院与 Hugging Face 开发者社区合作,发布 Open Chinese LLM Leaderboard,旨在跟踪、排名和评估开放式中文大语言模型,通过开源社区共建、用户自主贡献的方式,持续推动和完善中文语言大模型的科学、客观排名…

TPM是如何平衡设备维护与生产需求的?

在当今快节奏的生产环境中,设备维护与生产需求之间的平衡成为了企业持续发展的关键所在。TPM(全面生产维护)作为一种先进的生产管理理念,为企业提供了实现这一平衡的有效路径。具体如深圳天行健精益管理咨询公司下文所述&#xff…

记录使用自定义编辑器做试题识别功能

习惯了将解析写在代码注释,这里就直接上代码啦,里面用到的bxm-ui3组件库是博主基于element-Plus做的,可以通过npm i bxm-ui3自行安装使用 // 识别方法: // dom 当前识别数据所在区域, questionType 当前点击编辑选择的题目类型&a…

docker的介绍、原理及操作

一、docker介绍 1.容器技术介绍 Container 即容器,平时生活中指的是可以装下其它物品的工具, 以方便人类归纳放置物品 、存储和异 地运输 ,比如人类使用的衣柜 、行李箱、 背包等可以成为容器,Container 除了容器以外&#xff…

Simulink从0搭建模型06-P7模型中结构体的使用

Simulink从0搭建模型06-P7模型中结构体的使用 本节课学习内容1. 结构体的创建 Bus Creator(多输入单输出)2. 结构体的引用 Bus Selector(单输入多输出)3. 结构体的赋值 Bus Assignment4. 结构体对象的创建 Bus object5. 结构体数组…

vue3 vant4实现抖音短视频功能

文章目录 1. 实现效果2. 精简版核心代码3. 完整功能点&#xff08;本文章不写&#xff0c;只写核心代码&#xff09; 1. 实现效果 2. 精简版核心代码 使用的 vue3 vant4组件使用van-swipe进行轮播图切换实现 <template><div :style"{width: width px,overflo…