1. 首页 > Redis教程 > 正文

Redis教程FG035-Redis内存管理与优化实战

本文档风哥主要介绍Redis内存管理与优化实战,包括内存管理概念、Redis内存结构、内存限制与策略、内存规划、内存监控、内存优化策略、内存配置、内存管理命令、内存调优实战以及实战案例等内容,风哥教程参考Redis官方文档等内容编写,适合DBA人员和开发人员在生产环境中使用。

Part01-基础概念与理论知识

1.1 内存管理概念

内存管理是指对Redis使用的内存进行监控、管理和优化,确保Redis能够高效地使用内存资源,避免内存溢出和性能下降。Redis是一个内存数据库,内存的使用情况直接影响其性能和稳定性。

  • 内存分配:Redis如何分配和管理内存
  • 内存使用:Redis内存的使用情况,包括数据、索引、缓冲区等
  • 内存限制:Redis的内存限制设置,防止内存溢出
  • 内存回收:Redis的内存回收策略,如过期键删除、内存淘汰等

1.2 Redis内存结构

# Redis内存结构

## 1. 内存组成
– 数据内存:存储键值对数据
– 索引内存:存储键的索引信息
– 缓冲区内存:客户端缓冲区、复制缓冲区等
– 进程内存:Redis进程本身使用的内存
– 其他内存:如Redis模块、AOF重写缓冲区等

## 2. 内存使用分析
– 数据内存:使用INFO命令查看,如used_memory
– 索引内存:使用INFO命令查看,如used_memory_rss
– 缓冲区内存:使用INFO命令查看,如client_biggest_input_buf
– 进程内存:使用top命令查看

## 3. 内存碎片
– 内存碎片率:used_memory_rss / used_memory
– 碎片率过高:表示内存碎片严重,需要优化
– 碎片率过低:表示内存使用效率低,需要调整

1.3 内存限制与策略

# 内存限制与策略

## 1. 内存限制
– maxmemory:设置Redis的最大内存使用量
– maxmemory-policy:设置内存淘汰策略

## 2. 内存淘汰策略
– noeviction:当内存不足时,拒绝写入操作
– allkeys-lru:在所有键中,删除最近最少使用的键
– allkeys-random:在所有键中,随机删除键
– volatile-lru:在设置了过期时间的键中,删除最近最少使用的键
– volatile-random:在设置了过期时间的键中,随机删除键
– volatile-ttl:在设置了过期时间的键中,删除剩余时间最短的键

## 3. 过期键删除策略
– 惰性删除:当访问键时,检查是否过期,过期则删除
– 定期删除:定期扫描过期键并删除
– 内存淘汰:当内存不足时,根据淘汰策略删除键

更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 内存规划

内存规划建议:

  • 内存大小:根据业务需求和数据量,合理规划Redis的内存大小
  • 内存预留:预留足够的内存空间,避免内存溢出
  • 内存分配:合理分配内存给Redis和其他进程
  • 内存监控:建立内存监控机制,及时发现内存问题

2.2 内存监控

# 内存监控

## 1. 监控命令
– INFO memory:查看内存使用情况
– MEMORY USAGE key:查看指定键的内存使用情况
– MEMORY STATS:查看内存统计信息
– MEMORY PURGE:尝试释放内存

## 2. 监控指标
– used_memory:Redis使用的内存总量
– used_memory_rss:Redis占用的物理内存
– used_memory_peak:Redis使用的内存峰值
– mem_fragmentation_ratio:内存碎片率
– used_memory_lua:Lua脚本引擎使用的内存
– maxmemory:Redis的最大内存限制
– maxmemory_policy:内存淘汰策略

## 3. 监控工具
– Redis CLI:使用命令行工具监控
– Redis Exporter:用于Prometheus监控
– Grafana:可视化监控面板
– 第三方监控工具:如Redis Sentinel、Redis Cluster等

2.3 内存优化策略

# 内存优化策略

## 1. 数据结构优化
– 使用合适的数据结构:如Hash、List、Set、ZSet等
– 优化键的设计:使用短键名,避免过长的键名
– 优化值的大小:避免存储过大的值

## 2. 内存淘汰策略
– 根据业务需求选择合适的内存淘汰策略
– 合理设置过期时间:对不需要长期存储的数据设置过期时间
– 定期清理过期数据:使用EXPIRE命令设置过期时间

## 3. 内存碎片优化
– 重启Redis:当内存碎片率过高时,重启Redis可以减少内存碎片
– 调整内存分配器:使用jemalloc等高效的内存分配器
– 合理设置maxmemory:避免内存过度使用导致的碎片

