redis.conf中的maxmemory定义REdis可用最大物理内存,有多种书写方式,以下均为合法:

maxmemory 1048576

maxmemory 1048576B

maxmemory 1000KB

maxmemory 100MB

maxmemory 1GB

maxmemory 1000K

maxmemory 100M

maxmemory 1G

没有带单位尾巴的为字节数,以B结尾的表示相应的大小。但需要注意KB和K、MB和M、GB和G是不同的,如1K表示1000字节,而1KB则为1024字节。如果maxmemory值为0,表示不做限制。

如果是32位系统,当maxmemory值为0时,redis启动时会记录WARN日志:

Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.

并强制将最大内存设置为3GB,同时将内存策略设置为MAXMEMORY_NO_EVICTION(超出maxmemory后,所有写操作失败,读操作成功):

server.maxmemory = 3072LL*(1024*1024); /* 3 GB */

server.maxmemory_policy = MAXMEMORY_NO_EVICTION;

如果设置的maxmemory小于1MB,则redis启动时记录如下日志:

WARNING: You specified a maxmemory value that is less than 1MB (current value is %llu bytes). Are you sure this is what you really want?

相关的源代码如下:

/* Convert a string representing an amount of memory into the number of

* bytes, so for instance memtoll("1Gb") will return 1073741824 that is

* (1024*1024*1024).

*

* On parsing error, if *err is not NULL, it's set to 1, otherwise it's

* set to 0. On error the function return value is 0, regardless of the

* fact 'err' is NULL or not. */

long long memtoll(const char *p, int *err) {

const char *u;

char buf[128];

long mul; /* unit multiplier */

long long val;

unsigned int digits;

if (err) *err = 0;

/* Search the first non digit character. */

u = p;

if (*u == '-') u++;

while(*u && isdigit(*u)) u++;

if (*u == '\0' || !strcasecmp(u,"b")) { // 调用strcasecmp不区分大小比较

mul = 1;

} else if (!strcasecmp(u,"k")) {

mul = 1000; // 不带尾巴B或b的

} else if (!strcasecmp(u,"kb")) {

mul = 1024; // 带尾巴B或b的

} else if (!strcasecmp(u,"m")) {

mul = 1000*1000; // 不带尾巴B或b的

} else if (!strcasecmp(u,"mb")) {

mul = 1024*1024; // 带尾巴B或b的

} else if (!strcasecmp(u,"g")) {

mul = 1000L*1000*1000; // 不带尾巴B或b的

} else if (!strcasecmp(u,"gb")) {

mul = 1024L*1024*1024; // 带尾巴B或b的

} else {

if (err) *err = 1;

return 0;

}

/* Copy the digits into a buffer, we'll use strtoll() to convert

* the digit (without the unit) into a number. */

digits = u-p;

if (digits >= sizeof(buf)) {

if (err) *err = 1;

return 0;

}

memcpy(buf,p,digits);

buf[digits] = '\0';

char *endptr;

errno = 0;

val = strtoll(buf,&endptr,10);

if ((val == 0 && errno == EINVAL) || *endptr != '\0') {

if (err) *err = 1;

return 0;

}

return val*mul;

}

// 有关REdis内存策略的实现,请参见REdis源码文件evict.c。

如果没有禁用config命令,则可用它动态实时修改maxmemory的值,如将maxmemory设置为15GB:

redis-cli -h 192.168.31.8 -p 6379 config set maxmemory 15GB

如果要查看maxmemory的值,有如下两种方法:

redis-cli -h 192.168.31.8 -p 6379 config get maxmemory

redis-cli -h 192.168.31.8 -p 6379 info memory | grep maxmemory

由于REdis一般占大内存,所以通常需要关闭系统的OOM,方法为将“/proc/sys/vm/overcommit_memory”的值设置为1(通常不建议设置为2),也可以使用命令sysctl设置,如:sysctl vm.overcommit_memory=1,但注意一定要同时修改文件/etc/sysctl.conf,以便得系统重启后仍然生效:

# vi /etc/sysctl.conf

