问题描述
假如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);
}
}