数据库缓存 设计

PHP常用redis缓存数据——R2m服务、redis2mysql库

  • 优先读取redis缓存,没缓存才读取数据库
  • 编辑数据,要清除对应的缓存

    问题:redis的带宽容易成为瓶颈

    可用服务器的redis做二级缓存,主数据来自本地redis,再对比远程redis的更新时间,能解决带宽问题,但还是避免不了网络IO

GO程序,免IO,免依赖,自建LRU缓存

数据查询

graph TD client(客户端) -- 构造key --> key{存在主键?} key -- 存在 --> hasCache{命中LRU缓存?} key -- 不存在 --> aliaskey{构造别名key} aliaskey --> alias{查找主键} alias -- 存在主键 --> hasCache alias -- 不存在主键 --> db hasCache -- 存在 --> cache("缓存数据") cache .-> close("返回数据") hasCache -- 不存在 --> db("数据库") db --> cache
### 数据更新
graph TD client(请求) -- 构造key --> key{存在主键?} client -- 更新 --> db("数据库") client --> publish(发布更新事件) publish --> other(服务其他实例) key -- 存在 --> hasCache{命中LRU缓存?} key -- 不存在 --> aliaskey{构造别名key} aliaskey --> alias{查找主键} alias -- 存在主键 --> hasCache hasCache -- 存在 --> cache("清除缓存数据") hasCache -- 不存在 --> end1("结束") db --> close(返回数据)

分布式缓存

一个服务有多个实例,每个实例的内存有限,所以 要分段缓存数据。 具体怎么分段?服务扩容、缩容?

Api => Srv,采用Hash一致性算法,https://juejin.im/post/5adfd32ff265da0b70258f1f

img

img

Copyright © xinyan all right reserved,powered by Gitbook该文件修订时间: 2020-07-29 10:10:33

results matching ""

    No results matching ""