Redis:缓存一致性问题(缓存更新策略)

news2024/11/29 16:23:49

Redis缓存的一致性

  • 1. 缓存
    • 1.1 缓存的作用:
    • 1.2 缓存的成本:
  • 2. 缓存模型
  • 3. 缓存一致性问题
    • 3.1 引入
    • 3.2 解决
      • (1) 先更新数据库,再手动删除缓存
      • (2) 使用事务保证原子性
      • (3) 以Redis中的TTL为兜底
    • 3.3 案例:商铺信息查询和更新
      • (1) 查询商铺信息
      • (2) 更新商铺信息

1. 缓存

定义:缓存就是数据交换的缓冲区,称为Cache,是存储数据的临时地方,读写性能较高;

CPU在执行时需要从内存/磁盘读取数据放到寄存器中才可以做运算;这种读写的性能限制了cpu的性能!
所以在【CPU的内部】添加高速缓存Cache,CPU会将经常读写的数据放到缓存中(局部性原理),当做高速运算时就不用再把数据从内存/磁盘拷贝过来再运算了,充分释放CPU的运算性能,提高运算效率;
在这里插入图片描述

1.1 缓存的作用:

  1. 降低后端负载,当请求进入Tomcat后,不用查数据库(需要查询磁盘比较慢);
    而使用缓存,请求从缓存中查到数据后直接返回前端,不用查数据库;
  2. 提高读写效率,降低响应时间,Redis的读写在微妙级别,比读写数据库(磁盘)快很多

1.2 缓存的成本:

  1. 数据的一致性问题:当数据库数据变化,那么缓存中数据就不是最新的了,这是数据就不一致了;
  2. 增加代码维护成本:为了解决缓存和数据库不一致,需要使用复杂的代码来维护(缓存穿透、击穿);
    3.运维成本:为了避免缓存缓存雪崩,保证缓存的高可用,缓存往往是集群模式,而集群的部署、维护需要运维;

2. 缓存模型

在客户端和数据库之间添加了一个中间层!
这样客户端请求会优先到达缓存Redis!
如果Redis中有数据就返回,就不用走数据库了(请求命中); 若没有才去查询数据库(未命中);
将未命中的数据写到Redis中,这样下一次再查询就可以使用缓存了;
随着用户请求越多,Redis中缓存的数据越多,Redis的命中率就会越来越高;

在这里插入图片描述

3. 缓存一致性问题

3.1 引入

当对数据库修改,缓存未更改,就出现了缓存一致性的问题;

3.2 解决

(1) 先更新数据库,再手动删除缓存

考虑:
1. 删除缓存还是更新缓存?
更新:每当数据库更新,缓存都要更新,开销较大,可能很多是无效操作(用户没查); ×
删除:更新数据库时让缓存失效,用户查询时再去更新

2. 先删除缓存还是先更新数据库? (并发场景)
先缓存,再数据库
假设线程1先更新缓存再更新数据库,那么当缓存先被删除后,更新数据库的时间会比较长,如果这段时间内有其他线程2来查询缓存(查询较快),由于已经被删除则会去数据库查,查完之后再写回缓存;而之前更新数据库的线程1这是才更新完数据库,此时缓存是旧值,数据库是新值;
在这里插入图片描述

先数据库,再缓存
假设线程1先查询,此时缓存失效了,就去查询数据库中数为A,而此时线程2来更新数据库数为B,并删除了缓存,而后线程1 将数据A更新到缓存,而此时数据库是B,缓存是A;
在这里插入图片描述

但是线程2更新数据库是很慢的,一般不会比线程1 查询快,所以发生一致性问题的可能性很低,所以使用先修改数据库,再删除缓存!

(2) 使用事务保证原子性

单体系统:将缓存和数据库操作放在一个事务中!
分布式系统:缓存操作和数据库操作可能不在同一个服务器中,则利用TCC等分布式事务;

(3) 以Redis中的TTL为兜底

用expire方法设置Redis的TTL有效时间!让缓存中的数据定期清除,这样也能保证一定的有效性;

3.3 案例:商铺信息查询和更新

在这里插入图片描述
需求:
1.【查询】:根据id查询店铺,如果未命中则查询数据库,查询数据库数据,并更新到缓存,设置超时时间
2.【更新】:当在数据库修改店铺id时,先修改数据库,再删除缓存

(1) 查询商铺信息

1.注入stringRedisTemplate的bean,从Redis查询商户缓存,如果命中则返回商铺信息
这里存商铺信息的是String格式,则需要将String格式的Json反序列化为Java对象;
2.未命中则查询数据库,若不存在,报错;
3.若数据库中存在,则用stringRedisTemplate.opsForVlaue将商铺信息写到Redis中,并更新TTL有效时间(兜底)!
4.再把商铺信息数据返回;
在这里插入图片描述

(2) 更新商铺信息

更新数据库和删除缓存在同一个 事务 中!
1.判断id是否存在,不存在则报错;
2.先更新数据库
3.再根据id删除缓存中的数据
在这里插入图片描述

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

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

相关文章

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

