我们都知道,在开发过程中,很多时候都会用到我们的缓存,而缓存的种类也是五花八门的,我们今天来了解的就是关于缓存中的一种,那就是Redis。
Redisredis是一个key-value存储系统。
(资料图片)
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
今天我们不说这个Redis的主从同步,我们来说说我们最常使用Redis的时候,会导致的一些问题。
Redis和 Mysql 如何保持一致说到这个一致性,了不起就得和大家说道说道了,为什么会出现这种情况呢?实际上就是和Redis的使用有很大的关系。
都知道,Redis是一个NoSQL的数据库,而且他还很快,所以很多数据都会从Mysql中把数据取出来,然后放到我们的缓存中,然后下次读取数据的时候,从Redis中直接去读取,这个时候,我们就会出现问题了。
什么问题呢?
在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到Redis,而不是直接访问MySQL等数据库。
这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。
读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存Redis和数据库MySQL间的数据一致性问题。
不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。
举一个例子:
1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则到数据库中读取数据,写入缓存,此时缓存中为脏数据。
2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。
因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。
其实解决方案也有不是少,今天了不起来给大家分析一下 Redis 和 Mysql 保证数据一致性的实现方案。
缓存和数据库一致性解决方案延时双删策略延时双删策略步骤如下:
1.先删除缓存2.再写数据库3.休眠N毫秒4.再次删除缓存其实我们可以来想一下,如果有三个线程,分别是 线程1 ,线程2,线程3,三个线程,
其中,线程1先删除缓存;
线程2读取缓存为null,同步db数据到缓存中;
线程1更新db中的数据;
线程3查询缓存中数据是旧数据;
这样的话,就会出现Mysql和Redis中的数据不一致,这时候采用延迟双删策略,去保证数据的一致性,
这时候就有人问了,为什么要休眠一段时间,然后再执行呢?
假象一下,如果没有第三步操作时,有很大概率,在两次删除Redis操作执行完毕之后,数据库的数据还没有更新,此时若有请求访问数据,便会出现我们一开始提到的数据不一致的问题。
为什么还要再次删除缓存呢?
如果我们没有第二次删除操作,此时有请求访问数据,有可能是访问的之前未做修改的Redis数据,删除操作执行后,Redis为空,有请求进来时,便会去访问数据库,此时数据库中的数据已是更新后的数据,保证了数据的一致性。
因为感觉这种延迟双删除可靠性并没有那么高,因为我们并不能保证删除 Redis 成功,也不能保证数据库更新也是成功的,也就是我们所说的原子性,两个组合起来只是在理想情况下。
比如双删失败我们应该怎么处理呢?
1、设置缓存过期时间从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。
结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致。
2、重试方案重试方案有两种实现,一种在业务层做,另外一种实现中间件负责处理。
然而,该方案有一个缺点,对业务线代码造成大量的侵入。
流程如下:
1.更新数据库数据;
2.缓存因为种种问题删除失败;
3.将消费消息,获得需要删除的key;
4.自己消费消息,获得需要删除的key;
5.重试删除操作,直到成功。
而这个放在业务层去处理的话,侵入太高,所以一般是不太推荐使用来解决这个问题。
但是呢,还有一个就是使用中间件来进行处理。
启动一个订阅程序去订阅数据库的binlog,获得需要操作的数据。在应用程序中,另起一段程序,获得这个订阅程序传来的信息,进行删除缓存操作。
流程如下:
1.更新数据库数据;
2.数据库会将操作信息写入binlog日志当中;
3.订阅程序提取出所需要的数据以及key;
4.另起一段非业务代码,获得该信息;
5.尝试删除缓存操作,发现删除失败;
6.将这些信息发送至消息队列;
7.重新从消息队列中获得该数据,重试操作。
关于延迟双删除策略,你学会了么?
上一篇:当前观点:女孩因“追星”努力学习保送北大 基本信息讲解
下一篇:最后一页
我们都知道,在开发过程中,很多时候都会用到我们的缓存,而缓存的种类也是五花八门的,我们今天来了解的就
大家好,今日关于【女孩因“追星”努力学习保送北大】的话题登上了各大平台的热搜榜,受到全网的关注度...
每个人的童年梦想都会实现。
1、形容词+的+名词形容词+地正确使用“的、地、得”说话、写文章经常要用到“的、地、得”这几个字。2、...
近日,由中国电建投资建设的尼泊尔上马相迪A水电站2023年度累计发电量突破1亿千瓦时,为当地经济社会发展作
1、阿里云服务器购置 首先,你需要有一个阿里云账号。2、 使用云翼计划用学生身份可以以¥9-10 月的
相信目前很多小伙伴对于黑油山都比较感兴趣,那么小搜今天在网上也是收集了一些与黑油山相关的信息来分享给
来为大家解答以上的问题。有机卤化反应原理及应用,机卤化反应原理及应用介绍这个很多人还不知道,现在让我
今天来聊聊关于新房子除甲醛最快的方法,新房子除甲醛的方法的文章,现在就为大家来简单介绍下新房子除甲醛
1、漏尿的主要原因就可能是膀胱的问题,或者是盆底括约肌的问题,这个建议去医院的妇科泌尿科或者是产后康
dynamic_loaderhttps: gitee com wzh1845462801 dynamic_loader作者:wzhdynamic_loader介绍本项目是一个在单片机(如:STM
演讲中的王笑楠图源:时代财经蓬松的披肩长发、星星状耳坠、合体的黑色裙装……5月23日,90后清华大学副...
记者25日获悉,现代艺术大师亨利·马蒂斯在中国的首次大型个展“马蒂斯的马蒂斯”将于暑期率先登陆北...
1、辣椒原产于南美洲的墨西哥,约在明末清初初传入中国。2、辣椒性味都是辛热,具有湿中散寒,开胃除湿之功
1、申请银行贷款的抵押物分别为:房屋所有权、出让性质的国有土地使用权、机器设备所有权。2、申请银行贷款
今天来聊聊关于赵仁成的文章,现在就为大家来简单介绍下赵仁成,希望对各位小伙伴们有所帮助。1、赵仁成个
【长城汽车:公司经营状况稳健并未发生重大改变】长城汽车(601633)5月25日晚间公告,公司于2023年5月25日上
本周硅片价格收窄跌幅。N型单晶硅片(182mm 130μm)成交均价为4 32元 片;M10单晶硅片(182mm 150μm)成交均价为4 22元 片,
2023年5月25日,招商局置地(00978)盘中最低跌2 20%,一度触及0 445港元,股价创2010年12月3日以来新低。
我国科研人员开发了一种边缘圆滑处理技术,基于该技术研发的柔性单晶硅太阳能电池,薄如纸,厚度60微米,而
鹤峰添新喜!荣获全国“特色魅力茶乡”称号5月20日至24日,第五届中国国际茶叶博览会在浙江杭州国际博...
1、读大学,不管国内外高校,名气太重要了,建议你重点考虑清华大学。2、麦克马斯特大学虽然很好,但即使在
要说最近热门话题榜的常客,乘风破浪的姐姐们自然当仁不让:在各自领域早有建树的她们仍旧逆龄奋斗,凭借惊
几个月前,您可能听说过ehBackboneOne-PlayStationEditionforiOS。现在,Backbone很高兴地宣布,这款官方授
以下是亚普股份在北京时间5月25日13:00分盘口异动快照:5月25日,亚普股份盘中快速反弹,5分钟内涨幅超过2%
X 关闭
X 关闭