【黑马点评】实战篇-作业-店铺类型缓存-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
分类:
Java技术栈 / Redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)