Redis内存管理

Redis通过控制内存上限和回收策略实现内存管理,使用maxmemory参数限制最大可用内存,限制内存的主要目的是:用于缓存场景,当超出内存上限时使用LRU等删除策略释放空间;防止所用内存超过服务器的物理内存。

内存回收的策略

1、删除过期键对象,由于内存中保存了大量的键,维护键精准的过期删除机制会导致消耗大量的CPU,对于单线程的Redis来说成本过高,因此,Redis采用惰性删除和定时任务删除机制来实现过期键的内存回收。

1.1、惰性删除:惰性删除用于当client端读取到带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,该策略是出于节省CPU成本考虑,不需要单独维护TTL链表来处理过期键的删除。该方式存在内存泄漏的可能,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。

1.2、定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次,定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例,使用快慢两种速率模式回收键。

内存溢出控制策略

当Redis所用内存达到maxmemory上限时会触发相应的溢出控制策略,策略由maxmemory-policy参数控制,可以通过config set maxmemory-policy {policy} 动态设置。

1、noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回client端OOM错误信息,此时Redis只响应读操作;

2、volatile-lru:根据LRU算法删除设置了超时属性的键,直到释放足够空间为止,如果没有可删除的键对象,回退到noeviction策略;

3、allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时时间,直到释放足够的内存空间为止;

4、allkeys-random:随机删除所有键,直到释放足够的内存空间为止;

5、volatile-random:随机删除过期键,直到释放足够的内存空间为止;

6、volatile-ttl:根据键对象的ttl属性,删除最近将要过期的数据,如果没有,回退到noeviction策略。

你可能感兴趣的:(Redis)