1、缓存商户类型shopType到redis 的String实现方式
1、分析思路
(1)String的实现思路没啥好说的,最重要的一点是从数据库取数据出来的时候,记得用sort去做升序处理。
2、上代码
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Autowired
private ShopTypeMapper shopTypeMapper;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public Result getList() {
// 流程一:从redis中查询商铺类型,判断商户类型是否存在
String shopTypeJson = redisTemplate.opsForValue().get("cache:shopType");
// 流程二:如果商户类型存在,直接转化成字符串返回给前端
if (StrUtil.isNotBlank(shopTypeJson)){
String jsonStr = JSONUtil.toJsonStr(shopTypeJson);
return Result.ok(jsonStr);
}
// 流程三:如果商户类型不存在 打到数据库查询然后将数据按照sort进行升序排序,判断查询的内容是否存在
// 手写sql
List<ShopType> shopTypeList = shopTypeMapper.getList();
// mp写法
//List<ShopType> typeList = this.query().orderByAsc("sort").list();
// 流程四:如果不存在,返回错误信息
if (shopTypeList==null){
return Result.fail("商铺分类信息不存在");
}
// 流程五:同时,将商铺类型信息保存到redis,需要将List<ShopType>对象转化成字符串,同时设置30分钟有效期
redisTemplate.opsForValue().set("cache:shopType",shopTypeList.toString(),30L, TimeUnit.MINUTES);
// 流程六:如果存在,将商铺信息返回给前端
return Result.ok(shopTypeList);
}
}
3、数据效果
2、缓存商户类型shopType到redis 的List实现方式
1、分析思路
(1)List的实现思路跟String的区别一:流程一中,我们从redis取数据的时候,取数据的方向要跟存数据的方向相反,即你存数据的时候从左边存的,那么取的时候要从右边取;取数据的时候,通过循环将redis里面的List数据读取出来,放在一个新的集合里面stringList里面。
(2)List的实现思路跟String的区别二:流程二中,判断redis是否有缓存商铺类型数据,是通过判断stringList.size是否>0进行判断。
(3)List的实现思路跟String的区别三:从数据库中取出的List<ShopType>对象,需要进行遍历,然后将每一个ShopType对象转化成字符串,再存进Redis里面。
2、上代码
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Autowired
private ShopTypeMapper shopTypeMapper;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public Result getList() {
// 流程一:从redis中查询商铺类型,判断商户类型是否存在
// "cache:shopTypeList"为商铺类型存入redis的的key
// 放的时候使才左边一个一个放,取出数据的顺序是从右边一个一个取出来,死循环取出数据,放在一个集合里面
List<String> stringList = new ArrayList<>();
String shopTypeJson;
while ((shopTypeJson=redisTemplate.opsForList().rightPop("cache:shopTypeList"))!=null){
stringList.add(shopTypeJson);
}
// todo 流程二:如果存储商户类型的集合里面有长度,直接将集合转化成字符串返回给前端
if (stringList.size()>0) {
return Result.ok(stringList.toString());
}
// 流程三:如果商户类型不存在 打到数据库查询然后将数据按照sort进行升序排序,判断查询的内容是否存在
// 手写sql
List<ShopType> shopTypeList = shopTypeMapper.getList();
// mp写法
//List<ShopType> typeList = this.query().orderByAsc("sort").list();
// 流程四:如果不存在,返回错误信息
if (shopTypeList == null) {
return Result.fail("商铺分类信息不存在");
}
// 流程五:同时,将商铺类型信息保存到redis,需要将List<ShopType>对象转化成字符串,同时设置30分钟有效期
// 从左边一个一个加进去
for (ShopType shopType : shopTypeList) {
redisTemplate.opsForList().leftPush("cache:shopTypeList",shopType.toString());
}
redisTemplate.expire("cache:shopTypeList",30, TimeUnit.MINUTES);
// 流程六:如果存在,将商铺信息返回给前端
return Result.ok(shopTypeList);
}
}
3、数据效果