## 4. 配置优化
– 调整maxmemory:根据实际内存大小设置合理的限制
– 调整maxmemory-policy:选择合适的内存淘汰策略
– 调整hash-max-ziplist-entries和hash-max-ziplist-value:优化Hash数据结构的内存使用
– 调整list-max-ziplist-size和list-compress-depth:优化List数据结构的内存使用

学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 内存配置

# 内存配置

## 1. 配置文件修改
# 编辑Redis配置文件
$ vi /redis/app/redis.conf

# 内存配置
maxmemory 4GB # 设置最大内存为4GB
maxmemory-policy allkeys-lru # 设置内存淘汰策略为allkeys-lru

# 数据结构优化配置
hash-max-ziplist-entries 512 # Hash数据结构使用ziplist的最大条目数
hash-max-ziplist-value 64 # Hash数据结构使用ziplist的最大值大小
list-max-ziplist-size -2 # List数据结构使用ziplist的大小限制(-2表示8KB)
list-compress-depth 0 # List数据结构的压缩深度
set-max-intset-entries 512 # Set数据结构使用intset的最大条目数
zset-max-ziplist-entries 128 # ZSet数据结构使用ziplist的最大条目数
zset-max-ziplist-value 64 # ZSet数据结构使用ziplist的最大值大小

## 2. 运行时配置
# 查看当前内存配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config get maxmemory
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config get maxmemory-policy

# 修改内存配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory 4GB
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru

# 保存配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config rewrite

3.2 内存管理命令

# 内存管理命令

## 1. 查看内存使用情况
# 查看内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory

# 输出示例
# Memory
used_memory:104857600
used_memory_human:100.00M
used_memory_rss:157286400
used_memory_rss_human:150.00M
used_memory_peak:209715200
used_memory_peak_human:200.00M
used_memory_lua:37888
used_memory_lua_human:37.00K
mem_fragmentation_ratio:1.50
mem_allocator:jemalloc-5.1.0

## 2. 查看指定键的内存使用情况
# 查看指定键的内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory usage user:1001

# 输出示例
(integer) 100

## 3. 查看内存统计信息
# 查看内存统计信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory stats

# 输出示例
1) “peak.allocated”
2) (integer) 209715200
3) “total.allocated”
4) (integer) 104857600
5) “startup.allocated”
6) (integer) 1048576
7) “replication.backlog”
8) (integer) 0
9) “clients.slaves”
10) (integer) 0
11) “clients.normal”
12) (integer) 496
13) “aof.buffer”
14) (integer) 0
15) “db.0”
16) 1) “overhead.hashtable.main”
2) (integer) 131072
3) “overhead.hashtable.expires”
4) (integer) 0
17) “overhead.total”
18) (integer) 131568
19) “keys.count”
20) (integer) 1000
21) “keys.bytes-per-key”
22) (integer) 104726

## 4. 尝试释放内存
# 尝试释放内存
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory purge

## 5. 查看内存使用情况的详细信息
# 查看内存使用情况的详细信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory doctor

# 输出示例
Hello, this is Redis Memory Doctor.

I can help you to analyze Redis memory usage.

Please provide me with the output of the INFO memory command.

3.3 内存调优实战

# 内存调优实战

## 1. 数据结构优化
# 优化Hash数据结构
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001 name “张三” age “20” gender “男”

# 优化List数据结构
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush list:1 1 2 3 4 5

# 优化Set数据结构
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd set:1 1 2 3 4 5

# 优化ZSet数据结构
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd zset:1 1 “a” 2 “b” 3 “c”

## 2. 过期时间设置
# 设置过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 setex temp:1 3600 “value”

# 查看过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl temp:1

## 3. 内存淘汰策略调整
# 查看当前内存淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config get maxmemory-policy

# 修改内存淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru

## 4. 内存碎片优化
# 查看内存碎片率
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory | grep mem_fragmentation_ratio

# 输出示例
mem_fragmentation_ratio:1.50

# 当内存碎片率过高时,重启Redis
$ systemctl restart redis

## 5. 内存监控
# 编写监控脚本
#!/bin/bash
# memory_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

REDIS_CLI=”/redis/app/bin/redis-cli”
HOST=”192.168.1.100″
PORT=”6379″
PASSWORD=”fgedu@2026″

# 查看内存使用情况
$REDIS_CLI -h $HOST -p $PORT -a $PASSWORD info memory

