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的。你也就无法做相应的事件处理。