## 生存时间 Redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。 expire 设置生存时间(单位/秒) expire key seconds(秒) persist 取消生存时间 persist key ## Redis中key的过期淘汰机制 Redis可以对存储在Redis中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟过期,我们这时候就需要在验证码存进Redis时添加一个key的过期时间,但是这里有一个需要格外注意的问题就是:并非key过期时间到了就一定会被Redis给删除。那么Redis是如何做到对过期key进行删除呢?Redis中对于过期key的删除分为两种策略:定期删除和惰性删除。 * 定期删除:Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key,检查其是否过期,如果过期就删除。为什么是随机抽取而不是检查所有key?因为你如果设置的key成千上万,每100毫秒都将所有存在的key检查一遍,会给CPU带来比较大的压力。 * 惰性删除 :定期删除由于是随机抽取可能会导致很多过期 Key 到了过期时间并没有被删除。所以用户在从缓存获取数据的时候,redis会检查这个key是否过期了,如果过期就删除这个key。这时候就会在查询的时候将过期key从缓存中清除。 但是如果仅仅使用定期删除 + 惰性删除机制还是会留下一个严重的隐患:如果定期删除留下了很多已经过期的key,而且用户长时间都没有使用过这些过期key,导致过期key无法被惰性删除,从而导致过期key一直堆积在内存里,最终造成Redis内存块被消耗殆尽。那这个问题如何解决呢?这个时候Redis内存淘汰机制应运而生了。Redis内存淘汰机制提供了6种数据淘汰策略: * volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 * volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。 * volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。 * allkeys-lru:当内存不足以容纳新写入数据时移除最近最少使用的key。 * allkeys-random:从数据集中任意选择数据淘汰。 * no-enviction:当内存不足以容纳新写入数据时,新写入操作会报错。 一般情况下,推荐使用volatile-lru策略,对于配置信息等重要数据,不应该设置过期时间,这样Redis就永远不会淘汰这些重要数据。对于一般数据可以添加一个缓存时间,当数据失效则请求会从DB中获取并重新存入Redis中。