目录
1.本地锁实现
当我们要解决缓存击穿问题时,我们可以使用锁机制来解决此问题。假如我们要查询数据库完成查询操作,代码如下:
private Map<String, List<Catalog2Vo>> getDataFromDb() {
//得到锁以后,我们应该再去缓存中确认一次,如果没有才需要继续查询
String catalogJSON = stringRedisTemplate.opsForValue().get("catalogJSON");
if (StringUtils.isNotEmpty(catalogJSON)) {
//缓存不为null直接返回
Map<String, List<Catalog2Vo>> result = JSON.parseObject(catalogJSON, new TypeReference<Map<String, List<Catalog2Vo>>>() {
});
return result;
}
System.out.println("查询了数据库......");
List<CategoryEntity> selectList = baseMapper.selectList(null);
//1、查出所有1级分类
List<CategoryEntity> level1Categorys = getParent_cid(selectList, 0L);
//2、封装数据
//Collectors.toMap的value不能为空
Map<String, List<Catalog2Vo>> collect = level1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
//1、每一个的一级分类,查到这个一级分类的二级分类
List<CategoryEntity> categoryEntities = getParent_cid(selectList, v.getCatId());
//封装上面的结果
//TODO 如果一级分类没有二级分类会出现空指针异常,因为Collectors.toMap()的value不能为空
List<Catalog2Vo> catalog2Vos = null;
if (categoryEntities != null) {
catalog2Vos = categoryEntities.stream().map(l2 -> {
Catalog2Vo catalog2Vo = new Catalog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());
//1、找到当前二级分类的三级分类,封装成vo
List<CategoryEntity> level3Catalog = getParent_cid(selectList, l2.getCatId());
if (level3Catalog != null) {
List<Catalog2Vo.Catalog3Vo> catalog3Vos = level3Catalog.stream().map(l3 -> {
//2、封装成指定格式
Catalog2Vo.Catalog3Vo catalog3Vo = new Catalog2Vo.Catalog3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());
return catalog3Vo;
}).collect(Collectors.toList());
catalog2Vo.setCatalog3List(catalog3Vos);
}