redis数据一致性的实现示例


Posted in Redis onMarch 18, 2022

前言

所谓的redis数据一致性即当进行修改或者保存、删除之后,redis中的数据也应该进行相应变化,不然用户再次查询的时候很可能查询出已经删除过的脏数据。

一、缓存一致的必要性

还是接上篇来说,我们已经解决了redis缓存穿透的问题(简单解决方案,可以再次优化),但是使用redis的时候缓存一致性的问题我们也需要着重考虑,例如:保存了一个新用户之后,就应该同时在redis缓存中也插入该条数据,更新了某条数据在缓存中也应该同步更新,而redis默认的做法是:当你不去设置的时候redis中存放的一值是你之前存放的数据,只有在重启服务器的时候数据才会同步,显然这是非常不可取的,如果是这样的话岂不是每时每刻都要重启服务器,那将是多么大的灾难!

二、业务场景

这里我只说一个场景吧,其他场景都是一样的处理办法,场景为:假设我们将用户数据放入到redis中,此时有新用户注册,在数据库中会插入一条新数据,与此同时要在redis中也插入该条数据,以便于下次查询的时候显示最新数据。

我们先来看一下默认不使用任何处理的情况下redis是否会为我们做一致性操作,现在我的测试数据库中有18条用户数据,此时我们启动系统后注册插入第19条数据后看下redis中是否有19条。

redis数据一致性的实现示例

经过注册之后我现在给数据库中插入了第19条数据

redis数据一致性的实现示例

接着我们还是使用上篇提到过的查询缓存的方法来获取下所有信息,我们直接来看第最后一条,可以看到最后是润青而不是十九,所以redis默认是没有替我们做缓存一致操作的。

redis数据一致性的实现示例

三、缓存一致性实现(方案1)

其实,要想实现一致性很简单,当我们在进行插入操作之后,我们把该条数据取出来同时保存到redis缓存中去,这样再次查询缓存的时候我们也可以看到新的数据,代码如下:

redis数据一致性的实现示例

需要注意的是:我这里直接是调用JPA的findAll(),其实更好的做法是根据id去更新刚插入的那一条,这样效率才高,这里只是演示如何实现,接着再来注册一条新数据,看看是否可以在缓存中同时看到:新插入的数据id为29,我们来看下缓存是否存在该条新数据

redis数据一致性的实现示例

redis数据一致性的实现示例

四、redis缓存一致性实现(方案2)

定期清除redis中的数据,例如设置一个定时任务,每当一个小时的时候就会清除redis中的数据,也就是让redis中的数据失效,然后再次保存、删除的时候之前的 redis中的数据已经不存在,所以相当于是将数据重新设置到redis中去,所以可以保证数据的一致性。

到此这篇关于redis数据一致性的实现示例的文章就介绍到这了,更多相关redis数据一致性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
Redis持久化与主从复制的实践
Apr 27 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
详解Redis瘦身指南
May 26 Redis
Redis基于Bitmap实现用户签到功能
Jun 20 Redis
Redis的字符串是如何实现的
Oct 24 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
使用Redis实现点赞取消点赞的详细代码
Mar 20 Redis
redis调用二维码时的不断刷新排查分析
Apr 01 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
Redis Lua脚本实现ip限流示例
Jul 15 Redis
基于redis+lua进行限流的方法
Jul 23 Redis
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Redis中有序集合的内部实现方式的详细介绍
Mar 16 #Redis
面试分析分布式架构Redis热点key大Value解决方案
You might like
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
python+django快速实现文件上传
2016/10/24 Python
python 容器总结整理
2017/04/04 Python
Python实现简易Web爬虫详解
2018/01/03 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python向excel中写入数据的方法
2019/05/05 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
Java的for语句中break, continue和return的区别
2013/12/19 面试题
如何开启linux的ssh服务
2013/06/03 面试题
兴趣小组活动总结
2014/05/05 职场文书