参考:https://www.cnblogs.com/xuliangxing/p/7151812.html
一、redis设置过期时间
将某个key设置过期时间:expire key time(以秒为单位)
原子方式,同时设置值和过期时间:setex(String key, int seconds, String value)
注:如果没有设置时间,那缓存就是永不过期;如果设置了过期时间,之后又想让缓存永不过期,使用persist key
二、3种过期策略
策略 | 含义 | 优点 | 缺点 |
定时删除 | 设置过期时间时,为key创建一个定时器,时间到时进行删除 | 保证内存被尽快释放 | a.若过期的key数量较大时,因为每个key都会有个定时器,会比较占cpu b.大量定时器的创建比较耗时 |
懒汉式删除 | key过期了不自动删除,等到获取值的时候再去判断是否过期,若过期了则删除 | 不用额外创建删除任务,很少占用cpu | 暂用内存,若大量key过期后没有被用到(不去获取值),可能导致内存泄漏 |
定期删除 | 每隔一段时间执行一次过期key的删除操作 | 通过限制删除操作的时长和频率,来减少cpu的占用率; cpu占用优于定时删除 内存占用方面优于懒汉式 | cpu占用方面劣于懒汉式 内存占用方面劣于定时删除 |
三、redis采用的过期策略
懒汉式删除+定期删除
懒汉式删除:
1.在进行get或setnx等操作时,先检查key是否过期,
2.若过期,删除key,然后执行相应操作;
3.若没过期,直接执行相应操作
定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key)
1.遍历每个数据库(就是redis.conf中配置的"database"数量,默认为16)
2.检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下边的描述)
如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。