Redis集群设置maxmemory参数的实现

 更新时间:2026年01月16日 10:50:29   作者:alden_ygq  
Redis集群中设置内存限制需要为每个节点单独配置maxmemory参数,本文就来介绍一下Redis集群设置maxmemory参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Redis 集群中设置内存限制需要为每个节点单独配置 maxmemory 参数。以下是详细的操作指南:

设置步骤

1. 连接到每个集群节点

# 获取所有集群节点信息
redis-cli -c CLUSTER NODES

# 示例输出:
d1861060fe6a534d42d8a19aeb36600e18785e04 127.0.0.1:7001@17001 master - 0 1620000000000 1 connected 0-5460
289279eb7dbfa1b2d5e7e9c3e8d4f5a6b7c8d9e0 127.0.0.1:7002@17002 master - 0 1620000000000 2 connected 5461-10922

2. 为每个节点设置 maxmemory

# 连接到第一个节点
redis-cli -h 127.0.0.1 -p 7001

# 设置 2GB 内存限制
127.0.0.1:7001> CONFIG SET maxmemory 2gb
OK

# 设置淘汰策略(推荐 allkeys-lru)
127.0.0.1:7001> CONFIG SET maxmemory-policy allkeys-lru
OK

# 验证设置
127.0.0.1:7001> CONFIG GET maxmemory
1) "maxmemory"
2) "2147483648"

# 对其他节点重复相同操作

3. 修改配置文件(永久生效)

在每个节点的 redis.conf 文件中添加:

# 设置最大内存为 2GB
maxmemory 2gb

# 设置内存淘汰策略
maxmemory-policy allkeys-lru

# 集群模式特定配置
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes.conf

4. 批量设置脚本

#!/bin/bash

# 节点列表
NODES=(
    "127.0.0.1:7001"
    "127.0.0.1:7002"
    "127.0.0.1:7003"
    "127.0.0.1:7004"
    "127.0.0.1:7005"
    "127.0.0.1:7006"
)

MEMORY_LIMIT="2gb"  # 内存限制
POLICY="allkeys-lru" # 淘汰策略

