【黑马点评】实战篇-作业-店铺类型缓存-List实现
查询店铺类型信息
这里使用opsForList实现
最终redis上的数据如下:
1. ShopTypeController.java
Controller层
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
@Resource
private IShopTypeService typeService;
@GetMapping("list")
public Result queryTypeList() {
return typeService.queryTypeList();
}
}
2. IShopTypeService.java
IService接口层,继承MP
public interface IShopTypeService extends IService<ShopType> {
Result queryTypeList();
}
3. ShopTypeServiceImpl.java
使用opsForList实现
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryTypeList() {
// opsForList写法
// public static final String CACHE_SHOP_TYPE_KEY = "cache:shopType:";
String key = CACHE_SHOP_TYPE_KEY;
// 1. 从Redis查询 商铺类型缓存 , end:-1 表示取全部数据
List<String> shopTypeJson = stringRedisTemplate.opsForList().range(key, 0, -1);
// 2. 有就直接返回
if (CollectionUtil.isNotEmpty(shopTypeJson)) {
// JSON字符串转对象 排序后返回
List<ShopType> shopTypes = JSONUtil.toList(shopTypeJson.toString(), ShopType.class);
Collections.sort(shopTypes, ((o1, o2) -> o1.getSort() - o2.getSort()));
return Result.ok(shopTypes);
}
// 3. 没有就向数据库查询 MP的query()拿来用
List<ShopType> shopTypes = query().orderByAsc("sort").list();
// 4. 不存在,返回错误
if (CollectionUtil.isEmpty(shopTypes)){
return Result.fail("商铺类型不存在...");
}
// 5. 存在, 写入Redis,这里使用Redis的List类型,String类型,就是直接所有都写在一起,对内存开销比较大。
// 要将List中的每个元素(元素类型ShopType) ,每个元素都要单独转成JSON,使用stream流的map映射
// Hutools里的 BeanUtil.copyToList 本来想模仿UserService中的写法,
// 传入一个CopyOptions的,但是setFieldValueEditor貌似只对beanToMap有效
// 改用流的形式转换每个list元素
List<String> shopTypesJson = shopTypes.stream()
.map(shopType -> JSONUtil.toJsonStr(shopType))
.collect(Collectors.toList());
// 因为从数据库读出来的时候已经是按照顺序读出来的,这里想要维持顺序必须从右边push,类似队列
stringRedisTemplate.opsForList().rightPushAll(key, shopTypesJson);
// 5. 返回
return Result.ok(shopTypes);
}
}
本文来自博客园,作者:chendsome,转载请注明原文链接:https://www.cnblogs.com/chendsome/p/18580663