1、Redis 设置过期时间
EXPIRE key seconds #1️⃣将key的生存时间设置为ttl秒
PEXPIRE key milliseconds #2️⃣将key的生成时间设置为ttl毫秒
EXPIREAT key timestamp #3️⃣将key的过期时间设置为timestamp所代表的的秒数的时间戳
PEXPIREAT key milliseconds-timestamp#4️⃣将key的过期时间设置为timestamp所代表的的毫秒数的时间戳
1 和 2 两种方式是设置一个过期的时间段,比如处理验证码时,设置三分钟或五分钟后失效,把分钟数转换成秒或毫秒存储到Redis中。3 和 4 两种方式是设置一个过期的时间点,比如优惠卷的过期时间是某年某月某日,只是单位不一样。
2、键过期删除策略
- 惰性删除:只有访问这个键时才会去检查它是否已过期,如果过期了,则删除;如果没有过期,则返回该键。【这种方法对 CPU 友好,不会占用 CPU 资源,只是在获取键的时候检查是否过期,如果过期了,就顺手删除了。但是对内对很不友好,如果大量过期的键没有被访问,那就会占用大量的内存】
- 定时删除:为每一个设置过期事时间的 key 都创建一个定时器,到期了就立即删除。【这种方法对内存非常友好,内存中存储的数据都是没过期的有用数据。但是对 CPU 不友好,会占用大量的 CPU 资源。假设现在内存充足,在并发访问量较大的情况下,CPU 还要腾出时间来处理过期键】
- 定期删除:每隔一段时间就对一些键进行检查,删除其中过期的键。至于要删除多少过期键,检查多少个数据库,可以由算法决定。该策略是惰性删除和定时删除的一个折中方案,即避免占用大量 CPU 资源,也避免大量过期键占用内存空间。
Redis 服务器实际使用的是惰性删除和定期删除这两种策略,通过配合使用这两种删除策略,服务器可以很好地在合理使用 CPU 时间和避免浪费内存空间之间取得平衡。
3、Redis 的内存淘汰策略
Redis 4.0 之前
- noeviction:不会淘汰任何数据,当使用的内存空间超过 maxmemory 值时,返回错误;【默认】
- volatile-ttl:从设置了过期时间的键中移除将要过期的键,键剩余生存时间越短越有可能被删除;
- volatile-random:从设置了过期时间的键中随机淘汰一些键;
- allkeys-random:在所有键值对中,随机选择并删除一些键;
- volatile-lru:从设置了过期时间的键中使用 LRU 算法移除那些最近最久未使用的键;
- allkeys-lru:使用 LRU 算法在所有键值中进行筛选,移除最近最久未使用的键;
Redis 4.0 之后新加了两条
- volatile-lfu:从设置了过期时间的键中使用 LFU 算法移除那些最近最少使用的键;
- allkeys-lfu:使用 LFU 算法在所有数据中进行筛选,移除那些最近最少使用的键;