Redis内存管理在Ubuntu上的实现指南
Redis作为内存数据库,限制最大内存是内存管理的核心。通过maxmemory参数设置Redis可使用的内存上限,避免因内存耗尽导致系统崩溃。建议根据服务器内存总量设置(如16GB内存服务器可配置为12GB,预留20%-30%给系统和其他进程),配置路径为/etc/redis/redis.conf。
内存淘汰策略决定了内存满时Redis的处理方式,常见策略包括:
allkeys-lru:淘汰所有键中最近最少使用的(适用于纯缓存场景);volatile-lru:仅淘汰设置了过期时间的键中最近最少使用的(适用于缓存场景,如会话存储);noeviction:不淘汰数据,拒绝写入(适用于数据不能丢失的场景,如数据库)。noeviction,生产环境建议根据业务选择allkeys-lru或volatile-lru。Redis提供**RDB(快照)和AOF(追加文件)**两种持久化方式,需根据数据重要性选择:
save参数设置快照保存规则(如save 900 1表示900秒内至少1个键变化则保存),dbfilename设置快照文件名(默认dump.rdb),dir设置保存路径(默认/var/lib/redis)。RDB适合灾难恢复,但可能丢失最后一次快照后的数据。appendonly yes启用AOF,appendfsync everysec设置同步策略(每秒同步一次,平衡性能与安全),auto-aof-rewrite-percentage 100设置AOF文件增长100%时重写(减少文件大小)。AOF适合数据完整性要求高的场景。hash-max-ziplist-entries 512,设置Hash使用Ziplist编码的阈值)、HyperLogLog(统计场景,替代Set)、Stream(大文本存储,替代List)。activerehashing yes自动优化小Key内存分配;对长文本使用客户端压缩(如GZIP),存入Redis前压缩、读取后解压。EXPIRE key 3600,设置Key有效期为1小时),避免内存堆积;配置active-expire-effort 100提高过期键清理频率。INFO memory查看内存使用情况(包括used_memory当前已用内存、maxmemory配置的最大内存、mem_fragmentation_ratio内存碎片率,若碎片率>1.5需重启整理);使用MEMORY USAGE key分析单个Key的内存占用;使用MEMORY PURGE(Redis 4.0+)手动释放内存碎片。redis-stat(简单性能监控,gem install redis-stat运行)、Prometheus + Grafana(可视化监控,配置Prometheus抓取Redis指标,Grafana导入Redis面板)。slowlog-log-slower-than 1000(阈值1毫秒)和slowlog-max-len 128(日志长度128条)配置慢查询日志,使用SLOWLOG GET查看慢查询,优化复杂命令(如SORT、ZUNIONSTORE)。echo never > /sys/kernel/mm/transparent_hugepage/enabled禁用THP。/etc/sysctl.conf,设置net.core.somaxconn = 1024(增大TCP连接队列,避免高并发时“connection refused”)、vm.overcommit_memory = 1(允许内存超额分配,避免fork失败)。jemalloc(内存碎片率低),无需修改,可通过redis-cli info server | grep allocator查看当前分配器。