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. Golang ---json解析

    golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了.不过这个解析包有个很大的问题–性能.它不够快,如果我们开发高性能.高并发的网络服务就无法满 ...

  2. 在windows服务中使用定时器

    在windows服务中,利用winform中直接拖动timer控件的方式使用定时器是不可以的,启动服务后会发现定时器并没有执行.那么在windows服务中如何使用定时器呢?  不使用直接拖动控件的方式 ...

  3. 易百教程人工智能python修正-人工智能无监督学习(聚类)

    无监督机器学习算法没有任何监督者提供任何指导. 这就是为什么它们与真正的人工智能紧密结合的原因. 在无人监督的学习中,没有正确的答案,也没有监督者指导. 算法需要发现用于学习的有趣数据模式. 什么是聚 ...

  4. Java自学-类和对象 引用

    什么是Java中的引用? 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 步骤 1 : 引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建 ...

  5. 【MySQL】数据库中间件Atlas

    1.介绍 Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改 ...

  6. element-ui select多选情况下获取label和value

    直接上代码 <el-select v-model="value" multiple collapse-tags ref="select" @change= ...

  7. 《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计

    笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决.彩票行业就是个例子. 在讲解代码之前,首先讲解一下业务设计,如图6.15所示. 图6.15 ...

  8. 【RMAN】RMAN脚本中使用替换变量

    [RMAN]RMAN脚本中使用替换变量--windows 下rman全备脚本 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  9. python中分页使用

    分页代码pagination.py如文件: from django.utils.safestring import mark_safe from django.http.request import ...

  10. Tensorflow简单实践系列(一):安装和运行

    TensorFlow 是谷歌开发的机器学习框架. 安装 TensorFlow 直接使用 pip 安装即可,添加豆瓣镜像可以加快速度: pip install tensorflow -i https:/ ...