for node in "${NODES[@]}"; do
    ip=${node%:*}
    port=${node#*:}
    
    echo "Configuring $ip:$port"
    
    redis-cli -h $ip -p $port CONFIG SET maxmemory $MEMORY_LIMIT
    redis-cli -h $ip -p $port CONFIG SET maxmemory-policy $POLICY
    redis-cli -h $ip -p $port CONFIG REWRITE
    
    # 验证配置
    redis-cli -h $ip -p $port CONFIG GET maxmemory
    redis-cli -h $ip -p $port CONFIG GET maxmemory-policy
done

集群内存管理最佳实践

1. 内存分配策略

节点类型推荐内存比例说明
主节点70-80% 系统内存存储实际数据
从节点等同主节点保证故障转移能力
集群管理节点1-2GB运行集群管理进程

2. 监控关键指标

# 查看集群内存使用概览
redis-cli -c --cluster check 127.0.0.1:7001

# 检查单个节点内存
redis-cli -h 127.0.0.1 -p 7001 INFO memory

关键指标:

  • used_memory_human:当前使用内存
  • maxmemory_human:配置的最大内存
  • mem_fragmentation_ratio:内存碎片率
  • evicted_keys:因内存不足被淘汰的键数量

3. 内存优化技巧

  1. 使用 Hash 分片

    # 大键分片示例
    HSET user:1000 profile:basic "name,age"
    HSET user:1000 profile:contact "email,phone"
  2. 启用内存压缩

    # redis.conf
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
  3. 定期执行内存整理

    # Redis 4.0+ 内存碎片整理
    redis-cli -h 127.0.0.1 -p 7001 MEMORY PURGE

4. 集群扩容策略

当内存使用超过 80% 时考虑扩容:

# 添加新节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

# 迁移槽位
redis-cli --cluster reshard 127.0.0.1:7001

高级配置

1. 不同节点设置不同内存限制

# 高负载节点设置更大内存
redis-cli -h 127.0.0.1 -p 7001 CONFIG SET maxmemory 4gb

# 低负载节点设置较小内存
redis-cli -h 127.0.0.1 -p 7002 CONFIG SET maxmemory 1gb

2. 动态调整策略

#!/bin/bash
# 自动调整内存脚本

THRESHOLD=90 # 内存使用阈值%

for node in "${NODES[@]}"; do
    ip=${node%:*}
    port=${node#*:}
    
    # 获取内存使用率
    usage=$(redis-cli -h $ip -p $port INFO memory | grep -oP 'mem_allocated_percent:\K\d+')
    
    if [ $usage -gt $THRESHOLD ]; then
        # 增加 10% 内存
        current_mem=$(redis-cli -h $ip -p $port CONFIG GET maxmemory | tail -1)
        new_mem=$((current_mem * 11 / 10))
        redis-cli -h $ip -p $port CONFIG SET maxmemory $new_mem
        echo "Increased memory on $ip:$port to $new_mem"
    fi
done

3. 使用 Redis 模块优化内存

# 加载内存优化模块
loadmodule /path/to/redisbloom.so
loadmodule /path/to/redisearch.so

# 使用 Bloom 过滤器
BF.RESERVE users 0.01 1000000

故障排除

常见问题及解决方案

问题症状解决方案
内存不足OOM command not allowed 错误增加 maxmemory 或优化数据结构
高内存碎片mem_fragmentation_ratio > 1.5执行 MEMORY PURGE 或重启节点
淘汰率过高evicted_keys 快速增加调整淘汰策略或增加内存
槽位不均衡部分节点内存使用率高重新分配槽位 redis-cli --cluster rebalance

诊断命令

# 查找内存消耗大的键
redis-cli -h 127.0.0.1 -p 7001 --bigkeys

# 内存分析
redis-cli -h 127.0.0.1 -p 7001 MEMORY STATS

# 监控淘汰事件
redis-cli -h 127.0.0.1 -p 7001 MONITOR | grep evicted

生产环境建议

  1. 监控系统

    • 使用 Prometheus + Grafana 监控集群内存使用

    • 设置警报规则(内存 > 85% 时报警)

  2. 备份策略

    # 定期备份集群配置
    redis-cli CLUSTER NODES > cluster-backup-$(date +%F).txt
  3. 安全配置

    # redis.conf
    rename-command CONFIG "REDISCONFIG"
    requirepass "strongpassword"
    masterauth "replicationpassword"
  4. 滚动重启

    # 安全重启集群节点
    for port in {7001..7006}; do
      redis-cli -h 127.0.0.1 -p $port CLUSTER FAILOVER TAKEOVER
      redis-cli -h 127.0.0.1 -p $port shutdown
      sleep 5
      redis-server /path/to/redis-$port.conf
      sleep 10
    done

配置示例文件

redis-cluster-node.conf

# 基本配置
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

# 内存管理
maxmemory 4gb
maxmemory-policy allkeys-lru

# 持久化
appendonly yes
appendfilename "appendonly.aof"
aof-rewrite-incremental-fsync yes

# 安全
requirepass "your_strong_password"
masterauth "replication_password"

# 优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
activerehashing yes

总结

在 Redis 集群中设置 maxmemory 的关键点:

  • 单独配置:每个节点需要单独设置内存限制
  • 统一策略:建议所有节点使用相同的淘汰策略
  • 动态调整:根据负载情况动态调整内存限制
  • 监控预警:实时监控内存使用,设置预警阈值
  • 定期优化:使用内存整理和数据结构优化减少碎片
  • 容量规划:当内存使用超过 80% 时考虑扩容

通过合理配置 maxmemory 和淘汰策略,可以确保 Redis 集群在高负载下稳定运行,防止内存溢出导致的系统崩溃。同时结合监控和自动化工具,可以实现内存使用的动态管理和优化。

到此这篇关于Redis集群设置maxmemory参数的实现的文章就介绍到这了,更多相关Redis 设置maxmemory参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis 整数集合的具体使用(intset)

    Redis 整数集合的具体使用(intset)

    对于集合,STL 的 set 相信大家都不陌生,本文主要介绍了整数集合,又称为 intset,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Redis为什么默认有16个数据库问题

    Redis为什么默认有16个数据库问题

    这篇文章主要介绍了Redis为什么默认有16个数据库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 基于Redis位图实现系统用户登录统计

    基于Redis位图实现系统用户登录统计

    这篇文章主要介绍了基于Redis位图实现系统用户登录统计,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Redis实现集群搭建+集群读写的示例

    Redis实现集群搭建+集群读写的示例

    本文介绍了Redis集群的搭建和读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Redis如何实现投票功能

    Redis如何实现投票功能

    这篇文章主要介绍了Redis如何实现投票功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 基于Redis实现登录功能思路详解(手机号+验证码)

    基于Redis实现登录功能思路详解(手机号+验证码)

    本文介绍了使用手机号和验证码登录的方式,验证码通过控制台输出,重点解释了UserServiceImpl实现类的结构,包括sendCode、login和createUserWithPhone方法,还介绍了拦截器框架,包括preHandle和拦截器链的配置,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 小白也能看懂的Redis遍历键和数据库管理详解

    小白也能看懂的Redis遍历键和数据库管理详解

    这篇文章主要为大家介绍了小白也能看懂的Redis遍历键和数据库管理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Redis教程(十):持久化详解

    Redis教程(十):持久化详解

    这篇文章主要介绍了Redis教程(十):持久化详解,本文讲解了Redis提供了哪些持久化机制、RDB机制的优势和劣势、AOF机制的优势和劣势、其它等内容,需要的朋友可以参考下
    2015-04-04
  • 关于redis可视化工具读取数据乱码问题

    关于redis可视化工具读取数据乱码问题

    大家来聊一聊在日常操作redis时用的是什么工具,redis提供的一些命令你都了解了吗,今天通过本文给大家介绍redis可视化工具读取数据乱码问题,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Redis主从/哨兵机制原理分析

    Redis主从/哨兵机制原理分析

    本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故障转移等步骤,确保Redis集群的高可用性
    2025-01-01

最新评论