Redis 内存用完会怎样?

在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等本文是 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 的内存淘汰策略,执行流程如下图所示:

webp

最大内存的检测源码位于 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 服务器设置不会丢失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值