作业分析:
代码语言:javascript复制@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数据库中的字符串类型数据。
- 方法注释
- 方法前的注释简要描述了此方法的目的:为查询店铺类型业务添加缓存机制。
- 查询Redis缓存
- 使用
stringRedisTemplate.opsForList().range(SHOP_TYPE_KEY, 0, -1);
从Redis中根据键SHOP_TYPE_KEY
获取一个列表类型的缓存数据。0, -1
表示获取全部元素。
- 使用
- 判断缓存是否存在
- 检查从Redis获取到的列表是否为空,如果不为空,则表示有缓存数据。
- 解析并返回缓存数据
- 如果缓存存在,使用Java 8的Stream API遍历缓存中的每个字符串项,通过
JSONUtil.toBean(item, ShopType.class);
将JSON字符串转换为ShopType
对象,最后收集这些对象到一个新的列表中并返回。
- 如果缓存存在,使用Java 8的Stream API遍历缓存中的每个字符串项,通过
- 缓存未命中时查询数据库
- 如果Redis中没有缓存数据,执行SQL查询(这里虽然没有直接展示SQL,但通过
query().orderByAsc("sort").list();
可知,是按照'sort'字段升序排序后获取所有ShopType
记录)。
- 如果Redis中没有缓存数据,执行SQL查询(这里虽然没有直接展示SQL,但通过
- 将查询结果序列化并存入Redis
- 将从数据库查询到的数据列表通过
JSONUtil.toJsonStr(item)
转换为JSON字符串,然后使用stringRedisTemplate.opsForList().rightPushAll(SHOP_TYPE_KEY, resList);
将这些JSON字符串批量右推入Redis的列表中,作为新的缓存数据。
- 将从数据库查询到的数据列表通过
- 返回查询结果
- 最终,无论数据来源于缓存还是数据库查询,都会返回查询到的
ShopType
列表给调用者。
总结
这段代码实现了查询店铺类型列表的功能,并通过Redis缓存机制来减少对数据库的访问,提高了系统的响应速度和效率。当有请求时,优先尝试从Redis中读取数据,如果缓存中没有,则查询数据库并将结果存入Redis以备后续使用,这是一种典型的缓存策略——“先缓存,后数据库”。
代码分析:
代码语言:javascript复制List<ShopType> shopTypeList = shopTypeListInRedis.stream().map(item -> {
return JSONUtil.toBean(item, ShopType.class);
}).collect(Collectors.toList());
这段代码是Java 8 Stream API的一个典型应用,用于将从Redis获取的包含JSON字符串的列表转换为ShopType
对象的列表。下面是逐步拆解和分析:
- Stream流的创建
-
shopTypeListInRedis.stream()
:首先,对从Redis获取的字符串列表shopTypeListInRedis
调用stream()
方法,将其转换为一个Stream流。Stream是Java 8引入的新特性,用于处理集合等数据源的元素序列。
- 映射操作(map)
-
.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)
-
.collect(Collectors.toList())
:最后,使用collect()
方法对经过映射操作后的流进行收集,收集器Collectors.toList()
会把所有的流元素收集到一个新的List
中。这一步骤将转换后的ShopType
对象们聚集起来,形成了最终需要的List<ShopType>
。
整体作用
整体而言,这段代码完成了以下任务:
- 将一个包含JSON字符串的列表
shopTypeListInRedis
通过Stream API处理, - 对每个JSON字符串调用
JSONUtil.toBean()
方法进行反序列化,将其转换为ShopType
对象, - 最后,将所有转换后的
ShopType
对象收集到一个新的List<ShopType>
中,即shopTypeList
。
这种做法不仅代码简洁,而且充分利用了Java 8的函数式编程特性,提高了代码的可读性和效率。