# 查看内存碎片率
FRAG_RATIO=$($REDIS_CLI -h $HOST -p $PORT -a $PASSWORD info memory | grep mem_fragmentation_ratio | awk -F: ‘{print $2}’)
echo “内存碎片率: $FRAG_RATIO”

# 查看内存使用最高的键
$REDIS_CLI -h $HOST -p $PORT -a $PASSWORD –bigkeys

风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。

Part04-生产案例与实战讲解

4.1 内存泄漏排查

# 内存泄漏排查

## 1. 场景描述
– Redis内存使用持续增长,即使没有新的数据写入
– 内存碎片率过高
– 系统性能下降

## 2. 解决方案
– 排查内存泄漏的原因
– 优化内存使用
– 修复内存泄漏问题

## 3. 实战操作
# 查看内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory

# 查看内存使用最高的键
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys

# 输出示例
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far ‘user:1000000’ with 100 bytes
[05.00%] Biggest list found so far ‘list:1’ with 100000 items
[10.00%] Biggest hash found so far ‘hash:1’ with 10000 fields
[15.00%] Biggest set found so far ‘set:1’ with 10000 members
[20.00%] Biggest zset found so far ‘zset:1’ with 10000 members

——– summary ——-

Sampled 50000 keys in the keyspace!
Total key length in bytes is 500000 (avg len 10.00)

Biggest string found ‘user:1000000’ has 100 bytes
Biggest list found ‘list:1’ has 100000 items
Biggest hash found ‘hash:1’ has 10000 fields
Biggest set found ‘set:1’ has 10000 members
Biggest zset found ‘zset:1’ has 10000 members

25000 strings with 2500000 bytes (50.00% of keys, avg size 100.00)
10000 lists with 1000000 items (20.00% of keys, avg size 100.00)
10000 hashs with 1000000 fields (20.00% of keys, avg size 100.00)
2500 sets with 250000 members (5.00% of keys, avg size 100.00)
2500 zsets with 250000 members (5.00% of keys, avg size 100.00)

# 查看键的过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 keys “*” | xargs -I {} $REDIS_CLI -h $HOST -p $PORT -a $PASSWORD ttl {}

# 查找没有设置过期时间的键
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 keys “*” | xargs -I {} sh -c “if [ \”$($REDIS_CLI -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl {})\” -eq -1 ]; then echo {}; fi”

# 优化内存使用
# 删除不需要的键
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 del bigkey:1

# 设置过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire key:1 3600

4.2 内存使用优化

# 内存使用优化

## 1. 场景描述
– Redis内存使用过高,接近最大内存限制
– 系统性能下降,响应时间变长
– 内存淘汰频繁发生

## 2. 解决方案
– 优化数据结构
– 合理设置过期时间
– 调整内存淘汰策略
– 增加内存或使用Redis Cluster

## 3. 实战操作
# 优化数据结构
# 使用Hash存储用户信息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001 name “张三” age “20” gender “男”

# 查看内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory usage user:1001

# 输出示例
(integer) 100

# 合理设置过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 setex temp:1 3600 “value”

# 调整内存淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru

# 增加内存
# 修改配置文件
$ vi /redis/app/redis.conf
maxmemory 8GB

# 重启Redis服务
$ systemctl restart redis

# 使用Redis Cluster
# 部署Redis Cluster
$ /redis/app/bin/redis-cli –cluster create 192.168.1.100:7000 192.168.1.101:7000 192.168.1.102:7000 192.168.1.100:7001 192.168.1.101:7001 192.168.1.102:7001 –cluster-replicas 1 -a fgedu@2026

4.3 内存压力测试

# 内存压力测试

## 1. 场景描述
– 测试Redis在高内存使用情况下的性能
– 评估Redis的内存管理能力
– 验证内存淘汰策略的有效性

## 2. 解决方案
– 使用redis-benchmark工具进行内存压力测试
– 模拟高内存使用场景
– 监控内存使用情况和系统性能

## 3. 实战操作
# 内存压力测试
# 生成测试数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 script load “for i=1,1000000 do redis.call(‘set’, ‘key:’..i, ‘value:’..i) end”

# 执行测试脚本
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 evalsha 0

# 监控内存使用情况
$ watch -n 1 “/redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory | grep used_memory”

# 执行基准测试
$ /redis/app/bin/redis-benchmark -h 192.168.1.100 -p 6379 -a fgedu@2026 -t set,get -n 100000 -c 50

# 输出示例
====== SET ======
100000 requests completed in 0.98 seconds
50 parallel clients
3 bytes payload
keep alive: 1

