FWQ
Redis分布式锁防止缓存击穿的实现
Redis分布式锁防止缓存击穿的实现 收藏 亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Redis分布式锁防止缓存击穿的实现》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下Redis缓存击穿,希望所有认真读完的童鞋们,都有实质性的提高。 缓存击穿 和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据。 例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如果大量的并发去查询DB,可能会瞬间压垮DB。 画了个简图,如下所示: 解决方案:DB查询加分布式锁。 未加锁的情况 解决问题之前,先看一下不做处理的代码和运行情况。 根据商品ID查询商品详情代码 清空Redis缓存,开启5个线程去并发访问测试,测试代码如下: 我们预期希望DB只查询一次,后面4个查询从Redis缓存中取就行,但是结果:没有加分布式锁,结果也在意料之中,但是这样容器给DB造成很大压力。 如果是单台服务器,直接使用Java的同步锁即可 遗憾的是,通常后端是会部署集群的,Java的同步锁可没办法实现分布式锁。 Redis分布式锁解决缓存击穿 Java的内置锁只能应用在单台机器上,无法实现分布式,可以巧用Redis来实现分布式锁。 加了分布式锁后的代码 //根据ID查询商品 @GetMapping("/{id}") public R id(@PathVariable String id){ //先查Redis缓存 Object o…