1. 如何保证缓存与数据库的数据一致性?
要保持数据强一致性,只能将读请求和写请求串行化,在同一个内存队列里执行。但是串行化会导致系统的吞吐量大幅度降低,多用几倍的机器去支撑线上的请求。
2. 如果只要数据最终一致性,该怎么做呢?
- 缓存设置过期时间。
- 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
- 更新数据的时候,先更新数据库,然后再删除缓存。
3. 为什么是删除缓存,而不是更新缓存?
- 删除比更新更快捷。比如有些缓存值是由多个数据计算出来的,如果计算比较耗时,在高并发下,更新缓存的方式增加了读缓存不一致的概率。
- 有些缓存是冷数据,删除缓存等于是将更新缓存延迟到了读请求的时刻。
4. 如果删除缓存失败了,怎么解决?
- 将删除缓存的操作交给消息队列,删除了失败重试,但是这样对业务代码侵入比较强。
- 采用阿里的Canal,它可以订阅数据库的binlog,获得数据进行删除缓存操作。
参考(摘抄的文字版权属于原作者):
https://www.jianshu.com/p/fbe6a7928229
https://blog.csdn.net/chang384915878/article/details/86756463
https://www.codingbrick.com/archives/542.html