在一个大的项目中, 使用了全缓存模型, 即, 所有数据都会经过cache.
简单分层: 应用->内存缓存->redis缓存->数据库
是一个典型的 多读写少
的场景, 并且数据量, 请求量非常大.
总结了一些使用经验, 供参考
1. 更新缓存的Design Pattern: 使用Cache aside
简洁优雅
关于缓存更新, 可以阅读这篇文章: CoolShell: 缓存更新的套路
为什么选择 Cache Aside Pattern
, 因为这个模式足够简单, 出现不一致的概率非常低, 对于大多数项目来说够用了.
而其他几种模式, 复杂度会高很多.
2. 并发很高时, 需要防缓存击穿
当并发很高的时候, 一个热点 key
失效, 会触发回数据库重查的逻辑, 此时会有大量请求落到数据库
需要做防缓存击穿的处理.
一般各种语言的库, 都有考虑到这一点, 例如 go-redis/cache
如果是golang并且自定义了cache, 可以使用 singleflight , 其他语言也可以找类似机制的库.
这个库很轻量
# define type Cache struct { name string