详解Redis的三种常用的缓存读写策略步骤


Posted in Redis onMay 06, 2022

一、Redis三种常用的缓存读写策略

Redis有三种读写策略分别是:旁路缓存模式策略、读写穿透策略、异步缓存写入策略。

这三种缓存读写策略各有优势,不存在最佳,需要我们根据实际的业务场景选择最合适的。

二、旁路缓存模式(Cache Aside Pattern)

旁路缓存模式是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。

旁路缓存模式中服务端需要同时维护DBCache,并且是以DB的结果为准。

读写步骤

写:

  • 先更新DB
  • 然后直接删除cache

如下图:

详解Redis的三种常用的缓存读写策略步骤

读:

  • cache中读取数据,读取到就直接返回。
  • cache中读取不到的话,就从DB读取返回。
  • 再把数据写到cache中。

如下图:

详解Redis的三种常用的缓存读写策略步骤

自我思考

思考这样子的一个问题:“如果在写数据的过程中,可以先删除cache,再更新DB吗?

答案: 答案肯定是不行的,因为这样子可能造成数据库和缓存数据不一致的问题,比如这个时候有一个数据在DB和缓存都为100,请求1需要将这个数据更新写成200,如果先删除换出再更新数据库的话,在请求1已经删除缓存但是数据库还没写完的时候,有一个请求2读取数据,首先去缓存读取,发现缓存被删除了,然后去数据库读取得到100(这个时候请求1还没写完)再写入缓存,这个时候请求1写完了,这个时候数据库里数据为200,缓存里为100,不一致。

可以简单描述为:

请求1先把cache中的数据删除 -> 请求2从DB中读取数据 -> 请求1再把DB中的数据更新

紧接着思考:“在写数据的过程中,如果先写BD,再删除cache就不会造成数据不一致了吗?

答案: 理论上来说还是会出现数据不一致的问题,不过概率很小,因为缓存的写入速度是比数据库写入速度快很多。

比如请求1先读数据A,请求2随后写数据A,并且数据A不在缓存中存在的话就会去数据库读取,读取完请求2再更新完并删除缓存,然后请求1把数据A写入缓存,这个时候数据库和缓存就不一致了。

这个过程可以简单的描述为:

请求1从DB读取数据A -> 请求2写更新数据A到数据库再删除cache中的A数据 -> 请求1将数据A写入缓存

缺点

  • 首次请求的数据一定不在cache的问题

    解决办法:可以将热点数据提前写入cache中。

  • 写操作比较频繁的话导致cache中的数据会被频繁的删除,这样会影响缓存命中率。

    解决办法:

    • 数据库和缓存强一直场景:更新DB的时候同样更新cache,不过需要加一个锁/分布式锁来保证更新cache的时候不存在线程安全问题。
    • 可以短暂的允许数据库和缓存数据不一致的场景:更新DB的时候同样更新cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。

三、读写穿透(Read/Write Through Pattern)

读写穿透中服务端把cache视为主要数据存储,从中读取数据并将数据写入其中。cache服务负责将此数据读取和写入DB,从而减轻应用程序的职责。

读写步骤

写:

  • 先查cachecache中不存在,直接更新DB
  • cache中存在,则先更新cache,然后cache服务自己更新DB(同时更新DBcache)。

如下图:

详解Redis的三种常用的缓存读写策略步骤

读:

  • 先从cache中读取数据,读取到直接返回。
  • cache中读取不到,则先从DB加载写入到cache后返回响应。

如下图:

详解Redis的三种常用的缓存读写策略步骤

读写穿透实际是在旁路缓存之上进行了封装。在旁路缓存下,发生读请求的时候,如果cache中不存在对应的数据,是由客户端自己负责把数据写入cache,而读写穿透则是cache服务自己来写入缓存,这对客户端是透明的。

和旁路缓存一样,读写穿透也存在首次请求数据一定不在cache中的问题,对于热点数据可以提前写入缓存中。

四、异步缓存写入(Write Behind Pattern)

异步缓存写入和读写穿透很相似,两者都是由cache服务来负责cacheDB的读写。

两者最大的不同点就是:读写穿透是同步更新DBcache,而异步缓存写入则是只更新cache,不直接更新DB,而是改为异步批量的方式更新DB

很明显,这种方式对数据一致性带来了更大的挑战,比如cache数据可能还没异步更新DBcache服务可能就挂了。

这种策略在我们平时开发过程中也非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQLInnoDB Buffer Pool机制都用到了这种策略。

异步缓存写入的写性能非常高,非常适合写数据经常变化又对数据一致性要求没那么高的场景下使用,比如浏览量、点赞量等。

参考:javaguide.cn/database/re…

到此这篇关于详解Redis的三种常用的缓存读写策略步骤的文章就介绍到这了!


Tags in this post...

Redis 相关文章推荐
Redis持久化与主从复制的实践
Apr 27 Redis
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
分布式架构Redis中有哪些数据结构及底层实现原理
Mar 13 Redis
Redis集群节点通信过程/原理流程分析
Mar 18 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 Redis
windows安装 redis 6.2.6最新步骤详解
muduo TcpServer模块源码分析
Redis数据同步之redis shake的实现方法
Apr 21 #Redis
Grafana可视化监控系统结合SpringBoot使用
Redis官方可视化工具RedisInsight安装使用教程
Redis实现一个账号只能登录一个设备
Apr 19 #Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
You might like
PHP 数组遍历顺序理解
2009/09/09 PHP
php购物车实现代码
2011/10/10 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
快速了解Python相对导入
2018/01/12 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
python assert的用处示例详解
2019/04/01 Python
python多线程同步实例教程
2019/08/11 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
项目经理的岗位职责
2013/11/23 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技