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 处理:

ini 复制代码
io-threads 4

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


3. 磁盘 IO 优化

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

(1) RDB(快照)优化

  • 合理设置 save 规则

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

    ini 复制代码
    save 900 1
    save 300 10
    save 60 10000
  • 关闭 RDB 自动保存

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

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

(2) AOF(Append Only File)优化

  • 使用 everysec 模式

    (默认),避免

    复制代码
    fsync

    频繁写入影响性能:

    ini 复制代码
    appendfsync everysec
  • 定期进行 AOF 重写

    ,防止 AOF 文件过大:

    ini 复制代码
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
  • 使用 no-appendfsync-on-rewrite yes

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

    ini 复制代码
    no-appendfsync-on-rewrite yes

4. 网络优化

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

(1) 调整 tcp-backlog

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

ini 复制代码
tcp-backlog 511

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

(2) 开启 tcp-keepalive

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

ini 复制代码
tcp-keepalive 60

(3) 使用 UNIX Socket

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

ini 复制代码
unixsocket /var/run/redis.sock
unixsocketperm 700

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


5. 负载均衡和集群优化

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

(1) 使用主从复制

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

shell 复制代码
replicaof <master-ip> <master-port>

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

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

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

ini 复制代码
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 进行分片:

shell 复制代码
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

ini 复制代码
maxmemory 2gb
maxmemory-policy allkeys-lru

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

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

防止 Redis 被大量连接占满:

ini 复制代码
maxclients 10000

(3) 监控 Redis 性能

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

shell 复制代码
redis-cli INFO

或者使用 slowlog 监控慢查询:

shell 复制代码
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 在不同场景下更高效地运行,提高整体性能和稳定性。

相关推荐
hao_wujing几秒前
攻击模型的恶意行为检测
网络·数据库·php
秃头摸鱼侠1 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck1 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机1 小时前
6. MySQL基本查询
数据库·mysql
�FENG1 小时前
Redis 安装配置和性能优化
redis·持久化
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩2 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang2 小时前
负载均衡LB》》HAproxy
运维·数据库·负载均衡