redis过期策略实现机制

参考: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
   判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

 

 

你可能感兴趣的:(中间件)