业务开发中,在涉及业务缓存时,会存在数据库与缓存之间的一致性问题。
要求强一致的业务,以数据库数据为准。
业务场景存在以下两个业务方法:
读方法:在没有读到缓存数据时,从数据库取然后更新缓存
更新方法
更新方法常见的缓存更新策略有:
1.更新数据库记录,删除该缓存
这种方案会存在以下问题:
更新事务将要提交,
读请求发现缓存失效了这时从数据库取出旧的数据,
更新事务提交,删除缓存
读请求将旧数据放入缓存
可以发现最终缓存中的数据是旧的
2.解决第1种方案存在的问题
本质上是由于读方法也有写操作,一般是读方法在读不到缓存数据时,查找下是否当前有更新操作,有则读方法不做缓存更新直接返回。这里的方案是更新操作会将当前key放入缓存中。读方法查看是否有更新操作从这里取。当然这里的代表更新操作key最好设置下失效时间。
另外一种方案是:业务操作只更新数据库,缓存更新由异步线程去做,这里的异步线程可以是独立的缓存更新组件。缓存更新组件获取db增量修改操作,然后做缓存更新。
还有一种利用版本号来做控制:读请求捞出的数据是旧的情况下,它的版本号肯定比更新后的版本号低,所以在做更新写入缓存的时候可以用这个来判断。
也可以在更新缓存时加锁,能得到锁的可以做更新,用redis锁。