这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【 什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?】

大家好,我是IT修真院上海分院第10期的学员许东杰,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务六,深度思考中的知识点——

什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?

(1)背景介绍:

脏数据:从目标中取出的数据已经过期、错误或者没有意义,这种数据就叫做脏数据。

脏读:读取出来脏数据就叫脏读。

(2)知识剖析:

1、数据库中的并发事务处理问题:

脏读:在并发访问的情况下,不同的事务对相同的数据进行操作,在事务A修改数据还未提交的时候,事务B对该数据进行读取,读出了事物A修改过后的数据,但是事物A最终没有提交,这种情况就是数据库中的脏读情况

更新丢失:对于同一行数据不同事务进行更新,结果覆盖

幻读:事务A前后两次读取,后一次读取的数据变多了,事物B在两次读取中间已经进行数据插入

不可重复读:事务A读取了事务B修改前后的两次数据,不符合隔离型

隔离等级:可以解决上述问题,mysql默认可重复读的隔离等级,只会存在读取的数据和数据库不一致的问题

2、mybati一级缓存中的脏数据:

mybatis的一级缓存:默认是SqlSession级别,只要通过session查过的数据,都会放在session上,下一次再查询相同id的数据,都直接冲缓存中取出来,而不用到数据库里去取了。

mybatis一级缓存脏数据:当有不同的sqlSession在对数据库进行操作,一级缓存只能保证当前sqlSession中的增删改在一级缓存中自动更新,就会产生脏数据。

3、mybati二级缓存中的脏数据:

mybatis二级缓存:是SessionFactory级别,和namespace绑定,同一个namespace放到一个缓存对象中,当这个namaspace中执行了非sselect语句的时候,整个namespace中的缓存全部清除掉。

mybatis二级缓存脏数据:引起脏读的操作通常发生在多表关联操作中,比如在两个不同的mapper中都涉及到同一个表的增删改查操作,当其中一个mapper对这张表进行查询操作,此时另一个mapper进行了更新操作刷新缓存,然后第一个mapper又查询了一次,那么这次查询出的数据是脏数据。出现脏读的原因是他们的操作的缓存并不是同一个。

所以不推荐使用mybatis的自带一二级缓存,推荐使用第三方缓存:memcached或者redis。

(3)常见问题:

redis中怎么更新缓存避免脏读?

(4)解决方案:

读写部分:

