本文档风哥主要介绍Redis内存管理与淘汰策略的实战方法,包括内存管理概念、内存使用分析、淘汰策略原理、内存规划、淘汰策略选择、内存优化建议、内存配置、淘汰策略配置、内存监控以及常见问题解决等内容,风哥教程参考Redis官方文档Memory Management等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 内存管理概念
Redis内存管理是指Redis如何分配、使用和回收内存的过程。Redis作为内存数据库,内存管理对其性能和稳定性至关重要。内存管理包括:
- 内存分配:Redis使用内存分配器(如jemalloc)分配内存
- 内存使用:存储数据和内部数据结构
- 内存回收:通过淘汰策略回收内存
- 内存监控:监控内存使用情况
1.2 内存使用分析
Redis内存使用主要包括:
- 数据内存:存储键值对的内存
- 进程内存:Redis进程本身使用的内存
- 缓冲区内存:客户端缓冲区、复制缓冲区等
- 内存碎片:内存分配产生的碎片
1.3 淘汰策略原理
Redis淘汰策略是指当内存达到限制时,Redis如何选择要淘汰的键。Redis支持多种淘汰策略:
- volatile-lru:从设置了过期时间的键中,选择最近最少使用的键淘汰
- allkeys-lru:从所有键中,选择最近最少使用的键淘汰
- volatile-random:从设置了过期时间的键中,随机选择键淘汰
- allkeys-random:从所有键中,随机选择键淘汰
- volatile-ttl:从设置了过期时间的键中,选择剩余TTL最小的键淘汰
- noeviction:不淘汰键,内存不足时返回错误
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 内存规划
生产环境内存规划:
- 内存总量:根据业务数据量和并发需求确定
- 预留内存:预留30%内存给系统和其他进程
- 内存限制:设置合理的maxmemory值
- 内存碎片:监控内存碎片率,保持在1.5以下
2.2 淘汰策略选择
- 缓存场景:使用allkeys-lru或volatile-lru
- 数据持久化场景:使用noeviction
- 时间敏感数据:使用volatile-ttl
- 随机淘汰:使用allkeys-random或volatile-random
2.3 内存优化建议
## 1. 数据结构优化
– 使用合适的数据结构
– 避免使用大Key
– 合理使用压缩列表
## 2. 配置优化
– 设置合理的maxmemory
– 选择合适的淘汰策略
– 优化内存分配器
## 3. 操作优化
– 使用Pipeline减少网络往返
– 批量操作减少内存峰值
– 避免频繁的大键操作
## 4. 监控优化
– 定期监控内存使用情况
– 监控内存碎片率
– 监控淘汰事件
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 内存配置
# 编辑配置文件
$ vi /redis/app/redis.conf
# 最大内存限制
maxmemory 16gb
# 内存淘汰策略
maxmemory-policy allkeys-lru
# 内存淘汰采样数
maxmemory-samples 5
# 保存配置
:wq
# 重启Redis
$ systemctl restart redis
# 查看内存配置
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config get maxmemory
# 输出示例
1) “maxmemory”
2) “17179869184”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config get maxmemory-policy
# 输出示例
1) “maxmemory-policy”
2) “allkeys-lru”
3.2 淘汰策略配置
# 查看当前淘汰策略
$ /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 volatile-lru
# 验证修改
$ /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 rewrite
3.3 内存监控
# 查看内存使用情况
$ /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:125829120
used_memory_rss_human:120.00M
used_memory_peak:104857600
used_memory_peak_human:100.00M
used_memory_lua:31744
used_memory_lua_human:31.00K
mem_fragmentation_ratio:1.20
mem_allocator:jemalloc-5.2.1
# 查看淘汰统计
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info stats
# 输出示例
# Stats
total_connections_received:1000
total_commands_processed:10000
instantaneous_ops_per_sec:100
rejected_connections:0
expired_keys:100
evicted_keys:50
keyspace_hits:8000
keyspace_misses:2000
# 监控内存使用趋势
$ vi /redis/app/monitor_memory.sh
#!/bin/bash
# monitor_memory.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
while true; do
timestamp=$(date +”%Y-%m-%d %H:%M:%S”)
memory_info=$(/redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory)
echo “$timestamp”
echo “$memory_info”
echo “—————-”
sleep 60
done
# 赋予执行权限
$ chmod +x /redis/app/monitor_memory.sh
# 执行监控
$ /redis/app/monitor_memory.sh > /redis/log/memory_monitor.log &
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 内存分析实战
## 1. 使用redis-cli分析内存
$ /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:1000’ with 1024 bytes
[00.00%] Biggest list found so far ‘logs’ with 1000 items
[00.00%] Biggest hash found so far ‘config’ with 50 fields
[00.00%] Biggest set found so far ‘users’ with 1000 members
[00.00%] Biggest zset found so far ‘scores’ with 1000 members
——– summary ——-
Sampled 1000 keys in the keyspace!
Total key length in bytes is 10000 (avg len 10.00)
Biggest string found ‘user:1000’ has 1024 bytes
Biggest list found ‘logs’ has 1000 items
Biggest hash found ‘config’ has 50 fields
Biggest set found ‘users’ has 1000 members
Biggest zset found ‘scores’ has 1000 members
400 strings with 400000 bytes (40.00% of keys, avg size 1000.00)
300 lists with 300000 items (30.00% of keys, avg size 1000.00)
100 hashes with 5000 fields (10.00% of keys, avg size 50.00)
100 sets with 100000 members (10.00% of keys, avg size 1000.00)
100 zsets with 100000 members (10.00% of keys, avg size 1000.00)
## 2. 使用Redis内存分析工具
# 安装redis-rdb-tools
$ pip install rdbtools
# 生成内存报告
$ rdb -c memory /redis/fgdata/dump.rdb > memory_report.csv
# 查看报告
$ head -20 memory_report.csv
## 3. 分析内存碎片
$ /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.20
4.2 淘汰策略实战
## 1. 测试淘汰策略
# 设置内存限制
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory 1mb
# 设置淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru
# 填充数据
$ for i in {1..1000}; do
/redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set key:$i value:$(openssl rand -base64 1000)
done
# 查看淘汰情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info stats | grep evicted_keys
# 输出示例
evicted_keys:500
## 2. 测试volatile-ttl策略
# 设置内存限制
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory 1mb
# 设置淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy volatile-ttl
# 填充带过期时间的数据
$ for i in {1..100}; do
/redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 setex key:$i $((i * 10)) value:$(openssl rand -base64 1000)
done
# 查看淘汰情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info stats | grep evicted_keys
# 输出示例
evicted_keys:50
4.3 内存优化案例
## 1. 大Key优化
# 问题:存在大Key导致内存使用过高
# 解决:拆分大Key
# 查看大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys
# 拆分大Hash
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hgetall big_hash
# 拆分为多个小Hash
$ for i in {1..10}; do
/redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset big_hash:$i field:$i value:$i
done
# 删除原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 del big_hash
## 2. 内存碎片优化
# 问题:内存碎片率过高
# 解决:重启Redis或使用内存重分配
# 查看内存碎片率
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory | grep mem_fragmentation_ratio
# 输出示例
mem_fragmentation_ratio:2.00
# 重启Redis
$ systemctl restart redis
# 查看内存碎片率
$ /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.10
## 3. 内存限制优化
# 问题:内存使用接近限制
# 解决:调整内存限制和淘汰策略
# 查看内存使用
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory | grep used_memory
# 调整内存限制
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory 32gb
# 调整淘汰策略
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 config set maxmemory-policy allkeys-lru
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis内存管理与淘汰策略最佳实践:
- 合理设置内存限制:根据服务器内存和业务需求设置,学习交流加群风哥微信: itpux-com
- 选择合适的淘汰策略:根据业务场景选择
- 监控内存使用:定期监控内存使用情况和碎片率
- 优化数据结构:避免使用大Key,合理使用数据结构
- 定期清理过期数据:减少内存占用
- 使用内存分析工具:定期分析内存使用情况
5.2 常见问题
- 内存使用过高:检查大Key,调整内存限制,优化数据结构
- 内存碎片率高:重启Redis,优化内存分配
- 淘汰策略不生效:检查maxmemory设置,确保内存达到限制
- 内存泄漏:检查应用程序是否存在内存泄漏
- OOM错误:调整内存限制,优化淘汰策略
5.3 优化技巧
## 1. 内存配置
– [ ] maxmemory设置合理
– [ ] maxmemory-policy选择合适
– [ ] 内存碎片率控制在1.5以下
## 2. 数据结构
– [ ] 避免使用大Key
– [ ] 合理使用数据结构
– [ ] 定期清理过期数据
## 3. 监控
– [ ] 定期监控内存使用情况
– [ ] 监控内存碎片率
– [ ] 监控淘汰事件
– [ ] 监控内存增长趋势
## 4. 优化
– [ ] 定期分析内存使用
– [ ] 优化数据存储方式
– [ ] 调整内存限制
– [ ] 选择合适的淘汰策略
通过本文档的学习,您应该掌握了Redis内存管理与淘汰策略的方法,能够在生产环境中合理配置内存参数和淘汰策略,优化Redis的内存使用。在实际应用中,需要根据业务需求和硬件环境,灵活调整内存配置和淘汰策略。
风哥提示:内存管理是Redis性能优化的关键,合理的内存配置和淘汰策略可以显著提高Redis的性能和稳定性。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
