黑马redis作业
时间: 2025-04-02 17:19:42 浏览: 30
### 黑马程序员 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 不可用)来增强系统的健壮性检测能力。
---
阅读全文
相关推荐