if(redis存在数据){

读取redis数据

}else{

数据库读取,同时存redis+设置超时时间

更新部分:

if(数据库update){

更新redis+设置超时时间

(5)编码实战:

演示读写部分和更新部分

(6)拓展思考:

还有哪些其他方式进行redis数据更新

1、主动更新:后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存(或者用定时任务来做)

问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验,如果高并发穿透DB,可能导致服务器崩溃

2、由用户触发更新:前台获取数据时发现没有缓存数据就会去数据库同步数据到缓存

问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作

3、提前加载好数据:后台点击更新缓存按钮,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据

问题:逻辑相对麻烦,而且更新机制无法通用

(7)参考文献:

百度谷歌

(8)更多讨论:

Q1:数据库脏数据和redis脏数据的区别?

A1:数据库脏数据是用户对数据进行操作存储,存储的数据和实际不符合,redis脏数据是相对于数据库数据而言的,redis的数据和数据库中数据不一致就会导致脏数据
Q2:文中代码实战中的redis更新方式有什么缺点?

A2:缺点:增加的判断的方法,效率偏低,当并发量高时,效率影响会更大
Q3:主动更新方式进行redis更新怎么实现?
A3:在后台管理中,设置一个按钮,更新redis的操作,一般在晚上用户访问量少的时候,数据从数据库中查出后放入redis

(9)鸣谢:

感谢朱明星师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?相关推荐

  1. 若 PPP 协议使用同步传输技术,接收端收到的数据段中出现比特串“01011111001111101”,则真正的数据应该是()

    若 PPP 协议使用同步传输技术,接收端收到的数据段中出现比特 串"01011111001111101",则真正的数据应该是 (B ) A. 0101111100111111 B. ...

  2. html间接收post传递的数据,HTML5中使用postMessage实现两个网页间传递数据

    估计很少人知道HTML5 APIS里有一个window.postMessage API.window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息.基本上,它就像 ...

  3. java输入多个数据_Java中怎么读入一行输入空格隔开的多个数据

    展开全部 import java.util.Scanner; public class ReadData{ public static void main(String[] args) { ReadD ...

  4. 《十四》微信小程序中的常用 API之登录、获取用户信息、支付、提现、跳转小程序、网络请求、弹框、导航、数据缓存、图片、查看文档、音频、拨打电话、剪贴板、滚动、WXML

    微信小程序提供了 wx 这个全局变量,通过这个全局变量可以调用微信小程序的 API. 登录: wx.login():获取登录凭证 code.通过登录凭证 code 进而换取用户登录态信息,包括用户在当 ...

  5. jquery源码解析:jQuery数据缓存机制详解2

    上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...

  6. 云原生大数据架构中实时计算维表和结果表的选型实践

    简介: 随着互联网技术的日渐发展.数据规模的扩大与复杂的需求场景的产生,传统的大数据架构无法承载. 作者 | 志羽 来源 | 阿里技术公众号 一 前言 传统的大数据技术起源于 Google 三架马车 ...

  7. 大数据场景中语言虚拟机的应用和挑战

    点击上方蓝字关注我们 大数据场景中语言虚拟机的应用和挑战 吴明瑜1,2, 陈海波1,2, 臧斌宇1,2 1 领域操作系统教育部工程研究中心,上海 200240 2 上海交通大学软件学院并行与分布式系统 ...

  8. 数据缓存层及相关知识

    数据缓存层的开发 数据缓存层用于对访问过的数据进行缓存,以提高访问效率.本书所讲述的数据缓存是以表为单位的数据缓存. 数据缓存层的原理 数据缓存层实际上就是对一个巨大的存在于内存中的DataSet进行 ...

  9. Spring Boot 实践折腾记(12):支持数据缓存Cache

    不管是什么类型的应用程序,都离不开数据,即便如现在的手机APP,我们依然需要使用数数据库,对于不懂的人,当然,我们可以告诉他们一些高大上的概念,但是作为专业人士,就一定要明白背后的真实原理到底是什么. ...

  10. SpringBoot25-spingboot数据访问-数据缓存Cache

    我们知道一个程序的瓶颈在于数据库,我们也知道内存的速度是大大快于硬盘的速度的.当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法调 ...

最新文章

  1. ASP.NET(一):Reques对象和Response对象的区别,以及IsPostBack属性的用法
  2. 监视mysql 哪些指标_MySQL 监控指标
  3. python没基础可以学吗-没编程基础可以学python吗
  4. 图像孔洞填充与小连通域的删除
  5. python生成字母图片_Python 模拟动态产生字母验证码图片功能
  6. ZYNQ UARTLite接收不定长数据
  7. c语言源程序要求每行只能书写一条语句,C语言章节习题集(全)
  8. dependency in POM.xml will lead to jQuery.sap.require
  9. SAP UI5 different cache results
  10. 如何使用IIS重写模块将HTTP重定向到HTTPS
  11. Objective-C的内省(Introspection)小结
  12. 好奇:WayOs破解、OEM、修复、打包等工具大全,满足大家的好奇心发下截图
  13. kafka架构、基本术语、消息存储结构
  14. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)
  15. pip安装软件报错:Cannot uninstall 'requests'. It is a distutils installed.........
  16. js一键批量打印_(原创)javascript 实现批量打印《简历》
  17. 鼠标右键没有新建选项怎么办
  18. 如何将FPGA程序固化到外部Flash存储器
  19. 艾宾浩斯遗忘曲线函数
  20. 23行代码下载逆水寒壁纸图片

热门文章

  1. php微博程序,五款国内微博程序:Xweibo、Iweibo、Easytalk、PageCookery、记事狗
  2. 熟练计算机数字键盘,电脑键盘盲打及快速输入技巧【一】
  3. Linuxbt下载工具-Transmission-支持命令行
  4. 计算机毕业设计java+ssm的在线投票管理系统(源码+系统+mysql数据库+Lw文档)
  5. 计算机网络基础试题库4答案,计算机网络基础试题库4.doc
  6. MATLAB中范数norm()函数精讲
  7. 维智WSDA系列伺服驱动器用户手册(MECHATROLINK-Ⅱ总线通信型)-R7
  8. 营销数字化转型行业实践
  9. 带下拉菜单截图 巧用PrtSc截图键
  10. 日志分析工具、日志管理系统、syslog分析