总言:
实现项目主页中重点商铺分类的热点数据缓存写入redis数据库,提升项目热点数据访问的速度,减小数据库压力,难点在于获取缓存和写入缓存中json字符串和list集合对象的转换。
1.控制层,注释掉的为原先没用redis缓存的调用方式(MybatisPlus实现)
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
@Resource
private IShopTypeService typeService;
@GetMapping("list")
public Result queryTypeList() {
// List<ShopType> typeList = typeService
// .query().orderByAsc("sort").list();
// return Result.ok(typeList);
return typeService.queryAllType();
}
}
2.业务层实现queryAllType()方法业务逻辑,个人感觉难点在于获取缓存和写入缓存中json字符串和list集合对象的转换。(注解写清楚了):
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Autowired
private ShopTypeMapper shopTypeMapper;
@Override
public Result queryAllType() {
// 1. 查询redis中店铺类型的数据
String shopTypeJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_TYPE_KEY);
// 2. 判断是否存在
ObjectMapper objectMapper = new ObjectMapper();
List<ShopType> shopTypeList = null; // 用于存储店铺类型数据
if (StrUtil.isNotBlank(shopTypeJson)) {
// 3. 存在,解析数据
try {
shopTypeList = objectMapper.readValue(shopTypeJson,List.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
if (shopTypeList == null) {
// 4. 不存在,访问数据库查询数据
shopTypeList = shopTypeMapper.selectList(null);
if (shopTypeList.isEmpty()) {
// 5. 数据库中也不存在该数据
return Result.fail("没有该店铺类型信息");
}
// 6. 存在,返回数据,然后将数据写入redis
try {
stringRedisTemplate.opsForValue()
.set(CACHE_SHOP_TYPE_KEY, objectMapper.writeValueAsString(shopTypeList),
CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
// 7. 返回数据
return Result.ok(shopTypeList);
}
}
3.实现结果
(1)游览器开发控制台已经成功获取数据了,成功
(2)查看redis缓存中有没有key-value;
(3)查看redis中json数据
成功!!
这个速度提升了,但是图片太小可能看不清楚。
总结:
在写业务时,不论是简单的CRUD(增删改查)还是难的的业务逻辑,在写代码之前先把业务逻辑过程写出来,接着一个个完善,这是最合理写代码过程,避免中途大脑宕机用遗忘逻辑过程,加油吧。