问题描述

假如Reids中缓存失效了,如果此时有大量用户同一时间去查询,此时redis中没有缓存数据则会全部涌向数据库查询,可以使用锁的形式去解决,让一个线程去查询数据库,其他的则阻塞等待;

代码

private Lock lock = new ReentrantLock();

public void test() throws InterruptedException {
        String content = stringRedisTemplate.opsForValue().get("aoligei");

        if (content == null) {
            if (lock.tryLock()) {
                //睡眠2秒 模拟获取延迟
                Thread.sleep(2000);
                //模拟 从数据库中获取到数据存入redis
                content = "aoligei";
                stringRedisTemplate.opsForValue().set("aoligei", content);
                if (StringUtils.isNotBlank(content)) {
                    log.info("第一次从数据库中获取到数据:{}", content);
                }
                //释放锁
                lock.unlock();
            } else {
                //获取锁失败 等待100毫秒重新获取
                Thread.sleep(100);
                count();
            }
        } else {
            log.info("redis中的数据:{}", content);
        }
    }

演示效果

最后修改:2022 年 06 月 01 日 08 : 07 PM
如果觉得我的文章对你有用,请随意赞赏
END
本文作者:
文章标题:Java采用锁解决缓存击穿的问题
本文地址:https://www.jufb.cn/archives/123.html
版权说明:若无注明,本文皆雨尘博客原创,转载请保留文章出处。