Redis的expire命令在设置key后,还可以设置该key以秒为单位的过期时间,比如设置了jianshu的key后,执行 expire jianshu 60 命令,这将key为jianshu的字符串设置了60秒的过期时间。那么问题来了:Redis中有那么多的key,它是如何确定那些已经过期的key呢?
Redis以两种方式处理key的过期问题:被动方式(passive way)和主动方式(active way)。
被动方式:也称为惰性删除,指定的是某个key虽然已经过期,但是Redis并不将其从服务器上真正删除,而是等到该key再次被查询的时候再判断是否过期,如果过期则删除该key并返回null。
看到这,很多人会疑问对于那些设置过期时间后不再访问的key会不会一直留在Redis中?答案是并不会,这涉及到下面这种方式
主动方式:也称为定期删除,Redis每秒会做10次随机抽取,做如下处理:
1.随机从已设置过期时间的key中抽取20个key,从中删除所有已过期的key;
2.统计抽取到的这20个key,如果已过期的key占比超过25%,那么继续执行第一步。
通过上面两种方式,Redis即保证了不被大量已过期key挤爆内存,也不会为了删除过期的key而占用过多的CPU时间。
相关内容请参见Redis官方文档 :https://redis.io/commands/expire