redis key 过期时间如何设置

本文详细介绍了Redis中键的过期机制,包括如何设置和刷新过期时间、三种删除过期键的方法、过期键的主动和被动清除机制、主从节点同步问题以及过期时间的持久化处理。

redis key 过期时间:

EXPIRE key 100

设置了过期时间,100秒后,key将自动被删除。

过期时间删除的方法有三种:

1、删除这个key,使用del command

2、用set or getset 命令会将key的expiration清空,事实上set和getset命令是替换了key对应的value,所以key的过期时间也就不复存在。所以,需要注意的是:incr,LPUSH,HSET命令是不会改变key的过期时间的。原来是多久,这三条命令执行完之后还是多久。

3、使用persist命令清楚key的过期时间。


rename命令是将keyA变为keyB,无论keyB是否已经存在,keyA的过期时间都会被keyB继承过去。


刷新过期时间:

多次调用expire key 100 可以刷新key的过期时间。


返回值:

返回值:1代表过期时间被设置。

返回值:0代表key不存在或者timeout不能被设置。


redis如何清除过期keys:

redis有两种方式清除过期keys:主动方式,和被动方式。

1、主动方式:当client访问某一个key,redis会check key是否过期,如果已经过期,则被删除。

2、被动方式:不是所有的key都能被client访问。redis有一套默认的机制,redis每秒会进行10次以下动作:

a、随机从keys中挑选100个key,这100key是关联了过期时间的key。

b、删除已经过期的key。

c、如果删除的key超过25个,那么重复步骤a。

这是一个不是很严格的算法。不过可以基本保证过期的keys小于总数的25%。其实这是一种近似算法。随机选数,检查并删除。随机选key就保证了大致概率,结果只能是近似的。

这意味着:在任意时间点,那些占用内存并已经过期的keys的数量最多等于每秒写入数量的四分之一。


key 过期如何解决主从节点同步以及AOF文件:

为了保证结果一致性,当key过期时,从节点会等待主节点的删除命令,从节点不会自己删除已经过期的key,主节点会进行集权控制,保证一致性。不过假如意外掉电,或者节点当机不知道会是什么情况。会不会导致主节点key已经删除,而从节点没有删除的情况。官方网站也没有一个明确的解释。


expire的持久化:

redis key的过期时间很有意思:以unix的时间戳存储。也就是说,在redis server不活动的情况下,key的过期时间仍然是有效的。这样会带来什么情况呢,比如数据库文件RDB从一台2013年11月27日00:00:00的服务器上移动到2013年11月30日00:00:00的服务器上,重启redis server,那么RDB中所有过期时间<=3天的keys都会被清除。

假如不想所有的keys都被清除的话,可以将服务器时间设置为过去的时间。


心得:

1、hmset、rpush、incr不会清除key的timeout。

2、hmset的fileds的key不能设置timeout。

3、我们只能通过ttl来查看 key的过期时间。

4、过期时间精准度不是特别的准。比如说,部分keys永远不会被主动access,在被动清除模式中也不一定每次都能被random选中,那么就有可能清除时间会被延后。可能是几毫秒。如果对于过期时间要求非常精准的情况下,需要慎重。

5、key被清除的时候目前是没有notification的。你也就无法做相应的事件处理。

在Java中为Redis中的key设置过期时间,可以使用Jedis库提供的`expire`或`pexpire`方法。以下是详细的说明和代码示例: ### 设置Redis Key过期时间 可以通过`expire`方法设置以秒为单位的过期时间,或者通过`pexpire`方法设置以毫秒为单位的过期时间[^4]。 ```java import redis.clients.jedis.Jedis; public class RedisExpireExample { private Jedis jedis; public RedisExpireExample(String host, int port) { this.jedis = new Jedis(host, port); } public void setKeyWithExpiration(String key, String value, int seconds) { jedis.set(key, value); // 设置键值对 jedis.expire(key, seconds); // 设置过期时间为seconds秒 } public void setKeyWithExpirationInMilliseconds(String key, String value, long milliseconds) { jedis.set(key, value); // 设置键值对 jedis.pexpire(key, milliseconds); // 设置过期时间为milliseconds毫秒 } public static void main(String[] args) { RedisExpireExample example = new RedisExpireExample("localhost", 6379); // 设置一个键值对,并设置10秒后过期 example.setKeyWithExpiration("exampleKey", "Hello Redis!", 10); // 设置一个键值对,并设置5000毫秒(即5秒)后过期 example.setKeyWithExpirationInMilliseconds("exampleKeyMs", "Hello Redis in ms!", 5000); // 关闭连接 example.jedis.close(); } } ``` ### 获取Redis Key的剩余时间 可以通过`ttl`方法获取以秒为单位的剩余时间,或者通过`pttl`方法获取以毫秒为单位的剩余时间[^4]。 ```java public Long getKeyTTL(String key) { return jedis.ttl(key); // 返回剩余时间(秒) } public Long getKeyPTTL(String key) { return jedis.pttl(key); // 返回剩余时间(毫秒) } ``` ### 取消Redis Key过期时间 如果需要取消某个key过期时间,可以使用`persist`方法[^4]。 ```java public boolean cancelExpiration(String key) { return jedis.persist(key); // 取消过期时间并返回是否成功 } ``` ### 注意事项 - 如果`ttl`返回`-1`,表示该key没有设置过期时间。 - 如果`ttl`返回`-2`,表示该key不存在。 - 在实际应用中,确保正确关闭Jedis连接以释放资源。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值