添加缓存
public Result queryById(Long id) {
String cacheShopKey = RedisConstants.CACHE_SHOP_KEY + id;
// 1.从Redis中查询id
String shopJson = stringRedisTemplate.opsForValue().get(cacheShopKey);
if (StrUtil.isNotBlank(shopJson)) {
// 2.命中返回商铺信息
return Result.ok(JSONUtil.toBean(shopJson, Shop.class));
}
// 3.未命中查询数据库
Shop shop = getById(id);
// 4.商铺不在数据库,返回错误信息
if(shop == null){
return Result.fail("店铺不存在");
}
// 5.商铺在数据库
// 5.1.保存到Redis中
stringRedisTemplate.opsForValue().set(cacheShopKey, JSONUtil.toJsonStr(shop));
// 5.2.返回商铺信息
return Result.ok(shop);
}
public List<ShopType> queryWithRedis() {
// 1.如果Redis中存在,直接返回
String shopJson = stringRedisTemplate.opsForValue().get(RedisConstants.CACHE_SHOP_TYPE_KEY);
// 2.存在,直接返回
if(StrUtil.isNotBlank(shopJson)){
List<ShopType> list = JSONUtil.toList(shopJson, ShopType.class);
return list;
}
// 3.不存在
// 3.1.查询数据库
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 3.2.保存到Redis中
stringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_TYPE_KEY, JSONUtil.toJsonStr(shopTypes));
// 3.3.返回商铺类型信息
return shopTypes;
}
缓存更新策略
主动更新:
这两种都存在问题,但第二种出现的概率较小而且可以配合生存时间,最佳方案是上锁。
优化——保证数据一致性
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 基于Redis缓存查询
* @param id
* @return
*/
@Override
public Result queryById(Long id) {
String cacheShopKey = CACHE_SHOP_KEY + id;
// 1.从Redis中查询id
String shopJson = stringRedisTemplate.opsForValue().get(cacheShopKey);
if (StrUtil.isNotBlank(shopJson)) {
// 2.命中返回商铺信息
return Result.ok(JSONUtil.toBean(shopJson, Shop.class));
}
// 3.未命中查询数据库
Shop shop = getById(id);
// 4.商铺不在数据库,返回错误信息
if(shop == null){
return Result.fail("店铺不存在");
}
// 5.商铺在数据库
// 5.1.保存到Redis中
stringRedisTemplate.opsForValue().set(cacheShopKey, JSONUtil.toJsonStr(shop));
stringRedisTemplate.expire(cacheShopKey, CACHE_SHOP_TTL, TimeUnit.MINUTES);
// 5.2.返回商铺信息
return Result.ok(shop);
}
/**
* 更新商铺信息,同时删除redis中的信息
* @param shop
* @return
*/
@Override
@Transactional
public Result update(Shop shop) {
Long id = shop.getId();
if(id == null) {
return Result.fail("店铺id不能为空");
}
// 1.更新数据库
updateById(shop);
// 2.删除redis中的信息
String key = RedisConstants.CACHE_SHOP_KEY + id;
stringRedisTemplate.delete(key);
return Result.ok();
}
}