//原始代码:直接从数据库请求
@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);
}
难点:
- 改redis缓存
- 缓存数据类型:String、Hash、List
写三个实现类
@GetMapping("list")
public Result queryTypeList() {
// List<ShopType> typeList = typeService
// .query().orderByAsc("sort").list();
// return Result.ok(typeList);
return typeService.queryShopTypeString();
// return typeService.queryShopTypeList();
// return typeService.queryShopTypeZSet();
// 三种方法
}
//ShopTypeController
public interface IShopTypeService extends IService<ShopType> {
Result queryShopTypeString();
Result queryShopTypeList();
Result queryShopTypeZSet();
}
//IShopTypeService
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryShopTypeString() {
String key = CACHE_SHOP_TYPE_KEY;// CACHE_SHOP_TYPE_KEY = "cache:shopType";
// 1.从 Redis 中查询商铺缓存
String shopTypeJson = stringRedisTemplate.opsForValue().get(key);
// 2.判断 Redis 中是否存在数据
if (StrUtil.isNotBlank(shopTypeJson)) {
// 2.1.存在,则返回
List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson, ShopType.class);
return Result.ok(shopTypes);
}
// 2.2.Redis 中不存在,则从数据库中查询
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 3.判断数据库中是否存在
if (shopTypes == null) {
// 3.1.数据库中也不存在,则返回 false
return Result.fail("分类不存在!");
}
// 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shopTypes));
// 3.3.2.2.返回
return Result.ok(shopTypes);
}
@Override
public Result queryShopTypeList() {
String key = CACHE_SHOP_TYPE_KEY;// CACHE_SHOP_TYPE_KEY = "cache:shopType";
// 1.从 Redis 中查询商铺缓存
List<String> shopTypeJsonList = stringRedisTemplate.opsForList().range(key, 0, -1);
// 2.判断 Redis 中是否有该缓存
if (shopTypeJsonList != null && !shopTypeJsonList.isEmpty()) {
// 2.1.若 Redis 中存在该缓存,则直接返回
ArrayList<ShopType> shopTypes = new ArrayList<>();
for (String str : shopTypeJsonList) {
shopTypes.add(JSONUtil.toBean(str, ShopType.class));
}
return Result.ok(shopTypes);
}
// 2.2.Redis 中若不存在该数据,则从数据库中查询
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 3.判断数据库中是否存在
if (shopTypes == null || shopTypes.isEmpty()) {
// 3.1.数据库中也不存在,则返回 false
return Result.fail("分类不存在!");
}
// 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
for (ShopType shopType : shopTypes) {
stringRedisTemplate.opsForList().rightPushAll(key, JSONUtil.toJsonStr(shopType));
}
// 3.3.2.2.返回
return Result.ok(shopTypes);
}
@Override
public Result queryShopTypeZSet() {
String key = CACHE_SHOP_TYPE_KEY;// CACHE_SHOP_TYPE_KEY = "cache:shopType";
// 1.从 Redis 中查询商铺缓存
Set<String> shopTypeJsonSet = stringRedisTemplate.opsForZSet().range(key, 0, -1);
// 2.判断 Redis 中是否有该缓存
if (shopTypeJsonSet.size() != 0) {
// 2.1.若 Redis 中存在该缓存,则直接返回
List<ShopType> shopTypes = new ArrayList<>();
for (String str : shopTypeJsonSet) {
shopTypes.add(JSONUtil.toBean(str, ShopType.class));
}
return Result.ok(shopTypes);
}
// 2.2.若 Redis 中无该数据的缓存,则查询数据库
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 3.判断数据库中是否存在
if (shopTypes == null || shopTypes.isEmpty()) {
// 3.1.数据库中也不存在,则返回 false
return Result.fail("分类不存在!");
}
// 3.3.2.1.数据库中存在,则将查询到的信息存入 Redis
for (ShopType shopType : shopTypes) {
stringRedisTemplate.opsForZSet().add(key,JSONUtil.toJsonStr(shopType),shopType.getSort());
}
// 3.3.2.2.返回
return Result.ok(shopTypes);
}
}