黑马点评Redis的p37作业(list实现)

package com.hmdp.service.impl;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.hmdp.utils.RedisConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author WuZhiQiang
 * @since 2022-11-8
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public Result queryTypeList() {
        //先查缓存redis是否有数据

        //!!!!!!
        //!!!!!!这里的RedisConstants.CACHE_SHOP_TYPE 是 "cache:shop-type";
        //!!!!!!

        //debug发现取出的10条数据全在一起,也
### 黑马程序员 Redis 作业题及答案 #### 商户缓存查询作业解析 商户缓存查询作业的核心目标是从 `Redis` 缓存中获取商户类型的列表数据,并将其按指定顺序返回给前端展示。此过程涉及数据库表 `tb_shop_type` 的字段映射以及排序逻辑。 以下是基于引用中的描述完成的代码实现: ```java @Service public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService { @Autowired private StringRedisTemplate stringRedisTemplate; @Override public Result queryTypeLists() { // 定义Redis键名 String key = "cache:shop:type"; // 尝试从Redis中获取缓存数据 String typeListJson = stringRedisTemplate.opsForValue().get(key); if (StringUtils.hasText(typeListJson)) { List<ShopType> shopTypes = JSON.parseArray(typeListJson, ShopType.class); // 转换JSON字符串为对象集合 return Result.ok(shopTypes); } // 如果Redis中无缓存,则从数据库加载并写入缓存 LambdaQueryWrapper<ShopType> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByAsc(ShopType::getSort); // 按照sort字段升序排列 List<ShopType> list = this.list(queryWrapper); // 将结果序列化为JSON字符串存储至Redis stringRedisTemplate.opsForValue().set(key, JSON.toJSONString(list), Duration.ofMinutes(30)); return Result.ok(list); } } ``` 上述代码实现了以下功能: - 使用 `StringRedisTemplate` 进行 Redis 数据操作[^2]。 - 首先尝试从 Redis 中读取商户类型的数据,如果存在则直接返回;否则从数据库加载数据并更新到 Redis 缓存中[^3]。 - 查询条件通过 MyBatis-Plus 提供的 `LambdaQueryWrapper` 实现,确保 SQL 动态拼接的安全性和简洁性[^1]。 --- #### 微服务架构下的 Redis 应用场景扩展 除了简单的缓存查询外,在微服务项目中,Redis 常被用于解决分布式环境下的性能瓶颈问题。例如: - **分布式锁**:利用 Redis 的原子性特性实现跨节点资源竞争控制。 - **限流与降级**:通过计数器或令牌桶算法限制接口访问频率,保护下游服务稳定性。 - **消息队列**:作为轻量级的消息中间件支持异步任务处理。 这些高级应用均需结合实际业务需求设计合理的方案。 --- #### 测试案例分析 为了验证以上方法的功能正确性,可以编写如下单元测试脚本: ```java @SpringBootTest class ShopTypeServiceImplTest { @Autowired private IShopTypeService shopTypeService; @Test void testQueryTypeLists() { // 执行查询方法 Result result = shopTypeService.queryTypeLists(); // 断言返回状态码是否成功 Assertions.assertTrue(result.isSuccess()); // 获取具体数据部分 Object data = result.getData(); Assertions.assertNotNull(data); // 判断返回的是一个非空列表 assertTrue(((Collection<?>)data).size() > 0); } } ``` 该测试覆盖了正常流程下方法的行为表现,同时也可以模拟异常情况(如 Redis 或 DB 不可用)来增强系统的健壮性检测能力。 ---
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值