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

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

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

代码:==

场景2: 商品增删改查

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

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

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

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

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

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

问题3: 缓存穿透

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

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

解决

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

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

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

原文地址:https://blog.csdn.net/weixin_64027360/article/details/134725410

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24218.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注