目录
数据库与缓存之间的工作业务逻辑:
接下来看查询缓存代码实现,主要是捋清楚业务逻辑,代码实现是死的:
Controller:
Service:
P37作业实现:总体逻辑跟上面的业务逻辑差不多
Controller:
Service:
总结
数据库与缓存之间的工作业务逻辑:
接下来看查询缓存代码实现,主要是捋清楚业务逻辑,代码实现是死的:
Controller:
@RestController
@RequestMapping("/shop")
public class ShopController {
@Resource
public IShopService shopService;
/**
* 根据id查询商铺信息
* @param id 商铺id
* @return 商铺详情数据
*/
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
return shopService.queryById(id);
}
}
Service:
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
//1,根据id现在Redis缓存中查询数据
String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + "id");
//2,如果命中就直接把结果返回就可以
if (StrUtil.isNotBlank(shopJson)) {
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
//3,如果没命中就去数据库查询该数据
Shop shop = getById(id);
//4,如果数据库中也没查到就返回错误
if(shop == null){
return Result.fail("数据不存在!");
}
//5,如果查到了就先把该数据写到Redis中
String toString = JSONUtil.toJsonStr(shop);
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + "id",toString);
//6,最后再把数据返回到前端
return Result.ok(shop);
}
}
P37作业实现:总体逻辑跟上面的业务逻辑差不多
Controller:
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
@Resource
private IShopTypeService typeService;
@GetMapping("list")
public Result queryTypeList() {
return typeService.listType_list();
}
}
Service:
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Result listType_list() {
//1,根据id现在Redis缓存中查询数据
String shop_type_JSONS = stringRedisTemplate.opsForValue().get(CACHE_SHOP_TYPE_KEY+"TP");
//2,如果命中就直接把结果返回就可以
if (StrUtil.isNotBlank(shop_type_JSONS)) {
//把字符串对象转换为List对象
System.out.println("Redis中查到的数据:objects = " + JSONUtil.toList(shop_type_JSONS,ShopType.class));
return Result.ok(JSONUtil.toList(shop_type_JSONS,ShopType.class));
}
//3,如果没命中就去数据库查询该数据
List<ShopType> list = list();
//4,如果数据库中也没查到就返回错误
if(list == null){
return Result.fail("404");
}
//5,如果查到了就先把该数据写到Redis中
String s = JSONUtil.toJsonStr(list);//把List转换为JSON对象
stringRedisTemplate.opsForValue().set(CACHE_SHOP_TYPE_KEY+"TP",s,30, TimeUnit.MINUTES);
//6,最后再把数据返回到前端
return Result.ok(list);
}
}
总结
这种查询缓存是非常基础的,一定要理解他的逻辑处理顺序:①前端发送请求数据②根据前端需要进行查询数据业务③首先我们去Redis中查,看是否Redis中有该数据,如果命中就直接返回④如果没有命中,就去数据库中查询 ⑤数据库查询出来先判断是否查出来了数据,如果没有就直接返回错误⑥如果查出来有数据,就把该数据存到Redis中⑦最后再把该数据返回前端,这样下一次查询就可以直接在Redis中得到数据