|真香,数据库和缓存一致性的几种实现方式( 二 )


后台会有一个线程消费内存队列里面的数据 , 然后一条一条的执行 。 这样的话 , 一个更新数据的操作 , 先删除缓存 , 然后再去更新数据库 , 但是还没完成更新 。 此时如果一个读请求过来 , 读到了空的缓存 , 那么先将缓存更新的请求发送到队列中 , 此时会在队列中积压 , 然后同步等待缓存更新完成 。
这里有一个优化点 , 一个队列中 , 其实多个更新缓存请求串在一起是没意义的 , 因此可以做过滤 , 如果发现队列中已经有一个更新缓存的请求了 , 那么就不用再放个更新请求操作进去了 , 直接等待前面的更新操作请求完成即可 。
【|真香,数据库和缓存一致性的几种实现方式】等内存队列中将更新数据的操作完成之后 , 才会去执行下一个操作 , 也就是读数据的操作 , 此时会从数据库中读取最新的值 , 然后写入缓存中 。如果请求还在等待时间范围内 , 不断轮询发现可以取到值了 , 那么就直接返回;如果请求等待的时间超过一定时长 , 那么这一次直接从数据库中读取 。
总结
上面说的几种方案 , 都是比较常见的 , 也比较简单 , 没有十全十美的 , 最后的内存队列也会影响性能以及增加系统的复杂度 。 今天讨论的Redis和数据库的数据更新是不可能通过事务达到统一的 , 什么叫做事务 , 就是一损俱损一荣俱荣 , 要么都成功要么都失败 , 这是不能保证的 。
我们只能根据相应的场景和所需要付出的代价来采取一些措施 , 降低数据不一致的问题出现的概率 , 在数据一致性和性能之间取得一个权衡 , 具体场景具体使用 。
作者:jack_xu链接:https://juejin.im/post/5edafcb051882543023c0cd0


推荐阅读