当前位置:首页 > 问答 > 正文

Redis缓存容量怎么调大点,设置size参数到底咋用才有效提升性能

关于调大Redis缓存容量并有效设置size参数来提升性能,核心思路就两点:一是给Redis分配更多内存,二是调整其内部淘汰策略和数据结构相关的参数,让多出来的内存能被聪明地使用,而不是简单地浪费,下面我们分步来说。

第一,最根本的:如何给Redis分配更多内存。

这听起来简单,但很多人第一步就搞错了,Redis的容量上限主要取决于你分配给它的最大内存值,这个值不是Redis自己无限增长的,需要你手动设置。

  • 关键参数:maxmemory 这个参数就是Redis能使用的最大内存量,你可以在Redis的配置文件redis.conf里找到并修改它,默认情况下,这个值可能是注释掉的,意味着Redis会尽可能使用服务器的所有可用内存,直到被系统强制干预为止,这非常危险,容易导致服务器因内存耗尽而崩溃。

  • 怎么设置maxmemory

    1. 根据系统总内存来定:绝对不能把maxmemory设置成和你的服务器总内存一样大,必须为操作系统本身以及其他运行的程序(如Web服务器、数据库等)留出足够的内存,一个常见的建议是,如果Redis是主内存消耗者,将其设置为总内存的70%-80%,如果你有8G内存的服务器,可以设置maxmemory 6gb
    2. 在配置文件里修改:找到redis.conf文件,搜索maxmemory,去掉注释,改成你需要的值,maxmemory 4gb,然后重启Redis服务生效。
    3. 通过命令行临时修改(不推荐生产环境用):连接Redis后,输入命令 CONFIG SET maxmemory 4gb,这只是临时生效,重启就没了,要永久生效还得改配置文件。

    信息来源:Redis官方文档关于maxmemory的说明指出,此参数用于配置Redis数据集可以使用的最大内存量。

第二,光有内存不够,还得会管理:设置内存淘汰策略。

Redis缓存容量怎么调大点,设置size参数到底咋用才有效提升性能

你给Redis设置了4GB内存,当数据存满4G后,如果再有新的数据要进来,怎么办?这时候就需要“内存淘汰策略”来决定踢掉哪些旧数据,给新数据腾地方,如果策略没设好,内存再大也会因为频繁、低效的淘汰操作而影响性能。

  • 关键参数:maxmemory-policy 这个参数就是告诉Redis,当内存满了之后,你希望它按照什么规则来删除数据。

  • 常用的策略有哪些?怎么选?

    • volatile-lru:这是最常用的策略,它只会在那些设置了过期时间的键中,挑最近最少使用的进行删除,如果你的数据有些是长期有效的核心数据,有些是临时缓存,用这个策略非常好,它能保护核心数据不被误删。
    • allkeys-lru:不管键有没有设置过期时间,从所有键中挑最近最少使用的删除,如果你的数据没有明确区分缓存和持久数据,或者全都是缓存,用这个策略效果更好。
    • volatile-ttl:在设置了过期时间的键中,挑剩余寿命最短的删除,这适合你希望尽快清理掉即将过期的数据。
    • noeviction默认策略,当内存不足时,新写入操作会报错,读操作正常,这适用于你希望数据绝对不能丢失的场景,但前提是你要确保你的应用能正确处理这些写入错误,否则服务会不可用。对于绝大多数缓存场景,不要用这个默认值!

    选择策略的核心是匹配你的业务逻辑,你的应用是新闻站,越新的新闻越热,老新闻没人看,用allkeys-lru就很合适,它会自动把老新闻挤掉,信息来源:Redis官方文档详细描述了每种maxmemory-policy的行为和适用场景。

    Redis缓存容量怎么调大点,设置size参数到底咋用才有效提升性能

第三,优化内部结构,让内存用得更高效。

性能瓶颈不是内存总量,而是内存的“碎片化”和数据结构本身的效率。

  • 关注内存碎片率: 操作系统分配内存的方式可能导致Redis虽然显示使用了4G内存,但可能其中500M是无法被利用的碎片,你可以通过INFO memory命令查看mem_fragmentation_ratio这个值,如果这个值持续远大于1.5(比如超过2.0),就说明碎片化比较严重了。

    • 解决办法:Redis 4.0及以上版本支持通过命令 CONFIG SET activedefrag yes 开启自动内存碎片整理,但这会消耗额外CPU,需要根据情况权衡。
  • 优化哈希、列表等数据结构: Redis在底层存储小哈希表、小列表等数据结构时,为了节省内存,采用了一种叫“ziplist”的紧凑格式,但当元素数量或大小超过某个阈值时,它会转换成标准的哈希表或链表,虽然性能依然好,但内存占用会变多。

    • 相关参数hash-max-ziplist-entries, hash-max-ziplist-value, list-max-ziplist-size 等,这些参数控制着转换的阈值。
    • 怎么调:如果你的应用有大量的小哈希结构(比如存储对象属性),可以适当调大hash-max-ziplist-entries的值(比如从默认的512调到1024),让更多的哈希结构以ziplist形式存储,从而节省内存,节省了内存,就等于变相扩大了可用缓存容量。但要注意,阈值设得太大,在操作大对象时性能会下降,需要根据实际数据特征进行测试和权衡,信息来源:Redis官方文档关于内存优化的章节深入解释了ziplist及其相关参数的工作原理。

总结一下有效提升性能的步骤:

  1. 基础扩容:根据服务器情况,在redis.conf中合理设置maxmemory大小。
  2. 核心设置:根据业务场景(数据是否有过期时间、数据的重要性),选择并设置合适的maxmemory-policy千万不要用默认的noeviction
  3. 高级优化:监控内存碎片,必要时开启碎片整理;分析你的数据模式,微调hash-max-ziplist-entries这类参数,用更少的内存存更多的数据。
  4. 监控:使用INFO memory命令定期监控used_memory(已用内存)、mem_fragmentation_ratio(碎片率)等关键指标,做到心中有数。

调大容量不是一劳永逸的,配合聪明的管理策略,才能让多出来的每一兆内存都真正转化为性能提升。