`
blueswind8306
  • 浏览: 124761 次
  • 来自: ...
社区版块
存档分类
最新评论

redis的过期淘汰策略

阅读更多
最近线上遇到Redis内存达到maxmemory限制后,数据淘汰过慢导致拖慢应用请求的问题。后来仔细看了一下Redis的各种数据淘汰策略,总结一下。

首先,Redis有三种删除key的时机,它们对应不同的淘汰策略:
  • 当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key。
  • 由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key。
  • 当前已用内存超过maxmemory限定时,触发主动清理策略。


下面详细说一下定期主动淘汰策略和主动清理策略,以及它们所对应的配置参数的含义。

定期主动淘汰策略
首先,这里的“定期”指的是Redis定期调用databasesCron()函数时触发的清理策略,这个定期的频率由配置文件中的hz参数决定,代表了一秒钟内,后台任务期望被调用的次数。Redis-3.0.0中的默认值是10,代表每秒钟调用10次后台任务。

hz调大将会提高Redis主动淘汰的频率,如果你的Redis存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但Redis作者建议这个值不要超过100。我们实际线上将这个值调大到100,观察到CPU会增加2%左右,但对冷数据的内存释放速度确实有明显的提高(通过观察keyspace个数和used_memory大小)。

除了主动淘汰的频率外,Redis对每次淘汰任务执行的最大时长也有一个限定,这样保证了每次主动淘汰不会过多阻塞应用请求,以下是这个限定计算公式:
#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25 /* CPU max % for keys collection */
...
timelimit = 1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/server.hz/100;

可以看出timelimit和server.hz是一个倒数的关系,也就是说hz配置越大,timelimit就越小。换句话说是每秒钟期望的主动淘汰频率越高,则每次淘汰最长占用时间就越短。这里每秒钟的最长淘汰占用时间是固定的250ms(1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/100),而淘汰频率和每次淘汰的最长时间是通过hz参数控制的。

具体的淘汰过程为:在redis.c/activeExpireCycle()函数中,针对每个db有一个循环,每次从db->expires集合中随机取出20个key,如果有超过5个key过期淘汰,则继续循环。也就是说如果超过25%的key过期淘汰,则继续淘汰,直到随机抽取的key的过期率低于25%,或者整个循环时间超过timelimit的最大限定。则结束整个淘汰过程。

从以上的分析看,当redis中的过期key比率没有超过25%之前,提高hz可以明显提高扫描key的最小个数。假设hz为10,则一秒内最少扫描200个key(一秒调用10次*每次最少随机取出20个key),如果hz改为100,则一秒内最少扫描2000个key;另一方面,如果过期key比率超过25%,则扫描key的个数无上限,但是cpu时间每秒钟最多占用250ms。

maxmemory的主动清理策略
当mem_used内存已经超过maxmemory的设定,对于所有的读写请求,都会触发redis.c/freeMemoryIfNeeded(void)函数以清理超出的内存。注意这个清理过程是阻塞的,直到清理出足够的内存空间。所以如果在达到maxmemory并且调用方还在不断写入的情况下,可能会反复触发主动清理策略,导致请求会有一定的延迟。

清理时会根据用户配置的maxmemory-policy来做适当的清理(一般是LRU或TTL),这里的LRU或TTL策略并不是针对redis的所有key,而是以配置文件中的maxmemory-samples个key作为样本池进行抽样清理。

maxmemory-samples在redis-3.0.0中的默认配置为5,如果增加,会提高LRU或TTL的精准度,redis作者测试的结果是当这个配置为10时已经非常接近全量LRU的精准度了,并且增加maxmemory-samples会导致在主动清理时消耗更多的CPU时间。


建议:
  • 尽量不要触发maxmemory,最好在mem_used内存占用达到maxmemory的一定比例后,需要考虑调大hz以加快淘汰,或者进行集群扩容。
  • 如果能够控制住内存,则可以不用修改maxmemory-samples配置;如果Redis本身就作为LRU cache服务(这种服务一般长时间处于maxmemory状态,由Redis自动做LRU淘汰),可以适当调大maxmemory-samples。



以下是上文中提到的配置参数的说明:

hz参数:
# Redis calls an internal function to perform many background tasks, like
# closing connections of clients in timeout, purging expired keys that are
# never requested, and so forth.
#
# Not all tasks are performed with the same frequency, but Redis checks for
# tasks to perform according to the specified "hz" value.
#
# By default "hz" is set to 10. Raising the value will use more CPU when
# Redis is idle, but at the same time will make Redis more responsive when
# there are many keys expiring at the same time, and timeouts may be
# handled with more precision.
#
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10


maxmemory-policy的清理策略:
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
#
# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
#
#       At the date of writing these commands are: set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction


maxmemory-samples抽样清理的个数:
# LRU and minimal TTL algorithms are not precise algorithms but approximated
# algorithms (in order to save memory), so you can tune it for speed or
# accuracy. For default Redis will check five keys and pick the one that was
# used less recently, you can change the sample size using the following
# configuration directive.
#
# The default of 5 produces good enough results. 10 Approximates very closely
# true LRU but costs a bit more CPU. 3 is very fast but not very accurate.
#
# maxmemory-samples 5
分享到:
评论

相关推荐

    面试官:Redis 过期删除策略和内存淘汰策略有什么区别?.doc

    面试官:Redis 过期删除策略和内存淘汰策略有什么区别?.doc

    redis过期策略和内存淘汰机制.pdf

    介绍的redis过期策略和内存淘汰机制

    Redis 服务等过期策略和内存淘汰策略解析

    Redis 服务等过期策略和内存淘汰策略解析

    浅谈redis的maxmemory设置以及淘汰策略

    关于redis的淘汰策略: Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略: · noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 · allkeys-lru:在主键空间中,...

    Redis面试专题.pdf

    11.Redis 的数据淘汰策略有哪些 12.Redis 当中有哪些数据结构 13.假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来? 14.使用 Redis 做过异步队列吗,是如何...

    Redis面试专题30道.zip

    6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些...

    Redis中LRU淘汰策略的深入分析

    Redis会删除过期键以释放空间,过期键的删除策略有两种: 惰性删除:每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。 定期删除:每隔一段时间,程序就对...

    Redis面试题50道(含答案)_.pdf

    6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些...

    redis.xmind

    redis的数据类型、锁的机制、淘汰策略、缓存过期策略、持久化、内存分配、降低内存占用、集群等知识体系。 redis的数据类型、锁的机制、淘汰策略、缓存过期策略、持久化、内存分配、降低内存占用、集群等知识体系。

    Redis查漏补缺_最易错过的技术要点大扫盲

    Redis查漏补缺; 最易错过的技术要点大扫盲 本文围绕以下几点进行阐述: ...•Redis的过期策略以及内存淘汰机制 •Redis和数据库双写一致性问题 •如何应对缓存穿透和缓存雪崩问题 •如何解决Redis的并发竞争问题

    Redis.mmap

    4、 拓展:布隆过滤器、keys, scan、redis快原因、redis单机瓶颈、集群保证高可用、过期策略、淘汰策略、 5、 电商项目实战使用:为什么是删除缓存,而不是更新缓存?、分布式锁、详情页、购物车、单点登录、

    Redis面试题.pdf

    包含缓存穿透、雪崩、击穿发生原因和解决方案;先更新数据库还是redis(图解);是单线程还是多线程;乐观锁/悲观锁;持久化AOF/RDB + 优缺点;怎么保证原子性的;过期策略介绍+内存淘汰机制 等主流问题。

    redis常见面试题汇总

    redis的过期策略以及内存淘汰机制 回答: redis采用定期清除和惰性删除的策略 redis 并不是每隔100ms 扫描全部的key 而是根据随机抽取一定得key 进行检查key 是否过期, redis 也会在你获取某个key的时候进行检查

    面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)

    Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处?...11、Redis 的回收策略(淘汰策略)? 12、为什么 edis 需要把所有数据放到内存中? 13、Redis 的同步机制了解么? 14、Pipeline 有

    Redis面试精选.docx

    redis的一些核心知识点整理,博客中图片加载有问题,在此放上原文档。适合快速掌握redis的特点、持久化、按key设置过期时间、集群方案、过期数据淘汰策略等

    Redis.xmind

    Redis学习思维导图,主要包括基本数据结构、过期策略与内存淘汰策略、单线程机制

    Redis实战(9)Redis开发与运维.rar

    Redis提供了键值过期时间设置, 并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。 可以这么说, 一个合理的缓存设计能够为一个网站的稳定保驾护航。

    1.redis课程介绍.mp4

    5.删除策略 5.1.数据过期 5.2.惰性删除 5.3.数据淘汰 6.主从复制 6.1.互联网"3高" 6.2.主从复制架构 6.3.主从复制流程 6.4.数据同步 6.5.主从架构搭建 6.6.心跳机制 6.7.主从复制常见问题 7.哨兵机制 7.1...

    redis适合场景八点总结

    Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。 2、排行榜 很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能...

Global site tag (gtag.js) - Google Analytics