数据库与缓存一致性协议

本文是关于数据库于缓存二者如何保持较高的一致性问题,先抛出我的观点:

先删缓存,再更新db,再回写缓存
如下图,大体分两步,1:数据写流程,包括update/delete 2:是读流程
数据库与缓存一致性协议
先描述一下写流程:
1:写入
2:删除缓存key并且setnx一个key_lock 如果失败根据自己业务特性抛错,异步重试 或者报警
3:redis 命令都执行成功后更新DB 本步如果失败参考步骤1的异常处理
4:更新缓存并且删除 key_lock 如果本步失败,不做任何处理.
写的流程基本上就前面三步
再看一下读流程
2.1:读缓存,缓存是否为空,如果此处缓存为空有两个原因1:程序第一次加载数据.2:此时的流程正处于2-4的区间
2.2:get key_lock 检查是否有程序对此key有更新操作.如果有则跳到2.3,否跳到2.4
2.3:此时锁是打开状态,则让程序直接读db.用db保证数据一致性,让锁的计数器+1,如果计数器达到一定阈值走报警流程,人工处理
2.4:此时锁是关闭状态,代表数据是首次加载,则在db中读取数据后更新缓存

有什么问题的话可以留言讨论