缓存设计

需求

提升性能,内存缓存是关键,经典LRU根据访问频率更新,不能完全满足需求,通常业务更需要基于时间或事件触发更新。针对要求实时更新(用户信息、配置)和可以延迟更新(评论、动态列表)的数据,需要设计不同的缓存更新策略。

三种更新策略

即每个缓存key在put时记录有效期,当有效期到达时清理key(一般语言都有对应的库实现

当get时,key存在则说明缓存有效,使用该缓存,否则查询db并更新缓存

即每次存储数据被修改时,发出事件通知

所有读数据的服务监听该事件通知(可通过redis或消息队列实现),收到修改事件时更新对应缓存key

在get缓存数据时进行校验,缓存有效即使用,缓存无效查询db并更新

有效检查策略1:

数据添加版本号字段(可选用修改点的时间戳或数据的md5),db和缓存同时记录该版本号。

db更新的同时修改版本号,查询时缓存的版本号和db的做比较(从db拉去版本号效率远高于拉所有数据)

流程示意图:

image-20220509115247729

业务使用

基于点击频率的LRU实现

 

布隆过滤器

选取合适的hash算法,将目标字符串映射到对应的比特位上

比如:

"baidu": 1、4、7

"tencent": 3、4、8

查询 google:

  1. 假设google通过hash: 1、5、8
  2. 5位置上时0,则说明: "google"不存在

查询app le:

  1. 假设apple通过hash:1、3、8
  1. 1、3、8位都是1,则说明:"apple"可能存在

注意: 传统的布隆过滤器并不支持删除操作

常见缓存问题

缓存穿透

缓存和数据库都没有的数据,被大量请求

解决方案:

缓存击穿

缓存突然失效了,这时候如果有大量用户请求该数据

解决方案:

缓存雪崩

大量的缓存的数据,在同一个时间点过期

解决方案: