Redis缓存查询
时间: 2025-06-30 07:14:52 浏览: 2
Redis缓存的查询操作是提升应用性能和降低数据库负载的重要手段。通过合理配置,可以有效减少对数据库的直接访问,从而提高系统整体效率。
### 查询操作的基本使用方法
在Spring Boot项目中集成Redis后,可以通过`RedisTemplate`或`StringRedisTemplate`来实现基本的查询操作。以下是手动读取与写入缓存的一个示例:
```java
public User getUserById(Long id) {
// 生成缓存键,格式为 "user:{id}"(如 "user:123")
String cacheKey = "user:" + id;
// 获取 Redis 的 String 类型操作接口
ValueOperations<String, User> ops = redisTemplate.opsForValue();
// 尝试从 Redis 中获取缓存数据
User user = ops.get(cacheKey);
// 缓存未命中(包含空值标记的情况)
if (user == null) {
// 穿透到数据库查询真实数据
user = userRepository.findById(id).orElse(null);
if (user != null) {
// 数据库存在数据:写入缓存并设置 30 分钟过期时间
ops.set(cacheKey, user, Duration.ofMinutes(30));
} else {
// 数据库不存在数据:写入特殊空值标记,设置 5 分钟较短过期时间
ops.set(cacheKey, new NullValue(), Duration.ofMinutes(5));
}
}
// 返回前进行空值标记判断
return user instanceof NullValue ? null : user;
}
```
### 处理缓存穿透问题
缓存穿透是指大量请求查询一个不存在的数据,导致所有请求都落到数据库上。为了防止这种情况,可以在查询数据库后,将空值也写入缓存,并设置一个较短的过期时间。这样即使用户频繁查询不存在的数据,也不会影响到数据库性能。
```java
// 判断是否命中了空值 -> "" 同义-> "".equals(shopJson)
if (shopJson != null) {
return Result.fail("店铺信息不存在");
}
//4.不存在,查数据库
Shop shop = getById(id);
//不存在,返回错误信息
if (shop == null) {
//将空值写入Redis
stringRedisTemplate.opsForValue()
.set(key,"", RedisConstants.CACHE_NULL_TTL, TimeUnit.MINUTES);
return Result.fail("店铺不存在");
}
```
### 使用Spring AOP动态拦截Dao层查询操作
除了手动处理缓存外,还可以通过Spring AOP技术动态拦截DAO层的所有查询操作,并将MySQL数据库中的数据缓存到Redis中。这种方法使得代码更加整洁,同时也简化了缓存管理逻辑。
准备步骤包括:
- 配置Redis连接信息。
- 创建自定义注解用于标识需要缓存的方法。
- 实现AOP切面类,处理方法调用前后的行为,包括缓存读取、更新以及清除等操作。
一旦进行了增删改操作,则需要清除相应的Redis缓存以保证数据一致性。
### 总结
利用Redis进行高效的缓存查询不仅能够显著提升应用程序的响应速度,还能减轻数据库的压力。无论是采用手动方式还是借助Spring AOP这样的自动化工具,都需要根据具体的业务需求来设计合理的缓存策略,比如适当的过期时间设定及空值处理机制[^3]。
阅读全文
相关推荐
















