@Override
public Result queryTypeList() {
//1.查询redis缓存
List<String> shopTypeListInRedis = stringRedisTemplate.opsForList().range(SHOP_TYPE_KEY, 0, -1);
//2.判断是否存在
if(!shopTypeListInRedis.isEmpty()){
//3.存在就返回
List<ShopType> shopTypeList = shopTypeListInRedis.stream().map(item -> {
return JSONUtil.toBean(item, ShopType.class);
}).collect(Collectors.toList());
return Result.ok(shopTypeList);
}
//4.不存在,查询数据库
List<ShopType> shopTypeList = query().orderByAsc("sort").list();
List<String> resList = shopTypeList.stream().map(item -> {
return JSONUtil.toJsonStr(item);
}).collect(Collectors.toList());
//5.将查询出来写入redis
stringRedisTemplate.opsForList().rightPushAll(SHOP_TYPE_KEY, resList);
//6.将查询出的结果返回
return Result.ok(shopTypeList);
}
这段代码是一个Spring Boot应用中的服务层方法,主要功能是查询店铺类型的列表,并利用Redis作为缓存来提高查询效率。下面是对这段代码的分析及其实现方式和作用的详细说明:
@Autowired
注解用于自动装配 StringRedisTemplate
,这是一个Spring Data Redis提供的模板类,用于操作Redis数据库中的字符串类型数据。stringRedisTemplate.opsForList().range(SHOP_TYPE_KEY, 0, -1);
从Redis中根据键 SHOP_TYPE_KEY
获取一个列表类型的缓存数据。0, -1
表示获取全部元素。JSONUtil.toBean(item, ShopType.class);
将JSON字符串转换为 ShopType
对象,最后收集这些对象到一个新的列表中并返回。query().orderByAsc("sort").list();
可知,是按照'sort'字段升序排序后获取所有ShopType
记录)。JSONUtil.toJsonStr(item)
转换为JSON字符串,然后使用 stringRedisTemplate.opsForList().rightPushAll(SHOP_TYPE_KEY, resList);
将这些JSON字符串批量右推入Redis的列表中,作为新的缓存数据。ShopType
列表给调用者。总结
这段代码实现了查询店铺类型列表的功能,并通过Redis缓存机制来减少对数据库的访问,提高了系统的响应速度和效率。当有请求时,优先尝试从Redis中读取数据,如果缓存中没有,则查询数据库并将结果存入Redis以备后续使用,这是一种典型的缓存策略——“先缓存,后数据库”。
List<ShopType> shopTypeList = shopTypeListInRedis.stream().map(item -> {
return JSONUtil.toBean(item, ShopType.class);
}).collect(Collectors.toList());
这段代码是Java 8 Stream API的一个典型应用,用于将从Redis获取的包含JSON字符串的列表转换为ShopType
对象的列表。下面是逐步拆解和分析:
shopTypeListInRedis.stream()
:首先,对从Redis获取的字符串列表 shopTypeListInRedis
调用 stream()
方法,将其转换为一个Stream流。Stream是Java 8引入的新特性,用于处理集合等数据源的元素序列。.map(item -> { return JSONUtil.toBean(item, ShopType.class); })
:这是Stream流的核心转换步骤。对于流中的每一个元素(在这里是每一个JSON字符串 item
),都会执行Lambda表达式定义的操作。Lambda表达式 item -> JSONUtil.toBean(item, ShopType.class)
的作用是将每个 item
(即JSON字符串)转换为一个 ShopType
对象。JSONUtil.toBean()
方法负责将JSON字符串反序列化为指定类型的Java对象,在这里是 ShopType.class
。.collect(Collectors.toList())
:最后,使用 collect()
方法对经过映射操作后的流进行收集,收集器 Collectors.toList()
会把所有的流元素收集到一个新的 List
中。这一步骤将转换后的 ShopType
对象们聚集起来,形成了最终需要的 List<ShopType>
。整体作用
整体而言,这段代码完成了以下任务:
shopTypeListInRedis
通过Stream API处理,JSONUtil.toBean()
方法进行反序列化,将其转换为 ShopType
对象,ShopType
对象收集到一个新的 List<ShopType>
中,即 shopTypeList
。这种做法不仅代码简洁,而且充分利用了Java 8的函数式编程特性,提高了代码的可读性和效率。