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. 【题解】Luogu P5324 [BJOI2019]删数

    原题传送门 易知这个数列的顺序是不用考虑的 我们看两个数列 \(1,2,3\)和\(3,3,3\)都能删完,再看两个数列\(1,2,3,4\)和\(2,2,4,4\),也都能删完 不难发现,我们珂以把 ...

  2. golang --写test测试用例

    安装gotests插件自动生成测试代码: go get -u -v github.com/cweill/gotests/... 如何编写测试用例 由于go test命令只能在一个相应的目录下执行所有文 ...

  3. Spring-Cloud之Eureka注册与发现-2

    一.Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其 ...

  4. 十二.作业难点(有IT大牛路过的可以帮我解答我的疑问?万分感谢)--转行的苦逼人

    今天开始改变写博客风格,其他不多说. 今天题目如下: # 7.写函数,完成以下功能: (8分) # 例如有: # user_list=[ # {"name": "alex ...

  5. MySQL数据库之互联网常用分库分表方案

    一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...

  6. Celery:Daemonization

    参考文档:http://docs.celeryproject.org/en/latest/userguide/daemonizing.html#daemonizing

  7. C++的struct可以使用template

    C++里面的struct是可以使用template的,然而http://c.biancheng.net/view/2235.html这里竟然说不能用.辣鸡啊. #include <stdio.h ...

  8. linux下的 c 和 c++ 开发工具及linux内核开发工具

    https://opensource.com/article/18/6/embedded-linux-build-tools https://github.com/luong-komorebi/Awe ...

  9. CVE-2019-10392:Jenkins Git client插件RCE复现

    0x00 简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 0x01 漏洞概述 Git客 ...

  10. Centos7-安装py3

    安装依赖 yum install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel li ...