Redis-过期策略与淘汰策略

  设置过期时间
  expire key time(以秒为单位) -- 比较常用的方式
  setex(String key,int seconds,String value) -- 字符串独有的方式
 
  1. 三种过期策略
  定时删除:
    含义:在设置 key的过期时间 的同时,为该key创建一个定时器 ,让定时器在 key的 过期时间来临时,对key进行删除
    优点:保证内存被尽快释放
    缺点:若过期 key很多,删除这些 key会占用很多的 CPU时间,在 CPU时间紧张的情况下,CPU不能把所有的时间来做要紧的事,还需要花时间删除这些key。
      定时器 的创建耗时,若为每一个设置过期时间的 key创建一个定时器(将会有大量的 定时器 产生),性能影响严重。
 
  2. 惰性删除:
    含义:key过期的时候不删除,每次从数据库 读取 key的时候去检查是否过期,若过期,则删除,返回null。
    优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对 CPU时间的 占用比较少的,而且此时 的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)。
    缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能会发生内存泄漏(无用的垃圾占用了大量的内存)
 
  3. 定期删除:
    优点:每隔一段时间执行一次删除 过期 key操作
      通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用 --处理“定时删除”的缺点。
      定期删除过期key -- 处理“惰性删除”的缺点
    缺点:
      在内存友好方面,不如 “定时删除”
      在CPU时间友好方面,不如“惰性删除”
    难点:
      合理设置删除操作的执行时长和执行频率
 
  Redis采用的过期策略
    惰性删除 + 定期删除
 
    RDB对过期key的处理
    过期key对 RDB没有任何影响
    从内存数据库持久化 数据到 RDB文件
    持久化 key之前,会检查是否 过期,过期的key不进入 RDB文件
    从RDB文件恢复数据到内存 数据库
    数据载入数据库之前,会 对 key先进行过期检查,如果过期,不导入数据库
 
    AOF 对过期 key的处理
    过期 key对 AOF没有任何影响
    从内存数据库持久化数据到 AOF文件:
    当 key过期后,还没有被删除,此时进行执行持久化操作(该 key是不会进入 AOF文件的,因为没有发生修改命令)
    当 key过期后,在发生删除 操作时,程序会向 AOF文件追加一条 del命令(在将来的以 AOF文件恢复数据的时候该过期的键就会被删掉
 
  AOF重写
    重写时,会先判断 key是否过期,已过期的key不会重写到 AOF文件
 
 

 
 
  Redis的内存淘汰策略
 
    Redis的内存淘汰策略是指在 Redis的用于缓存的内存 不足时,如何处理新写入且需要申请额外空间的数据。
    noeviction:当内存不足容纳新写入数据时,新写入操作就会报错。
    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
    allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
    volatile-lru:当内存 不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
    volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除 某个key。
    volatile-ttl:当内存 不足以容纳新写入数据时,在 设置了过期时间的键空间中,有更早过期时间的key优先移除。
 
  Redis的内存 淘汰策略的选取并不会 影响过期的 key的处理,内存淘汰策略用于处理内存不足的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。
 
 
 
 
posted @ 2022-11-10 17:19  茄子777  阅读(251)  评论(0编辑  收藏  举报