话不多说直接上代码
这个是特别特别极端的情况,一般不会这么设计
说白了就是如果查缓存没有查到,那就先进行加锁,再去查库,让后边的请求都进行阻塞,然后再去查询一次缓存,为什么要这么做呢,因为可能有线程已经查完库并且放入完缓存了,这时候如果不进行这步操作的话,后边的即使拿到了锁之后还是差的缓存,这种,会保证只查库一次,防止大量请求直接读库。
public class Demo{
public ProductDTO getProductByProductId(Integer productId){
ValidateUtils.notNullParam(productId);
ValidateUtils.isTrue(productId > 0, "商品id错误");】
// 1、查询缓存逻辑代码
// 2、如果缓存命中返回
// 3、缓存没命中,在查库之前进行加锁
// 4、再次查询缓存
// 5、查询DB,DB有直接放到缓存,设置过期时间
// 6、DB没有,在缓存放空值,设置过期时间
// 7、解锁
// 8、返回数据
}
}