当前位置: 首页 > news >正文

Redis 内存优化

Redis 内存优化

Redis性能优化可以从多个方面进行,主要包括以下几个方面:


1. 内存优化

Redis 是基于内存的数据库,优化内存使用可以提高性能并降低成本。

(1) 使用合适的数据结构

不同的数据结构占用的内存不同,选择合适的数据结构可以减少内存使用:

  • 字符串(String):适用于存储简单键值对,避免存储过长的字符串。
  • 列表(List):适用于有序集合,避免存储超长的列表。
  • 哈希(Hash):适用于存储对象,如果字段较少,推荐使用 Hash 结构而不是多个 String。
  • 集合(Set)有序集合(Sorted Set):适用于去重或排序的场景。

(2) 开启内存压缩

对于 Hash、List、Set、Zset 这类数据结构,Redis 提供了 ziplist(压缩列表)优化:

  • 调整 hash-max-ziplist-entrieshash-max-ziplist-value
  • 调整 list-max-ziplist-entrieslist-max-ziplist-value
  • 调整 set-max-intset-entries
  • 调整 zset-max-ziplist-entrieszset-max-ziplist-value

合理调整这些参数可以减少内存占用。

(3) 减少键名和字段名长度

  • Redis 的键名不宜过长,例如 user:12345:profile:age 可以改成 u:12345:p:a,减少内存占用。

(4) 使用共享对象

  • 在 Redis 内部,对于小整数(如 0-9999),会使用共享对象来节省内存。
  • 通过 set maxclients 10000 限制最大连接数,避免消耗过多内存。

2. CPU 优化

Redis 是单线程的(除非使用 IO threads),优化 CPU 主要从以下几方面入手:

(1) 避免使用耗时操作

  • 避免 KEYS 命令:使用 SCAN 命令代替,可以减少阻塞时间。
  • 避免 FLUSHALL/FLUSHDB:在大数据量下操作会导致阻塞,可以使用 UNLINK(异步删除)。
  • 避免 LRANGE 0 -1:可以分页 LRANGE start stop 读取数据。
  • 避免 SORT:尽量使用 ZSET 代替 SORT

(2) 使用 Pipelining

如果需要一次性发送多个命令,可以使用 管道(pipelining),减少网络 I/O 和 CPU 解析开销。

(3) 开启 IO Threads

在 Redis 6.0 之后,支持 io-threads,可以开启多线程 I/O 处理:

io-threads 4

这在 高并发请求场景 下可以提高性能。


3. 磁盘 IO 优化

对于持久化模式(RDB 和 AOF),优化磁盘 IO 也能提升性能。

(1) RDB(快照)优化

  • 合理设置 save 规则

    :避免 Redis 频繁生成快照,增加 CPU 和 IO 负担:

    save 900 1
    save 300 10
    save 60 10000
    
  • 关闭 RDB 自动保存

    (如果只使用 AOF 持久化):

    save ""
    
  • 使用 SSD 代替 HDD 以加快 RDB 持久化速度。

(2) AOF(Append Only File)优化

  • 使用 everysec 模式

    (默认),避免

    fsync
    

    频繁写入影响性能:

    appendfsync everysec
    
  • 定期进行 AOF 重写

    ,防止 AOF 文件过大:

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
  • 使用 no-appendfsync-on-rewrite yes

    避免 AOF 重写时同步写磁盘,减少性能影响:

    no-appendfsync-on-rewrite yes
    

4. 网络优化

在高并发场景下,优化网络可以减少 Redis 处理请求的延迟。

(1) 调整 tcp-backlog

默认的 tcp-backlog 可能过小,可以增大该值:

tcp-backlog 511

避免高并发时连接被拒绝。

(2) 开启 tcp-keepalive

可以减少 Redis 处理大量 TIME_WAIT 连接:

tcp-keepalive 60

(3) 使用 UNIX Socket

如果 Redis 只用于本机服务,可以使用 UNIX socket,减少 TCP 开销:

unixsocket /var/run/redis.sock
unixsocketperm 700

然后用 redis-cli -s /var/run/redis.sock 连接。


5. 负载均衡和集群优化

当 Redis 单节点性能达到瓶颈时,可以考虑使用 主从架构分片(Sharding)集群(Cluster) 进行扩展。

(1) 使用主从复制

Redis 支持 主从复制(Replication),可以通过 slaveof 配置多个从节点,分摊读压力:

replicaof <master-ip> <master-port>

然后让应用程序将读请求分发到从节点。

(2) 使用 Redis Sentinel 进行高可用

Redis Sentinel 监控主从状态,自动进行主从切换,提升 Redis 可用性:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

(3) 使用 Redis Cluster 进行分片

当单机 Redis 容量或并发达到瓶颈时,可以使用 Redis Cluster 进行分片:

redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

这样数据会被分片存储在多个节点,提升存储能力和并发处理能力。


6. 其他优化

(1) 限制最大内存

防止 Redis 占用过多内存,可以配置 maxmemory

maxmemory 2gb
maxmemory-policy allkeys-lru

选择合适的淘汰策略(如 allkeys-lru)。

(2) 限制最大客户端连接数

防止 Redis 被大量连接占满:

maxclients 10000

(3) 监控 Redis 性能

使用 INFO 命令监控 Redis 运行状态:

redis-cli INFO

或者使用 slowlog 监控慢查询:

redis-cli SLOWLOG GET 10

总结

优化方向具体措施
内存优化使用合适的数据结构、压缩列表、缩短键名、开启共享对象
CPU 优化避免耗时操作(如 KEYS、FLUSHALL)、使用 Pipelining、开启 IO 线程
磁盘 IO调整 RDB/AOF 策略、开启 AOF rewrite、使用 SSD
网络优化调整 tcp-backlog、使用 UNIX Socket、开启 tcp-keepalive
负载均衡主从复制、Redis Sentinel、Redis Cluster
其他优化限制 maxmemorymaxclients,监控 Redis 性能

这些优化可以帮助 Redis 在不同场景下更高效地运行,提高整体性能和稳定性。

相关文章:

  • [C++游戏开发基础]:构造函数浅析,8000+字长文
  • 3.22日竞蓝全扫盘
  • git的底层原理
  • 参数问题~
  • 如何区别在Spring Boot 2 和 Spring Boot 3 中使用 Knife4j:集成与配置指南
  • SinoSteel生产企业ERP实施建议书final(143页PPT)(文末有下载方式)
  • 数据库:一文掌握 GraphQL 的各种指令(GraphQL指令备忘)
  • 【HDLBits】Circuits—Combinational Logic合集(包含答案推导过程)
  • 有序数组双指针问题
  • Flutter TextFormField 完全手册与设计最佳实践
  • MyBatis 中 #{} 和 ${} 的区别详解
  • 前沿分享|处理LLM幻觉问题-CoN|笔记链:增强检索增强语言模型的鲁棒性
  • 数据中台建设系列(一):数据中台的前世今生
  • Spring AI Alibaba ChatModel使用
  • debian12 安装docker服务
  • Java 方法执行原理底层解析
  • spss statistics 在mac上安装
  • 【leetcode hot 100 131】分割回文串
  • Docker 安装 Mysql
  • Ubuntu 20.04 安装并使用Cursor
  • 《亡命驾驶》:一场对于男子气概的终极幻想
  • 天问三号开放20千克质量资源,邀国际合作开展火星探测研究
  • 国际乒联祝贺王励勤当选中国乒协主席并向刘国梁致谢
  • 威廉·透纳诞辰250周年|他是现代艺术之父
  • 经济日报刊文:如何破除“内卷式”竞争
  • 山东省淄博市委原常委宋振波被“双开”