Redis key已经过期,后端可以获取到key

Redis key已经过期但未删除,后端可以获取到key-value

设置了一个key 过期时间为300s,但是五分钟后还是可以获取到key。

通过keys *查看没有key存在,但是可视化界面后面又有记录存在但是打不开db0。使用指令删除redis中的所有key,重新测试时发现设置了过期时间的key ttl一直减少直到变成0,然后刷新。发现又打不开db0了,问题就出现在这里

 

Redis的key,通过TTL命令返回key的过期时间,一般来说有3中:

  1. 当前key没有设置过期时间,所以会返回-1.

  2. 当前key有设置过期时间,而且key已经过期,所以会返回-2.

  3. 当前key有设置过期时间,且key还没有过期,故会返回key的正常

如果一个redis作为slave,且将slave-read-only设置为off,并写入了一个带有TTL的key时,当key过期后,该key是不会被Redis删除的,且TTL在过期后永远为0。

带着这样的判断,我们在该redis上执行info命令确认了一下,果然该redis是slave,咨询了相关部署的同事得知,该业务在进行数据迁移过程中,存在多级复制和双写的情况,所以才将redis slave设置为可写状态,此时将slave的slaveof 设置成no one,既断开同步,再次排查所有过期key的TTL都返回-2了。

链接:一次Redis TTL 为0的问题排查_hongmingover的博客-CSDN博客_redis ttl 为0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一种基于内存的键值对存储数据库,常用于高性能的数据缓存、分布式锁、消息队列、计数器等场景。 在后端Java开发中,Redis的使用场景包括但不限于以下几种: 1. 缓存:将频繁查询的数据缓存到Redis中,提高访问速度和性能; 2. 分布式锁:通过Redis实现分布式锁,保证多个服务实例对同一个资源进行互斥访问; 3. 消息队列:通过Redis实现发布/订阅模式或者消息队列,实现异步处理、解耦和削峰填谷等功能; 4. 计数器:通过Redis实现计数器,统计在线用户数、PV/UV等指标。 下面是一个使用Redis进行缓存的示例代码: ```java public class RedisCacheManager { private JedisPool jedisPool; public RedisCacheManager(String host, int port) { jedisPool = new JedisPool(host, port); } public void set(String key, Object value, int expireTime) { try (Jedis jedis = jedisPool.getResource()) { jedis.set(key.getBytes(), SerializationUtils.serialize(value)); if (expireTime > 0) { jedis.expire(key.getBytes(), expireTime); } } } public Object get(String key) { try (Jedis jedis = jedisPool.getResource()) { byte[] value = jedis.get(key.getBytes()); if (value != null) { return SerializationUtils.deserialize(value); } } return null; } } ``` 这段代码通过JedisPool获取Jedis实例,然后通过set方法将对象序列化后存入Redis缓存中,并设置过期时间;通过get方法从Redis获取对象并进行反序列化操作。需要注意的是,使用完Jedis实例后需要及时关闭,否则会导致连接泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值