Redis 作为高性能的内存数据库,其数据全部存储在内存中,这意味着如果不加以限制,Redis 可能会耗尽服务器全部内存资源,导致系统崩溃或其他服务异常。因此,在生产环境中配置 Redis 内存限制是一项必不可少的运维工作。
本文将详细介绍在 CentOS 系统中如何限制 Redis 的内存使用,包括配置方法、淘汰策略的选择建议以及实际操作中的注意事项。
>一、查看当前 Redis 内存使用情况
在修改配置之前,建议先了解 Redis 当前的内存使用状态。连接 Redis 后执行以下命令:
>redis-cli info memory
重点关注以下几个指标:
>
- used_memory:Redis 已使用的内存总量(字节)
- used_memory_rss:操作系统分配给 Redis 的内存总量
- maxmemory:当前配置的最大内存限制(0 表示未设置限制)
如果 maxmemory 显示为 0,说明当前没有设置内存上限,需要尽快配置。
>二、修改 redis.conf 配置文件
Redis 的内存限制通过配置文件 redis.conf 来设置。在 CentOS 系统中,该文件通常位于以下路径之一:
/etc/redis/redis.conf
/etc/redis.conf
>1. 设置最大内存限制
使用文本编辑器打开配置文件:
>sudo vi /etc/redis/redis.conf
找到 maxmemory 配置项(如果没有则新增),设置为合适的值:
>maxmemory 2gb
常用的单位包括:
| 单位 | 说明 | 示例 |
|------|------|------|
| bytes | 字节(默认) | maxmemory 1073741824 |
| kb | 千字节 | maxmemory 1048576kb |
| mb | 兆字节 | maxmemory 1024mb |
| gb | 吉字节 | maxmemory 2gb |
>2. 如何确定合适的内存大小
内存限制的设置需要综合考虑以下因素:
服务器总内存:建议 Redis 占用不超过系统总内存的 60%-70%,为操作系统和其他服务预留空间
数据量预估:根据业务数据量和增长趋势进行评估
数据类型:不同数据结构占用的内存差异较大,Hash 和 Set 类型通常比 String 更节省空间
是否开启持久化:开启 RDB 或 AOF 持久化时,fork 子进程会额外消耗内存
例如,一台 8GB 内存的服务器,Redis 建议设置 maxmemory 4gb 到 5gb。
>三、配置内存淘汰策略
仅设置 maxmemory 还不够,当 Redis 达到内存上限时,必须指定一个淘汰策略来决定如何处理新的写入请求。
在 redis.conf 中配置:
>maxmemory-policy volatile-lru
四、Redis 提供的 8 种淘汰策略
Redis 提供了 8 种内存淘汰策略,每种策略适用于不同的业务场景:
>过期键相关策略
volatile-lru:从设置了过期时间的键中,优先淘汰最近最少使用(LRU)的键。这是最常用的策略,适合缓存场景。
volatile-lfu:从设置了过期时间的键中,优先淘汰使用频率最低(LFU)的键。适合需要保留热点数据的场景。
volatile-random:从设置了过期时间的键中随机淘汰一个。
volatile-ttl:从设置了过期时间的键中,优先淘汰 TTL(剩余生存时间)最短的键。
>全部键相关策略
allkeys-lru:从所有键中优先淘汰最近最少使用的键。当缓存数据和持久化数据共存时不适合使用。
allkeys-lfu:从所有键中优先淘汰使用频率最低的键。
allkeys-random:从所有键中随机淘汰。
>不淘汰策略
noeviction:不淘汰任何数据,当内存达到上限时,所有写操作将返回错误。默认策略。
>五、策略选择建议
根据不同的使用场景,推荐以下策略:
>缓存场景
Redis 仅作缓存使用,数据丢失不会造成严重影响,推荐使用 allkeys-lru 或 allkeys-lfu,保证缓存空间得到有效利用。
>混合场景
Redis 同时存储缓存数据和持久化数据,推荐使用 volatile-lru,只淘汰有 TTL 的缓存数据,不影响需要持久化的业务数据。
>数据安全优先
数据完整性比服务可用性更重要时,使用 noeviction,写入失败比数据丢失更容易被发现和处理。
>六、动态修改配置(无需重启)
除了修改配置文件外,还可以通过 redis-cli 动态修改,立即生效而无需重启服务:
>redis-cli config set maxmemory 2gb
redis-cli config set maxmemory-policy volatile-lru
注意:动态修改的配置在 Redis 重启后会丢失。如果需要永久生效,还需要同步修改 redis.conf 文件,或者执行以下命令将当前配置写入文件:
>redis-cli config rewrite
七、使配置生效
修改完配置文件后,重启 Redis 服务使配置生效:
>sudo systemctl restart redis
验证配置是否生效:
>redis-cli config get maxmemory
redis-cli config get maxmemory-policy
八、监控与告警
配置好内存限制后,建议做好监控工作:
1. 定期检查内存使用率:通过 redis-cli info memory 获取数据
2. 设置告警阈值:当内存使用率达到上限的 80% 时触发告警
3. 关注淘汰统计:使用 info stats 查看已淘汰的键数量
>redis-cli info stats | grep evicted_keys
如果 evicted_keys 持续增长,说明内存不足导致频繁淘汰,需要考虑扩容或优化数据结构。
>总结
在 CentOS 上限制 Redis 内存使用的核心步骤为:修改 redis.conf 中的 maxmemory 设置内存上限,配合 maxmemory-policy 选择合适的淘汰策略,然后重启服务使配置生效。合理的内存配置不仅能防止 Redis 占用过多系统资源,还能在内存不足时优雅地处理新请求,保障系统整体稳定性。