Redis 限制内存大小参数 maxmemory

Redis通过maxmemory参数限制内存使用,当内存超出限制时,采用不同的淘汰策略,如noeviction、volatile-lru等。文章详细介绍了LRU算法及其在Redis中的近似实现,包括随机采样和淘汰池机制,以实现高效的空间管理。

前言

当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换(swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。

maxmemory 参数

在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。
当实际内存超出 maxmemory 时,Redis 提供了几种可选策略(maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服。

  • noeviction 不会继续服务写请求(DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。
  • volatile-lru 尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。
  • volatile-ttl 跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命ttl 的值,ttl 越小越优先被淘汰。
  • volatile-random 跟上面一样,不过淘汰的 key 是过期 key 集合中随机的key。
  • allkeys-lru 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。
  • allkeys-random 跟上面一样,不过淘汰的策略是随机的key。
  • volatile-xxx 策略只会针对带过期时间的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。如果你只是拿 Redis 做缓存,那应该使用 allkeys-xxx,客户端写缓存时不必携带过期时间。如果你还想同时使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,这样可以保留没有设置过期时间的 key,它们是永久的 key 不会被 LRU 算法淘汰。

LRU 算法

实现 LRU 算法除了需要 key/value 字典外,还需要附加一个链表,链表中的元素按照一定的顺序进行排列。当空间满的时候,会踢掉链表尾部的元素。当字典的某个元素被访问时,它在链表中的位置会被移动到表头。所以链表的元素排列顺序就是元素最近被访问的时间顺序。
位于链表尾部的元素就是不被重用的元素,所以会被踢掉。位于表头的元素就是最近刚刚被人用过的元素,所以暂时不会被踢。

Redis 中的近似 LRU 算法

Redis 使用的是一种近似 LRU 算法,它跟 LRU 算法还不太一样。之所以不使用 LRU 算法,是因为需要消耗大量的额外的内存,需要对现有的数据结构进行较大的改造。近似 LRU 算法则很简单,在现有数据结构的基础上使用随机采样法来淘汰元素,能达到和 LRU 算法非常近似的效果。Redis 为实现近似 LRU 算法,它给每个 key 增加了一个额外的小字段,这个字段的长度是 24 个bit,也就是最后一次被访问的时间戳。
上一节提到处理 key 过期方式分为集中处理和懒惰处理, LRU 淘汰不一样,它的处理方式只有懒惰处理。当 Redis 执行写操作时,发现内存超出 maxmemory,就会执行一次 LRU 淘汰算法。这个算法也很简单,就是随机采样出 5 (可以配置) 个key,然后淘汰掉最旧的 key,如果淘汰后内存还是超出 maxmemory,那就继续随机采样淘汰,直到内存低于 maxmemory 为止。
如何采样就是看 maxmemory-policy 的配置,如果是 allkeys 就是从所有的 key 字典中随机,如果是 volatile 就从带过期时间的 key 字典中随机。每次采样多少个 key 看的是 maxmemory_samples 的配置,默认为5。
Redis3.0 在算法中增加了淘汰池,进一步提升了近似 LRU 算法的效果。
淘汰池是一个数组,它的大小是 maxmemory_samples,在每一次淘汰循环中,新随机出来的 key 列表会和淘汰池中的 key 列表进行融合,淘汰掉最旧的一个 key 之后,保留剩余较旧的 key 列表放入淘汰池中留待下一个循环。

<think>好的,用户现在问的是怎么修改Redismaxmemory限制。首先,我需要回顾之前的对话历史。用户之前遇到了Redis启动失败的问题,我给了他们一系列的排查步骤,其中第四点提到了内存不足的情况,建议修改maxmemory配置。现在用户可能遇到了同样的问题,想详细了解如何修改这个参数。 首先,我需要确定用户对Redis配置文件的位置是否了解。默认情况下,redis.conf可能位于/etc/redis/目录下,但不同的安装方式或操作系统可能会有所不同。用户可能需要知道如何找到这个文件,所以应该提到常见的路径,比如/etc/redis/redis.conf,或者使用find命令来查找。 接下来,用户需要知道如何编辑这个文件。考虑到用户可能有不同的技术水平,应该给出基本的命令,比如使用nano或vim编辑器。例如,sudo nano /etc/redis/redis.conf。同时,提醒用户需要管理员权限,所以使用sudo。 然后,具体到maxmemory的设置。需要解释这个参数的作用,即限制Redis使用的最大内存。需要说明如何找到这个配置项,可能在文件的某个部分,默认可能是被注释掉的。用户需要取消注释或者添加新的行,设置合适的值,比如maxmemory 2gb或者具体的字节数。这里需要给出示例,并解释不同单位的写法,比如gb、mb、kb等。 设置完参数后,保存并退出编辑器,然后重启Redis服务以使配置生效。这部分需要给出具体的重启命令,比如sudo systemctl restart redis或者redis-server的路径,视用户的环境而定。同时,提醒用户检查服务状态,确认是否成功启动,比如使用systemctl status redis或者查看日志。 另外,用户可能不清楚设置多大的内存合适。需要建议他们根据系统可用内存来调整,比如保留一定内存给系统和其他应用,避免OOM。例如,如果系统有4GB内存,可以设置为3GB左右,并提到百分比的方式,比如maxmemory 75%可能在某些版本中可用。 还需要考虑用户可能遇到的其他问题,比如没有找到配置文件,或者修改后Redis无法启动。这时候应该建议用户检查配置文件语法是否正确,或者查看日志文件中的错误信息。例如,使用redis-server /path/to/redis.conf --test-mode来测试配置是否正确。 另外,用户可能在修改配置后忘记重启服务,导致配置未生效。这时候需要强调重启的必要性,并给出验证的方法,比如使用redis-cli info memory查看maxmemory的值是否更新。 可能用户的问题不仅仅是修改配置,还可能涉及到内存策略的选择,比如maxmemory-policy。如果用户没有提到,可能需要简要说明这个参数的作用,但避免信息过载。不过根据当前问题,可能不需要深入展开,除非用户进一步询问。 还要考虑不同操作系统下的差异,比如Ubuntu和CentOS的服务管理命令可能不同,但使用systemctl是比较通用的。如果用户使用的是旧版本的init.d脚本,可能需要给出相应的重启命令,比如sudo service redis restart。 总结来说,回答需要分步骤清晰,从找到配置文件、编辑参数、保存、重启服务到验证,每一步都给出具体的命令和注意事项。同时,提供一些常见问题的解决方法,比如配置错误导致无法启动,或者如何确定合适的内存大小。确保用户按照步骤操作后能够成功修改maxmemory限制,并理解相关的最佳实践。</think>以下是修改Redis的`maxmemory`内存限制的分步指南: --- ### 一、定位配置文件 1. **默认路径** Redis配置文件通常位于: ```bash /etc/redis/redis.conf # Linux通用路径 /usr/local/etc/redis.conf # 源码编译安装路径 ``` 若不确定路径,可通过命令搜索: ```bash sudo find / -name "redis.conf" ``` --- ### 二、修改`maxmemory`参数 1. **编辑配置文件** 使用文本编辑器(如`nano`或`vim`)打开配置文件: ```bash sudo nano /etc/redis/redis.conf ``` 2. **找到`maxmemory`设置项** 在文件中搜索以下关键字(通常位于`### MEMORY MANAGEMENT ###`段落附近): ```bash # maxmemory <bytes> ``` 默认情况下该参数被注释(以`#`开头)。 3. **设置内存上限** 取消注释并指定内存限制,例如: ```bash maxmemory 2gb # 按单位设置(支持gb/mb/kb) # 或直接指定字节数 maxmemory 2147483648 # 2GB = 2*1024^3 bytes ``` **推荐值**: - 设置为物理内存的70%-80%(需保留内存给系统和其他进程) - 例如:系统总内存4GB → 建议`maxmemory 3gb` --- ### 三、关联配置:内存淘汰策略 若设置了`maxmemory`,**必须同步配置淘汰策略**(否则Redis可能拒绝写入): ```bash maxmemory-policy allkeys-lru # 常用策略:LRU淘汰最近最少使用的键 ``` 其他策略选项:`volatile-lru`、`allkeys-random`、`noeviction`(禁止淘汰,直接报错)等。 --- ### 四、重启Redis服务 1. **重启生效** ```bash sudo systemctl restart redis # Systemd系统(如Ubuntu/CentOS 7+) # 或 sudo service redis-server restart # SysVinit系统(如CentOS 6) ``` 2. **验证配置** 通过Redis命令行工具检查是否生效: ```bash redis-cli info memory | grep maxmemory ``` 输出应显示设置的值,例如:`maxmemory:2147483648` --- ### 五、常见问题 #### 1. 配置未生效 - **原因**:配置文件路径错误或未重启服务 **解决**:确认修改的是Redis实际加载的配置文件(检查启动日志中的`Config file: /path/redis.conf`)。 #### 2. 内存超限后报错 - **现象**:`OOM command not allowed when used memory > 'maxmemory'` **解决**:调整`maxmemory-policy`为更积极的淘汰策略(如`allkeys-lru`)。 #### 3. 单位混淆 - **错误写法**:`maxmemory 2G`(字母大写无效) **正确写法**:仅支持小写单位,如`2gb`、`512mb`。 --- ### 六、操作流程图 ```plaintext 打开redis.conf → 搜索maxmemory → 取消注释并设置值 → 设置maxmemory-policy ↓ 保存文件并重启Redisredis-cli验证配置生效 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值