【黑马点评】实战篇-作业-店铺类型缓存-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);
}
}
posted @   chendsome  阅读(68)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示