本文基于
redis_version:6.2.5
用法
控制节点能使用的最大内存
maxmemory <bytes>
注意事项:
maxmemory
的默认值是0
,也就是不限制内存的使用。- 32bit系统如果使用默认配置或配置为
maxmemory 0
则最大使用3G
内存(详见下方源码)。 maxmemory
的值没有最小限制(但是如果低于1MB,会打一条WARNING日志)。- 如果设置了
maxmemory
选项(值 >=1
),redis在接收命令时总是会判断当前是否已经超出最大内存限制,如果超过限制会根据驱逐策略去释放内存(如果是同步释放且释放内存很大,则会阻塞其他命令的执行)。 - 单位问题:
maxmemory 100
裸数字情况:单位是字节。maxmemory 1K
K:代表1000字节。maxmemory 1KB
KB:代表1024字节。maxmemory 1M
M:代表1000000字节。maxmemory 1MB
MB: 代表1048576字节。maxmemory 1G
G:代表1000000000字节。maxmemory 1GB
GB: 代表1073741824字节。
实操
[1] 假设当前实例已使用2MB内存,且不限制最大内存, 且驱逐策略为noeviction
,此时手动设置最大可使用内存为1MB,会发生什么?答:可以设置成功,且任何key都不被驱逐。
此时查看日志
翻译:新设置的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,能否成功?答:新的写入将被拒绝并报错。看下面的实操。
[2] 假设当前实例已使用970MB左右内存,且不限制最大内存, 且驱逐策略为allkeys-lru
,且同步驱逐。此时手动设置最大可使用内存为100MB,会发生什么?答:可以设置成功,但命令会被阻塞一定时间(时间长短取决于要释放多少内存等因素)(config set maxmemory 100MB也是一条命令)。
源码实现
[1] 32bit系统最大可使用内存是4G
,如果用户不限制最大可使用内存,redis默认使用3G
且驱逐策略设置为noeviction
(noeviction:到达内存使用阀值时,不淘汰key,但遇到申请内存的命令会报错)。
[2] 如果maxmemory 在(0,1MB)之间会打一条日志,但是依然能设置成功。
[3] 普通主从模式,每次接收命令都会判断是否超过最大使用内存。
原生注释
本文属于原创,首发于微信公众号【小易哥学呀学】,如需转载请后台留言。