架构师-第六阶段:缓存架构
- 缓存:进程内缓存要怎么玩?
- 什么是进程内的缓存
- 带锁的 map
- leveldb
- 进程内缓存能存储缓存服务有的数据(json、html、object)
- 进程内缓存的好处,效率高,不需要访问 db
- 不足:一致性难以保障
- 方案:
- 什么时候可以用进程内缓存
- 只读数据
- 并发极高,透传后端压力极大,例如:秒杀类业务
- 允许一定程度上数据不一致
- 什么是进程内的缓存
- 缓存:很多时候我们都用错了!
- 常见误用
- 总结
- 服务与服务之间不要通过缓存传递数据
- 高可用缓存或者水平切分
- 调用方不宜单独使用缓存
- 不同服务,缓存应该做垂直拆分,不宜共用缓存
- 缓存:互联网最佳实践!
- 淘汰缓存,而不是更新缓存
- 先操作数据库,再操作缓存
- 总结
- 缓存:一致性优化!
缓存不一致出现在 数据库主从不一致
数据库与缓存不一致
解决思路:在主从同步完成后,如果有旧数据入缓存,应该及时把旧数据淘汰掉
总结
- 缓存:并发更新的大坑!
- 并发申请微信的 token 会让 token 相互失效
- 解决方案
- 总结
- 缓存:究竟选redis,还是memcache?
- 什么时候选择 redis ?
- 复杂的数据结构
- 持久化
- 天然高可用,自身支持集群
- 存储的内容比较大
- 什么时候选择 mc ?
- 纯 KV
- 存储 key 的数据量大、并发量大
- 原因
- 内存分配,预分配
- 虚拟内存的使用,mc 存在物理内存里;redis 存在虚拟机里,当物理内存不够的时候,会频繁刷盘把数据写入到硬盘里,影响性能
- redis的 CPU 计算复杂
- 线程模型:mc 多线程(适合多核机器),redis 单线程
- 什么时候选择 redis ?
- 千万级流量,架构该怎么玩?
服务化
数据库
缓存