在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等本文是 Redis 内存用完之后会怎么?
典型回答
Redis 的内存用完指的是 Redis 的运行内存超过了 Redis 设置的最大内存,此值可以通过 Redis 的配置文件 redis.conf 进行设置,设置项为 maxmemory,我们可以使用 config get maxmemory
来查看设置的最大运行内存,如下所示:
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"
当此值为 0 时,表示没有内存大小限制,直到耗尽机器中所有的内存为止,这是 Redis 服务器端在 64 位操作系统的默认值。
当 Redis 的内存用完之后就会触发 Redis 的内存淘汰策略,执行流程如下图所示:
最大内存的检测源码位于 server.c 中,核心代码如下:
int processCommand(client *c) {
// 最大内存检测
if (server.maxmemory && !server.lua_timedout) {
int out_of_memory = freeMemoryIfNeededAndSafe() == C_ERR;
if (server.current_client == NULL) return C_ERR;
if (out_of_memory &&
(c->cmd->flags & CMD_DENYOOM ||
(c->flags & CLIENT_MULTI && c->cmd->proc != execCommand))) {
flagTransaction(c);
addReply(c, shared.oomerr);
return C_OK;
}
}
// 忽略其他代码
}
Redis 内存淘汰策略可以使用 config get maxmemory-policy
命令来查看,如下所示:
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
从上述结果可以看出此 Redis 服务器采用的是 noeviction
策略,此策略表示当运行内存超过最大设置内存时,不淘汰任何数据,但新增操作会报错。此策略为 Redis 默认的内存淘汰策略,此值可通过修改 redis.conf 文件进行修改。
Redis 的内存最大值和内存淘汰策略都可以通过配置文件进行修改,或者是使用命令行工具进行修改。使用命令行工具进行修改的优点是操作简单,成功执行完命令之后设置的策略就会生效,我们可以使用 confg set xxx
的方式进行设置,但它的缺点是不能进行持久化,也就是当 Redis 服务器重启之后设置的策略就会丢失。另一种方式就是为配置文件修改的方式,此方式虽然较为麻烦,修改完之后要重启 Redis 服务器才能生效,但优点是可持久化,重启 Redis 服务器设置不会丢失。