一线大厂Redis高并发缓存架构(待完善)

场景1:秒杀库存场景, 10000人抢100个商品

如果用普通的分布式锁实现, 最后抢到的人,要等前面99个人抢完

优化方案:可用分段锁, 降低锁的粒度, 比如1-10库存用锁product:101_1,11-20库存用锁product:101_2等, 提高并发性能

代码:==

场景2: 商品的增删改查

查询:先从缓存获取,缓存没有查库, 查到库之后放入缓存

新增/修改:取数据库更新货品,删除缓存

问题1:99%的商品都是冷门商品, 不应该全部放在redis缓存

解决:设置缓存有效期, 例如一天,每次查询时将锁延期(ttl命令很快), 实现冷热数据分离。如果每天访问的热数据还是很多, 可以用缓存淘汰策略。

问题2: 缓存击穿。例如某些批量操作, 批量查库, 批量放缓存一天, 缓存同时过期, 下次批量操作时, 大量请求直接打到数据库,数据库顶多只能扛几万的qps

解决:缓存过期时间加上随机数, 分散过期, 分散查库压力

问题3: 缓存穿透。

例如某个热门商品被后台小二误删, 客户端还有很多人访问,会有大量请求持续打到数据库;

例如黑客攻击,浏览器编辑url访问一个不存在的商品id,

解决:

  • 将不存在商品缓存NULL, 下次直接从缓存拿
  • 布隆过滤器

问题4:黑客用脚本批量访问很多不存在的商品id,导致Redis缓存很多不存在的值是NULL商品

解决:NULL商品缓存有效期可以设置短一点, 例如1分钟

大纲
ReadLock解决以及缺陷 > 主从同步  & 持久化
减库存场景 > 分段锁降低锁粒度
冷热数据分离 > 查数据时,锁延期
缓存击穿,缓存穿透 随机时间, 缓存NULL(NULL过期时间不用太长), 布隆过滤器
冷门数据突变成热点数据问题  分布式锁 双重检查
缓存数据双写不一致问题 >  读多写少 加读写锁(Redisson_WriteReadLock)
部分场景tryLock代替lock 串行转并行
Redis雪崩 大V发热点新闻 大量请求同时访问Redis    
1. 限流 
2. 多级缓存(加一层JVM缓存),encache设置过期时间, mq广播更新本地缓存
3. 热点缓存系统, 客户端只查JVM缓存, 服务端更新JVM缓存
 

你可能感兴趣的:(缓存,redis,架构)