我国二氧化碳地质封存技术起步较晚,目前仍没有一套相对完整的行业规范;且就该技术而言,涉及环节众多,理论相对复杂,对于行业的新入局者不太友好。因此,结合时代背景,我们首次尝试对二氧化碳地质…

【面试1v1实景模拟】Spring事务 一文到底

老面👴:小伙子,了解Spring的事务吗? 解读🔔:这个必须了解,不了解直接挂~😂😂😂,但面试官肯定不是想听你了解两个字,他是想让你简单的介绍下。 笑小枫🍁:了解,事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。为…

C++——C++11第三篇

目录 包装器 function包装器 bind 包装器 function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板,也是一个包装器。 上面的程序验证,我们会发现useF函数模板实例化了三份。 包装器可以很好的解决上面的问题 ,让它只实…

Android新启动模式之singleInstancePerTask

Android新启动模式之singleInstancePerTask 一.singleInstancePerTask介绍 singleInstancePerTask为android12新增的在standard、singleTop、singleTask、singleInstance之后的第五种启动模式。 Android12对于singleInstancePerTask描述如下(sdk中在platforms/android-31/d…

05- 形态学及图像的开闭运算 (OpenCV基础) (机器视觉)

知识重点 二值化操作 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),对灰度图像操作, 全局阈值,整幅图像采用同一个数作为阈值 。 自适应阈值二值化 dst cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, …

做测试5年,靠业务熟悉吃老本,技术短板暴露,30岁被无情辞退...

朋友跟我诉苦,最近他被公司无情辞退了。测试几年,月薪10k,如今已经30了,接下来不知道该怎么办,让我帮他想想办法... 几年下来,也算是公司的骨干成员,不说有功,但一定无过。公司业务…

乐山持点科技:抖音38好物节活动运营要求

抖音38好物节活动马上就要到了,很多人都还不知道抖音38好物节活动的运营要求,乐山持点科技小编这就来给各位抖音达人们分享。5.1 商家活动管控规范5.1.1 以上条件为满足参加活动的基本条件,最终是否能够参加活动,以平台的最终审核…

kubernetes入门介绍,从0到1搭建并使用

Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目,是一个容器编排系统,可以自动化部署、…

【100个 Unity实用技能】☀️ | C#泛型集合常用方法,查找符合要求的第一个元素并返回

Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

学数据结构第一个是学链表?不,是它

大家好,我是五月。前言以前很多小白都来询问过关于数据结构的内容,问题基本都是想学链表,堆栈、队列、树这些该怎么下手。一方面我表示赞许,另一方面又觉得他们对数据结构这个东西真是知之甚少。我告诉他们,第一个要学…

常用Linux的ssh远程终端连接工具

putty 说明 putty是最简单的SSH工具,无需安装,支持多系统版本,下载后就可以直接使用。 优点: 1.免费 2.免安装 缺点: 1、不支持标签模式; 2、默认设置不友好,很多功能都需要额外配置才行&…

Vue Slot (四种方式:超详细)

slot(插槽)的概念是把外层的内容塞进子元件的指定位置里。跟插槽的字面意思一样,前提是:有插口才能插。子元件需要开一个插口(slot),才可以在外层元件把内容塞进子元件里。 slot(插槽) 可分为四种: slot(插槽)Named slot(具名插槽)Scoped slot(作用域插槽)Dyn…

掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

文章目录什么是广播表广播表实战数据库配置表Java配置实体类配置文件测试广播表水平分库分表配置文件运行测试什么是绑定表?绑定表实战配置数据库配置Java实体类配置文件运行测试水平分库分表后的查询和删除操作查询操作什么是广播表 指所有的分片数据源中都存在的…

redis(win版)

1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。基于内存存储,读写性能高适合存储热点数据&am…

SealOS 一键安装 K8S

环境 # 查看系统发行版 $ cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NA…

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…

【Npde.js】express以及nodemon

express初始Express什么是Express不使用Express可以创建web服务器吗?Express能做什么安装Express监听GET请求和post请求获取URL中携带的查询参数获取URL中携带的动态参数托管静态资源nodemon为什么使用nodemon初始Express 什么是Express 官方给出的概念&#xff0…

ctf pwn基础-1

在心中做了无数次决定,我终于还是准备学pwn了,为了继承学长的衣钵,更别说自己已经下定决心学习 c了,废话不多说下面正式开始。 目录 基础 实列讲解 基础 很多人一上来就叫你什么汇编啊、c啊什么的,让人往而却步&…

分布式任务调度处理方案(无代码)

业务涉及到,需要向数据库、redis、elasticsearch、MinIO写四份数据,这里存在分布式事务问题。如何解决问题,先分析cap,是要保证可用性,还是保证一致性。如何选择是CP还是AP?分析业务场景CP的场景&#xff1…

canvas样式与颜色,字体,图片,状态,形变

色彩 fillStyle color 设置图形的填充颜色。 strokeStyle color 设置图形轮廓的颜色。 备注: 一旦您设置了 strokeStyle 或者 fillStyle 的值,那么这个新值就会成为新绘制的图形的默认值。如果你要给每个图形上不同的颜色,你需要重新设置…