vm.overcommit_memory=1

修改sysctl.conf后,需要执行“sysctl -p”以使生效。

REdis之maxmemory解读的更多相关文章

  1. redis的maxmemory设置以及淘汰策略介绍

    转载地址:http://www.2cto.com/database/201507/420889.html redis的maxmemory参数用于控制redis可使用的最大内存容量.如果超过maxmem ...

  2. redis的maxmemory与maxmemory-policy关系

    如果redis配置了maxmemory和maxmemory-policy策略,则当redis内存数据达到maxmemory时,会根据maxmemory-policy配置来淘汰内存数据,以避免OOM.r ...

  3. Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?

    一.Redis 的默认配置 了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值. 例如:数据库数量,最大可用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等.我相信,关于 ...

  4. Redis protected-mode属性解读

    redis3.2版本后新增protected-mode配置,默认是yes,即开启.设置外部网络连接redis服务,设置方式如下: 1.关闭protected-mode模式,此时外部网络可以直接访问 2 ...

  5. (十)redis源码解读

    一.redis工作机制 redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行. 二.为什么redis速度快? 1.基于内存 2.redis协议resp 简单.可读.效率高 ...

  6. redis源码解读--内存分配zmalloc

    目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...

  7. redis 哨兵配置文件解读sentinel.conf

    # Example sentinel.conf # port <sentinel-port>port 8001 # 守护进程模式daemonize yes # 指明日志文件名logfile ...

  8. Redis: OOM command not allowed when used memory > ‘maxmemory’

    现象 日志里出现异常: OOM command not allowed when used memory > 'maxmemory' 原因 内存已满,不允许再存数据了,可以通过redis-cli ...

  9. redis之哨兵部署运行日志解读

    转载自http://www.run-debug.com/?p=674 192.168.110.21 主 192.168.110.31 从 #两台服务器都安装redis #下载最新稳定版本:http:/ ...

随机推荐

  1. Compact Middle Packages

    idea工具进行Java开发,在项目视图,默认是将package层级以简洁显示的,如下图: 但有时,我们希望不要使用这种模式,比如:某个父包下,有一个子包,想在父包下,增加一个包,可是来时增加在子包下 ...

  2. Kafka 系列(一)—— Kafka 简介

    一.简介 ApacheKafka 是一个分布式的流处理平台.它具有以下特点: 支持消息的发布和订阅,类似于 RabbtMQ.ActiveMQ 等消息队列: 支持数据实时处理: 能保证消息的可靠性投递: ...

  3. 《JAVA高并发编程详解》-volatile和synchronized

  4. window 包管理器--Chocolatey

    Chocolatey 介绍 在 Linux 下,大家喜欢用 apt-get 来安装应用程序,如今在 windows 下,大家可以使用 Chocolatey 来快速下载搭建一个开发环境. Chocola ...

  5. aria2 adduri

    demo, ok import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handl ...

  6. Spring AOP无法拦截Controller的原因

    因为Spring的Bean扫描和Spring-MVC的Bean扫描是分开的, 两者的Bean位于两个不同的Application, 而且Spring-MVC的Bean扫描要早于Spring的Bean扫 ...

  7. Java 之 Response 对象

    Response 对象 一.Response 原理和继承结构 原理和继承结构参考 request. 二.Response 对象 Response 就是用来设置响应消息. 1.设置响应行   响应头格式 ...

  8. CentOS 7 - 以root身份登入Gnome

    新版的7.0很多资料没有,为了安全,linux是禁止root登录到桌面,但为了方便又想用root登录到桌面,在网上找了找,基本上都是这这一篇: http://shaoguangleo.blog.163 ...

  9. 因改漏洞而引申了解的Cookie机制!

    近期因为修改漏洞:Appscan扫描漏洞:加密会话(SSL)Cookie中缺少Secure属性,而涉及到Cookie有关的知识,现结合该漏洞的修复过程和了解的cookie知识总结一下. 一.加密会话( ...

  10. 多代理切换 MultiProxy

    配置代理选项 添加代理列表 ie配置代理 开始使用