目录
一、设置redis键的过期时间
1、删除过期时间
2、查看过期时间
二、过期删除策略
1、定时删除:
2、惰性删除:
3、定期删除:
4、惰性删除和定期删除配合使用
三、
1、设置redis最大内存
2、设置内存的淘汰方式
总结:
在介绍这篇文章之前,我们先来看如下几个问题:
①、如何设置Redis键的过期时间?
②、设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗?
③、如何设置Redis的内存大小?当内存满了之后,Redis有哪些内存淘汰策略?我们又该如何选择?
如果上面的几个问题你都懂,那么下面的内容你就不用看了;如果你不是很懂,那就带着这些问题往下看。
一、设置redis键的过期时间
redis提供了4个命令来设置过期时间
- expire seconds :表示将key的生存时间设置为 ttl 秒。
- pexpire milliseconds :表示将key的生存时间设置为 ttl 毫秒。
- expireat timestamp:表示将key的生存时间设置为timestamp所指定的秒数时间戳
- pexpireat milliseconds-timestamp:表示将key的生存时间设置为timestamp所指定的毫秒数时间戳
set a redis 创建键a
expire a 10 为键a设置10秒过期
ttl a 查看键a 的剩余过期时间
persist a 删除键a的过期时间
1、删除过期时间
persist :删除key的过期时间
2、查看过期时间
ttl :以秒为单位返回键的剩余过期时间
pttl :以毫秒为单位返回键的剩余过期时间
二、过期删除策略
1、定时删除:
在设置某个key的过期时间同时,我们创建一个定时器,让定时器在该时间到时,立即执行对其进行删除操作。
在redis.conf 中 active-expire-effort
优点:定时删除对内存好,一旦过期就能立即删除,
缺点:对CPU不好,删除过期的键会占用一部分CPU时间。对服务吞吐量有影响
2、惰性删除:
设置该过期时间后,我们需要该key,先检查过不过期,过期就删除,没过期就反回
优点:对CPU好。需要才会检查,不需要不会检查。不会浪费时间进行过期检查
缺点:对内存不好,因为不定时删除了。很多不需要的键一直存在内存中。容易造成内存泄漏。
3、定期删除:
每隔一段时间,对key进行检查,删除里边过期的key
在redis.conf中 hz 选项:默认是10 (即1秒执行10次,100ms一次,值越大说明频率越快,对redis性能消耗也大)
在redis.conf中 maxmemory最大值,当内存超过最大值时,会触发清理策略
优点:
可以通过设置时长和频率来减少删除操作对CPU的影响。另外定期删除也能释放过期的键和占用的内存
缺点:
1、如果执行太频繁,定期删除策略就会跟定时删除一样,对CPU不好
2、如果执行太少,就会和惰性删除一样,对内存不好
4、惰性删除和定期删除配合使用
三、
对于以上删除策略,对于一些永远使用不到的键,并且多次定期删除也没选定,那么会一直留在内存中,可能会导致内存不够用,这时候就需要内存淘汰策略了。
1、设置redis最大内存
在redis配置文件中可以通过参数 maxmemory 来设置最大内存,不设置默认是无限的。
2、设置内存的淘汰方式
当现有内存大于maxmemory时,便会触发redis主动淘汰内存的方式,通过设置maxmemory-policy,
- volatile-lru:利用LRU算法移除设置过过期时间的key
- allkeys-lru:利用LRU算法移除任何key
- volatile-random:移除设置过过期时间的随机key
- volatile-ttl:移除即将过期的key
- noeviction:不移除任何key,只返回一个错误
总结:
redis过期删除策略是采用惰性删除和定期删除两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时释放,而不会一直占用内存
但是redis是部署在物理机上的,不可能一直无限扩充内存,当内存达到我们的设定的界限后,便会自动触发redis的内存淘汰策略。