Administrator
发布于 2024-06-23 / 55 阅读
0
0

Redis Key过期时间和逻辑过期时间

设置过期时间(真实过期时间)

定义:这是Redis本身提供的功能,允许用户为存储的键设置一个具体的过期时间。一旦到达这个时间点,Redis会自动删除这个键及其对应的值。可以使用EXPIRE或PEXPIRE命令来设置,单位分别是秒和毫秒。

机制:Redis内部维护了一个过期字典和定时删除机制(包括惰性删除和定期删除策略)来管理这些过期键,确保内存的有效利用。

透明性:对于应用层来说,这个过程是完全透明的。开发者只需要关心设置过期时间,无需手动处理过期逻辑。

/**
 * 设置缓存过期
 * @param key 缓存key
 * @param timeout 过期时长
 * @param unit 时间单位
 * @return 设置过期时间是否成功
*/
@Override
public void set(String key, Object value, Long timeout, TimeUnit unit) {
	redisTemplate.opsForValue().set(key, this.getValue(value), timeout, unit);
}

设置逻辑过期时间(伪过期)

定义:逻辑过期是指在键的值中嵌入一个表示过期时间的字段,比如将一个包含过期时间戳的元数据与实际数据一起存储。这种方式下,过期判断逻辑需在应用程序中实现。

作用:可用于解决缓存击穿问题!!!

机制:每次从Redis获取数据时,应用程序需要检查这个“逻辑过期时间”字段,如果发现数据已过期,则需要执行相应的逻辑,如更新数据或从Redis中删除该键。

主动控制:相比Redis管理的真实过期,逻辑过期给予了应用更多的控制权,比如可以实现更复杂的过期策略,或者在数据真正过期前进行预处理。

/**
 * 保存缓存时设置逻辑过期时间
 * @param key 缓存key
 * @param value 缓存value
 * @param timeout 缓存逻辑过期时长
 * @param unit 缓存逻辑时间单位
*/
@Override
public void setWithLogicalExpire(String key, Object value, Long timeout, TimeUnit unit) {
	RedisData redisData = new RedisData(value, LocalDateTime.now().plusSeconds(unit.toSeconds(timeout)));
    redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(redisData));
}

总结

真实过期时间依赖Redis自身机制自动管理数据生命周期,更加简单直接,但灵活性相对较低。

逻辑过期时间则提供了更高的灵活性,但需要应用程序承担额外的逻辑处理,增加了开发复杂度。

根据具体的应用场景和需求,可以选择合适的方式来管理数据的过期


评论