阆中网站建设01hl怎么做网站 先简单的聊一下

当前位置: 首页 > news >正文

阆中网站建设01hl,怎么做网站 先简单的聊一下,免费好用的crm软件,semen文章目录 引言正文读写缓存的数据一致性只读缓存的数据一致性删除和修改数据不一致问题操作执行失败导致数据不一致解决办法 多线程访问导致数据不一致问题总结 总结参考信息 引言 最近面试快手的时候被问到了缓存不一致怎么解决#xff1f;一开始还是很懵的#xff0c;因为… 文章目录 引言正文读写缓存的数据一致性只读缓存的数据一致性删除和修改数据不一致问题操作执行失败导致数据不一致解决办法 多线程访问导致数据不一致问题总结 总结参考信息 引言 最近面试快手的时候被问到了缓存不一致怎么解决一开始还是很懵的因为会默认将自己带到一个错误的前提下就是数据已经不一致了你怎么办可能会想遍历缓存删除比对数据是不是一致的。停下来想一下一般是修改数据库的时候你应该怎么操作缓存才能保证缓存的一致性。我就知道要么删除缓存后续重建要么直接修改缓存但是我对于这两种场景的方法了解的并不多今天借这个机会完全整理一下 正文 数据一致分几种情况 缓存中有数据必须要和数据库中的数据一致缓存中本身没有数据数据库中的值必须要是最新的 常见的缓存的策略主要有两种分别是读写缓存和只读缓存不同策略保证缓存一致性的方式是不一样。具体如下 读写缓存的数据一致性 读写缓存是对于数据的所有增删改都需要在缓存中进行然后在采取对应的写回策略。主要有两种写回策略 同步直写策略异步写回策略 同步直写策略 写缓存的时候同步写数据库缓存和数据库中的数据是一致的。 需要通过事务机制保证缓存和数据库更新的原子性一般是通过tranactional修饰 要么同步更新成功要么同步更新失败下次重试 异步写回策略 写缓存的时候不同步写入缓存等到数据从缓存中淘汰的时候在写入数据库。 问题 一旦缓存崩溃在缓存中保存的数据都会崩溃丢失 只读缓存的数据一致性 如果有数据更新数据增加和修改直接写入数据库缓存只负责读数据 在下述过程中可以看到整个过程是涉及到多步骤多线程的除了对于数据的操作是具有原子性的不可打断的其他的读数据包括数据库同步删除缓存中的数据都会存在可能的中断或者其他线程切入的操作
新增数据情况》不会出现数据不一致的情况 但是删除数据或者修改数据不一样了因为中间涉及到需要删除缓存中的数据这一步执行失败会导致数据不一致的情况具体情况见下一节 删除和修改数据不一致问题 操作执行失败导致数据不一致 操作分析 对于删除或者修改数据的操作需要同时修改缓存和操作数据库任何一方都有可能执行失败因为没有办法保证双方的操作具有原子性也就是同时失败或者同时成功。下面按照情况进行逐个分析分别是删除缓存失败和删除数据库失败两种情况。 删除缓存失败 在下述过程中删除缓存失败导致缓存中保存旧版的数据数据库是新版的数据两者不一致。
修改数据库失败 修改数据库失败了删除缓存成功了但是在二次访问会重建缓存将数据库中的脏数据还原到缓存中还是会出现访问错误数据的情况
总结 两种操作执行失败带来的数据不一致的情况如下 不同情况潜在问题先删除缓存在更新数据库数据库更新失败导致请求再次访问缓存时发现缓存缺失重建缓存读到的还是旧的数据先更新数据库再删除缓存的缓存删除失败有请求再次访问缓存时发现缓存命中返回脏数据和数据库不一致 解决办法 在上述两种情况中如果修改数据库的操作执行失败了其实不会产生数据不一致的问题因为缓存中的数据和数据库中的数据是一致的后续数据库执行相应的处理策略。但是缓存删除执行失败就不一样了。所以这个解决办法主要是针对缓存删除失败的情况而指定的。 消息队列重试 在进行删除或者修改数据时将数据保存到消息队列中如果执行失败再通过消息队列重试执行如果执行成功了就从消息队列中删除对应的值。 在重试这段时间一般是存在数据不一致性一般是通过如下方式解决 引入分布式锁加锁防止其他数据在访问会降低并发性 多线程访问导致数据不一致问题 因为同步缓存需要两步分别是修改数据库和缓存这两个步骤之间一般来说不会加锁这样会降低并发性不加锁就意味着会出现多线程访问问题导致数据的不一致。按照更新数据库和缓存的先后主要分为两种情况这里具体讨论一下 1、先修改数据库然后在删除缓存访问 时间线程1线程2问题t1删除数据库中的数据at2读取缓存中的数据a缓存命中读取到不存在的旧值a线程1尚且没有完全删除缓存值线程2读到缓存中的脏数据at3删除缓存中的数据a 总结 这种情况持续的时间会很短因为仅仅只要线程1被切换回来成功删除缓存中值就能保证后续数据的一致性并不需要额外的人工干预。影响小
1、先修改数据库然后在删除缓存访问 时间线程1线程2问题t1删除缓存中的数据at2读取缓存中的数据a缓存没有命中访问旧版数据库重建缓存a1、线程1没有更新数据库的值线程2会读到旧值只要缓存不过期中间后续所有线程读到的都是旧值t3更新数据库中的数据a缓存中是旧值数据库中是新值两者不一样 解决办法延迟双删 修改完数据库之后再进行一次缓存删除操作执行两次保证的缓存的数据重建来自更新之后的数据库具体指令如下 redis.delKey(x); db.update(x); Thread.sleep(N); redis.delKey(x);总结 推荐先删除数据库再删除缓存主要原因有以下两点 先删除缓存再删除数据库导致请求因为缓存缺失而访问数据库给数据库带来压力延迟双删的时间不好确定 如果对于数据一致性有强要求 更新数据库的时候暂停redis缓存发送请求等都弄完了再发送 总结 不总结不知道之前知道的太浅薄了关于redis了解的不够深刻实际上数据不一致不仅仅是删除或者更新缓存那么简单中间还会涉及到多线程的问题因为多个更新数据库和删除缓存并不具有原子性中间有可能被打断所以需要分情况进行讨论。出现数据不一致的情况的以及对应的解决方式有两种具体如下 数据不一致原因解决办法删除redis执行失败消息队列重试多线程导致数据不一致延迟双删策略 参考信息 缓存异常——如何解决缓存和数据库不一致的问题