Home Redis内存管理
Post
Cancel

Redis内存管理

Redis内存管理

  • 内存管理

    1
    
    redis通过将热点数据存储在内存中,实现了高效的数据读取。但是随着时间的推移,redis中有很多无效数据,加上数据越来越多,如果数据都放在内存中会降低IO的效率,所以redis使用了虚拟内存技术,将一些访问量比较少的数据放在磁盘中,为内存腾出空间。为了管理内存,redis采用了过期策略和内存淘汰机制在管理内存
    
  • 过期策略

    1. 定期删除

      1
      2
      3
      4
      5
      6
      
      	定期删除是一个守护线程,每隔一段时间执行一次(默认100ms一次),将过期的key删除,时间可以通过修改配置文件修改.定期删除执行过程如下
      	- 从过期字典中随机挑选20个key
      	- 删除这20中的过期key
      	- 如果过期key的比例超过1/4就重复步骤1
           	
         之所以不一次性全部删除,是从性能角度考虑的,每次扫描过期key会给cpu带来较大压力
      
    2. 惰性删除

      1
      
      每次查询的时候,如果查询的key过期,就删除该缓存并返回空
      

      不论是定期删除还是惰性删除,都是不完善的过期key删除,所以redis引入了内存淘汰机制

  • 内存淘汰

    • 触发时机

    1
    
    redis的配置中有一个maxmemory<bytes>来设置最大内存,当数据内存达到maxmemory时,便会触发redis的内存淘汰机制,我们一般将这个值设置为物理内存的四分之三
    
    • 内存淘汰策略

      内存淘汰的策略有多种,可以使用maxmemory-policy来设置,除了比较特殊的volotile-ttl和noeviction之前,其他6种策略可以按照前缀分为两类volatileallkeys

      volatile:只针对所有设置了过期时间的key

      allkeys:针对所有key

      • volatile-lru,针对设置了过期时间的key,使用lru算法进行淘汰。
      • allkeys-lru,针对所有key使用lru算法进行淘汰。
      • volatile-lfu,针对设置了过期时间的key,使用lfu算法进行淘汰。
      • allkeys-lfu,针对所有key使用lfu算法进行淘汰。
      • volatile-random,从所有设置了过期时间的key中使用随机淘汰的方式进行淘汰。
      • allkeys-random,针对所有的key使用随机淘汰机制进行淘汰。
      • volatile-ttl,针对设置了过期时间的key,越早过期的越先被淘汰。
      • noeviction,不会淘汰任何数据,当使用的内存空间超过 maxmemory 值时,再有写请求来时返回错误。
    • LRU算法和LFU算法

      🚩LRU:Least Recently Used ,最近最少使用

      LRU基于链表实现,链表中的数据根据数据的访问排序,最新使用的数据会被放在表头,当需要进行内存淘汰时,只需要删除队尾的数据即可 Alt text

      需要注意的是redis并没有采用标准的LRU算法来实现,具体原因如下

      1.需要维护一个所有数据的链表,这就需要额外的内存来存放链表

      2.每次有新数据或者数据被再次访问的时候,都需要调整链表中数据的顺序,尤其是频繁的操作会造成巨大的性能开销。

      🚩LFU:Least Frequently Used, 最不经常使用的

      redis采用近似LRU的算法,LFU。引入访问频率

      LFU基于两个双向链表实现,一个双向链表保存访问频率,在每个访问频率之上保存了该访问频率下的数据,数据同样以双向链表保存。

      Alt text

    • 淘汰池

      1
      
      redis3.0以后引入了淘汰池,在原有的策略之上,过期的key会被放入淘汰池中,淘汰池维护了一个数组,按照未被访问时间从小到大排序,数组最右侧的数据就是最久未被访问的数据,淘汰池默认大小为16, 放在最右边的数据会被删除
      
      • 判断是否需要释放内存
      • 循环释放内存直到满足要求
    • redis内存淘汰策略选择

    Alt text

This post is licensed under CC BY 4.0 by the author.