西安免费建网站设计,东营市城市和建设管理局网站,织梦做的网站如何修改,电脑学校一#xff0c;使用方案
在使用redis作为缓存的场景下#xff0c;我们一般使用流程如下 二#xff0c;更新数据场景
我们此时修改个某条数据#xff0c;如何保证mysql数据库和redis缓存中的数据一致呢#xff1f; 按照常规思路有四种办法#xff0c;1.先更新mysql数据使用方案
在使用redis作为缓存的场景下我们一般使用流程如下 二更新数据场景
我们此时修改个某条数据如何保证mysql数据库和redis缓存中的数据一致呢 按照常规思路有四种办法1.先更新mysql数据再更新缓存数据 2.先更新缓存数据再更新mysql数据 3.先删除缓存再更新mysql数据 4.先更新mysql数据再删除缓存 。 这四种方法各有各的弊端并不能完全保证数据一致性采用“先写 MySQL再删除 Redis”的策略这种情况虽然也会存在两者不一致但是需要满足的条件有点苛刻所以是满足实时性条件下能尽量满足一致性的最优解。对于不是强一致性要求的业务可以容忍。什么情况下不能容忍呢比如秒杀业务、库存服务等。 为什么采用删除缓存而不是更新缓存是因为高并发下产生脏数据的要求要比更新缓存的要求更多也就是删除缓存产生脏数据的概率更小一些。 那么问题又来了在高并发的情况下 采用先删除缓存再更新数据库
请求A来了删除缓存请求A更新数据库发生卡顿同时来了请求B请求B发现没有缓存就从数据库查询了数据并生成了缓存此时请求A卡顿结束更新了数据库 这个情况下缓存中的就是脏数据。我们采用延时双删来解决 那么问题又来了第二次删除缓存失败了怎么办看下面先更新数据库再删除缓存 如果删除缓存失败怎么保证数据一致性 1.使用重试机制可以直接在接口中重试但是比较耗费性能 2.使用异步队列重试 3.使用rabbitmq消息中间件来处理 当用户操作写完数据库但删除缓存失败了产生一条mq消息发送给mq服务器。 mq消费者读取mq消息重试5次删除缓存。如果其中有任意一次成功了则返回成功。如果重试了5次还是失败则写入死信队列中。 当然在该方案中删除缓存可以完全走异步。即用户的写操作在写完数据库之后不用立刻删除一次缓存。而直接发送mq消息到mq服务器然后有mq消费者全权负责删除缓存的任务。 因为mq的实时性还是比较高的因此改良后的方案也是一种不错的选择。
总结以上方法只能保证最终一致性不能保证强一致性