99.75% <= 1 milliseconds 99.99% <= 2 milliseconds 100.00% <= 2 milliseconds 102040.82 requests per second ====== GET ====== 100000 requests completed in 0.95 seconds 50 parallel clients 3 bytes payload keep alive: 1 99.80% <= 1 milliseconds 99.99% <= 2 milliseconds 100.00% <= 2 milliseconds 105263.16 requests per second # 验证内存淘汰策略 # 设置最大内存为100MB $ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory 100mb # 设置内存淘汰策略为allkeys-lru $ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru # 生成更多测试数据 $ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 script load "for i=1,2000000 do redis.call('set', 'key:'..i, 'value:'..i) end" $ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 evalsha 0

# 查看内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory

# 查看键的数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 dbsize

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 最佳实践

Redis内存管理与优化实战最佳实践:

  • 合理规划内存:根据业务需求和数据量,合理规划Redis的内存大小,学习交流加群风哥微信: itpux-com
  • 优化数据结构:使用合适的数据结构,优化键的设计,避免存储过大的值
  • 合理设置过期时间:对不需要长期存储的数据设置过期时间,定期清理过期数据
  • 选择合适的内存淘汰策略:根据业务需求选择合适的内存淘汰策略
  • 监控内存使用:建立完善的内存监控机制,及时发现内存问题
  • 优化内存碎片:当内存碎片率过高时,重启Redis可以减少内存碎片
  • 调整配置参数:根据实际情况,调整Redis的配置参数,优化内存使用
  • 持续优化:根据实际情况,持续优化内存管理策略

5.2 常见问题

常见问题及解决:

  • 内存溢出:设置合理的maxmemory,选择合适的内存淘汰策略
  • 内存碎片率过高:重启Redis,调整内存分配器,合理设置maxmemory
  • 内存使用过高:优化数据结构,合理设置过期时间,使用Redis Cluster
  • 内存淘汰频繁:调整内存淘汰策略,增加内存,优化数据结构
  • 性能下降:优化内存使用,调整配置参数,使用Redis Cluster

5.3 优化技巧

风哥提示:Redis内存管理是确保系统性能和稳定性的重要因素,合理的内存管理策略可以提高Redis的性能,避免内存溢出和性能下降。在实际应用中,需要根据具体业务场景和数据特点,选择合适的内存管理策略和配置参数。

# 优化技巧

## 1. 数据结构优化
– 使用Hash存储对象数据,减少内存使用
– 使用List存储有序数据,避免使用多个键
– 使用Set存储唯一数据,避免重复
– 使用ZSet存储排序数据,提高查询效率

## 2. 键设计优化
– 使用短键名,减少内存使用
– 使用命名空间,避免键冲突
– 避免使用过长的值,如大字符串、大列表等

## 3. 过期时间优化
– 对临时数据设置合理的过期时间
– 使用EXPIRE命令定期清理过期数据
– 避免设置过长的过期时间,占用内存

## 4. 内存淘汰策略优化
– 根据业务需求选择合适的内存淘汰策略
– 对于缓存场景,使用allkeys-lru策略
– 对于有过期时间的场景,使用volatile-lru策略

## 5. 配置参数优化
– 调整maxmemory:根据实际内存大小设置合理的限制
– 调整maxmemory-policy:选择合适的内存淘汰策略
– 调整hash-max-ziplist-entries和hash-max-ziplist-value:优化Hash数据结构的内存使用
– 调整list-max-ziplist-size和list-compress-depth:优化List数据结构的内存使用
– 调整set-max-intset-entries:优化Set数据结构的内存使用
– 调整zset-max-ziplist-entries和zset-max-ziplist-value:优化ZSet数据结构的内存使用

## 6. 监控与告警
– 建立内存监控机制,及时发现内存问题
– 设置内存使用阈值告警,避免内存溢出
– 定期分析内存使用情况,优化内存管理策略

## 7. 集群部署
– 使用Redis Cluster,分散内存压力
– 合理分配数据,避免数据倾斜
– 监控集群节点的内存使用情况

通过本文档的学习,您应该掌握了Redis内存管理与优化实战,能够在生产环境中实施有效的内存管理方案,提高Redis的性能和稳定性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的内存管理策略和配置参数,确保系统的高效运行。

风哥提示:Redis内存管理是确保系统性能和稳定性的重要因素,合理的内存管理策略可以提高Redis的性能,避免内存溢出和性能下降。在实际应用中,需要根据具体业务场景和数据特点,选择合适的内存管理策略和配置参数。

from Redis视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息