文章目录
前言
本地缓存的问题:每个微服务都得要有自己的缓存服务,数据更新时只能更新本服务的缓存 造成数据不一致。分布式项目时,本地锁只能锁住当前服务。
一、redis分布式锁的原理
redis命令中setnx表示同一时刻只能设置成功一个。
- nx 表示notexist
二、使用redis进行分布式锁改造
抽取访问数据库的代码
private Map<String, List<Catelog2Vo>> getDataFromDB() {
//线程进入之前,再次查缓存
String catelogJson = stringRedisTemplate.opsForValue().get("catelogJson");
if (StringUtils.isNotEmpty(catelogJson)) {
//如果缓存中有数据
//解析成json返回
return JSON.parseObject(catelogJson, new TypeReference<Map<String, List<Catelog2Vo>>>() {
});
}
//如果缓存中没有,就查库
//查全部
List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
//查询所有一级目录
List<CategoryEntity> categoryLevel01 = getCategoryEntities(categoryEntities, 0L);
Map<String, List<Catelog2Vo>> parent_cid = categoryLevel01.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
//遍历 拿到每个一级分类的二级分类
List<CategoryEntity> categoryLevel02 = getCategoryEntities(categoryEntities, v.getCatId());
List<Catelog2Vo> catelog2Vos = null;
if (categoryLevel02 != null) {
catelog2Vos = (List<Catelog2Vo>) categoryLevel02.stream().map(l2 -> {
Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), l2.getName(), l2.getCatId().toString(), null);
//三级分类
List<CategoryEntity> categoryLevel03 = getCategoryEntities(categoryEntities, l2.getCatId());