Redis缓存与数据库一致性解决方案

背景

       缓存是数据库的副本,应用在查询数据时,先从缓存中查询,如果命中直接返回,如果未命中,去数据库查询最新数据并返回,同时写入缓存。

      缓存能够有效地加速应用的读写速度,同时也可以降低后端负载。是应用架构中常用的一种技术。

问题

      当业务发生时,系统状态改变,需要同时修改数据库和缓存的数据。如何保证应用从缓存读取到最新的数据,且即使数据库立即崩溃,数据也不丢失?这就是缓存与数据库的一致性问题。

分析

      一个系统状态同时存在于缓存和数据库,缓存是数据库的副本,数据库可以读和写,把缓存的写看作是读缓存未命中的一部分,则缓存只有读。只要保证数据库的写对缓存的可见性,就能保证它们的一致性。

解决方案

读缓存

如果命中直接返回。

如果未命中

获取key对应的分布式锁

读数据库

返回结果并更新缓存

释放key对应的分布式锁

写数据库

获取缓存key对应的分布式锁

操作缓存删除键

修改数据库

释放缓存key对应的分布式锁

总结

        在系统状态不变时,缓存与数据库是一致的。在系统状态变化时,通过分布式锁串行化对状态的读写。写时先让缓存(即数据库副本)失效,只需保证数据库本身的更新;写后的读操作恢复缓存。即状态变化过程中,只有数据库保存状态,没有副本,数据是一致的。

你可能感兴趣的:(Redis缓存与数据库一致性解决方案)