缓存和数据库双写一致性问题 DB读写分离情况下,如何解决缓存和数据库不一致性问题?
DB读写分离情况下,如何解决缓存和数据库不一致性问题?
有两种选择。
让我们首先了解缓存和数据库数据不一致时会发生什么。查询数据时,优先从缓存中获取数据。如果缓存不存在,则查询数据库并写入缓存。如果数据库数据发生更改,请清除缓存。在正常情况下,没有问题。但是,在服务的并发性非常高的情况下,如果删除缓存,则在数据库完成数据更新之前会有查询请求。此时,旧数据将被读写到缓存中。在这种情况下,缓存和数据库不一致。
第一种解决方案:延迟删除。更改数据库数据时,清除缓存的操作会延迟一段时间。这段时间可能很短。它只需要确保数据库写入操作已完成。但在实际环境中,我们不知道数据库何时会写入数据,所以很难控制这段时间。如果太短,就不行了。如果时间太长,会影响体验。但总的来说,这种方法可以解决问题。
另一种解决方案是使用数据库的binlog来订阅binlog。更新数据时,该消息用于通知删除缓存。该方案能保证数据库更新操作的完成和缓存的及时更新。
有些“上古”程序员一直坚持反对使用redis怎么办?
分享大人物的答案似乎合情合理。
不要告诉我们是否使用redis。你必须告诉我们你为什么要使用redis。没有redis的业务怎么了?世界上没有免费的午餐。如果不直接使用头部缓存/NoSQL,可能会带来越来越严重的问题。
单个数据库的最大优点是易于实现事务,并由数据库本身保证。举个简单的例子,要下订单,需要扣除库存并插入订单条目。如果inventory和order都是数据库表条目,那么这个事务是无可挑剔的。如果库存在redis中,订单条目是mysql,通常需要先写redis,成功后再写数据库。如果您写数据库失败,需要回滚redis,如果由于网络或其他原因回滚失败,将再扣减一个存货。不要认为这些事情很容易解决。事务处理的复杂性远远超出您的想象。例如,当您编写mysql时,您在提交时就失去了连接。你无法判断提交是成功还是失败。你的redis是不是在倒退?
因此,当您引入一个新层时,您必须弄清楚您必须使用cache/NoSQL的目的以及您可以接受的一致性模型。否则,你就要出丑了。
缓存和数据库双写一致性问题 redis高并发保证数据一致性 redis一致性问题怎么解决
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。