redis与数据库双写一致性的问题,即缓存与数据库在双写时如何保证一致?
一致性
- 强一致性:要求系统写入什么,读出来也会是什么,用户体验好,但是对系统性能要求高
- 弱一致性:在系统写入成功后,不承诺可以立即读取到写入的值,多久数据达到一致也不确定。
- 最终一致性:在系统写入成功后,保证在一定时间内,能够达到数据一致状态。
经典缓存模式
1、Cache-Aside Pattern(旁路缓存模式)
- cache-asid 读流程
- cache-asid 写流程
2、read-through/write-through(读写穿透)
- read-through
看似read-through与cache-asid读流程一样,其实内部有些区别,在读缓存的上一层read-through封装了一层cache provider,用来统一调用缓存和数据库;让代码更简洁,减少数据源上的负载
- write-through 在写请求下,也是通过cache provider层统一更新数据库和缓存;
3、write behind(异步缓存写入)
write behind跟read-through/write-through有相似的地方,都是由cache provider来负责缓存和数据库读写;不同的是read/write through 是同步更新缓存和数据库,而write behind只更新缓存,之后通过批量异步的方式更新数据库。
该模式适合频繁写的场景,mysql的innodb buffer pool机制就是使用这种模式。