Redis判断key的失效和存在
Redis缓存体系结构中,Delete与Expire操作都可以用于清理缓存中的Key,这两者不同之处在于Delete操作需要人为手动触发,而Expire只需要提供一个TTL,即“过期时间”,就可以实现Key的自动失效,也就是自动被清理
1. 调用SETEX方法中指定key的过期时间
@RequestMapping("/expire")
public void exTest() throws Exception{
// 构造redis操作组件
final String key="redis:test:6";
ValueOperations valueOperations = redisTemplate.opsForValue();
// 设置过期时间10s, TTL为19s
valueOperations.set(key, "expire测试", 10L, TimeUnit.SECONDS);
//等待5000s
Thread.sleep(5000);
//检查key是否存在
Boolean haskey = redisTemplate.hasKey(key);
Object value = valueOperations.get(key);
log.info("key还存在 value是{}", value.toString());
// 再次等待5s
Thread.sleep(5000);
haskey = redisTemplate.hasKey(key);
value = valueOperations.get(key);
log.info("这是key是否还存在{}, 值为{}", haskey, value);
}
}
结果
2.调用redisTemplate操作组件中的Expire()方法
@RequestMapping("/expire1")
public void extest2() throws Exception{
final String key="redis:test7";
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, "test expire func");
// 使用redisTemplate操作控件的expire时间为10s
redisTemplate.expire(key, 10L, TimeUnit.SECONDS);
// 等待5s
Thread.sleep(5000);
Boolean haskey = redisTemplate.hasKey(key);
Object value = valueOperations.get(key);
log.info("key是否还存在 {}, 值为{}", haskey, value);
Thread.sleep(5000);
haskey = redisTemplate.hasKey(key);
value = valueOperations.get(key);
log.info("这是key是否还存在{}, 值为{}", haskey, value);
}
结果:
- redisTemplate.haskey()可以判断key是否还存在
4.在实际中设置的key的失效时间和判断key是否存在的实际应用场景
- 将数据库查询到的数据缓存一定的时间 TTL,在 TTL时间内前端查询访问数据列表时,只需要在缓存中查询即可,从而减轻数据库的查询压力。
- 将数据压入缓存队列中,并设置一定的TTL时间,当TTL时间一到,将触发监听事件,从而处理相应的业务逻辑