likes
comments
collection
share

redis.conf详解之maxmemory

作者站长头像
站长
· 阅读数 13

本文基于 redis_version:6.2.5

用法

控制节点能使用的最大内存

maxmemory <bytes>

 

注意事项:

  • maxmemory 的默认值是0,也就是不限制内存的使用。
  • 32bit系统如果使用默认配置或配置为maxmemory 0则最大使用3G内存(详见下方源码)。
  • maxmemory 的值没有最小限制(但是如果低于1MB,会打一条WARNING日志)。
  • 如果设置了maxmemory选项(值 >= 1),redis在接收命令时总是会判断当前是否已经超出最大内存限制,如果超过限制会根据驱逐策略去释放内存(如果是同步释放且释放内存很大,则会阻塞其他命令的执行)。
  • 单位问题:
    1. maxmemory 100 裸数字情况:单位是字节。
    2. maxmemory 1K   K:代表1000字节。
    3. maxmemory 1KB KB:代表1024字节。
    4. maxmemory 1M   M:代表1000000字节。
    5. maxmemory 1MB MB: 代表1048576字节。
    6. maxmemory 1G   G:代表1000000000字节。
    7. maxmemory 1GB  GB: 代表1073741824字节。

 

实操

[1] 假设当前实例已使用2MB内存,且不限制最大内存, 且驱逐策略为noeviction,此时手动设置最大可使用内存为1MB,会发生什么?答:可以设置成功,且任何key都不被驱逐。

redis.conf详解之maxmemory

此时查看日志

翻译:新设置的1MB最大可使用内存小于当前已经使用的2263072字节。最终会根据驱逐策略接受/不接受新的写入命令。
# WARNING: the new maxmemory value set via CONFIG SET (1048576) is smaller than the current memory usage (2263072). This will result in key eviction and/or the inability to accept new write commands depending on the maxmemory-policy.

当前使用的内存(2MB)已经超出最大内存设置(1MB),并且驱逐策略是不驱逐(noeviction),所以导致之前的key不会被清理(依然是已用2MB)。如果此时我要写入一个key,能否成功?答:新的写入将被拒绝并报错。看下面的实操。

redis.conf详解之maxmemory

[2] 假设当前实例已使用970MB左右内存,且不限制最大内存, 且驱逐策略为allkeys-lru,且同步驱逐。此时手动设置最大可使用内存为100MB,会发生什么?答:可以设置成功,但命令会被阻塞一定时间(时间长短取决于要释放多少内存等因素)(config set maxmemory 100MB也是一条命令)。

redis.conf详解之maxmemory

 

源码实现

[1] 32bit系统最大可使用内存是4G,如果用户不限制最大可使用内存,redis默认使用3G且驱逐策略设置为noeviction(noeviction:到达内存使用阀值时,不淘汰key,但遇到申请内存的命令会报错)。

redis.conf详解之maxmemory

[2] 如果maxmemory 在(0,1MB)之间会打一条日志,但是依然能设置成功。

redis.conf详解之maxmemory

[3] 普通主从模式,每次接收命令都会判断是否超过最大使用内存。

redis.conf详解之maxmemory

 

原生注释

redis.conf详解之maxmemory


本文属于原创,首发于微信公众号【小易哥学呀学】,如需转载请后台留言。

转载自:https://juejin.cn/post/7079781203577929741
评论
请登录