REdis之maxmemory解读
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解读的更多相关文章
- redis的maxmemory设置以及淘汰策略介绍
转载地址:http://www.2cto.com/database/201507/420889.html redis的maxmemory参数用于控制redis可使用的最大内存容量.如果超过maxmem ...
- redis的maxmemory与maxmemory-policy关系
如果redis配置了maxmemory和maxmemory-policy策略,则当redis内存数据达到maxmemory时,会根据maxmemory-policy配置来淘汰内存数据,以避免OOM.r ...
- Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?
一.Redis 的默认配置 了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值. 例如:数据库数量,最大可用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等.我相信,关于 ...
- Redis protected-mode属性解读
redis3.2版本后新增protected-mode配置,默认是yes,即开启.设置外部网络连接redis服务,设置方式如下: 1.关闭protected-mode模式,此时外部网络可以直接访问 2 ...
- (十)redis源码解读
一.redis工作机制 redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行. 二.为什么redis速度快? 1.基于内存 2.redis协议resp 简单.可读.效率高 ...
- redis源码解读--内存分配zmalloc
目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...
- redis 哨兵配置文件解读sentinel.conf
# Example sentinel.conf # port <sentinel-port>port 8001 # 守护进程模式daemonize yes # 指明日志文件名logfile ...
- Redis: OOM command not allowed when used memory > ‘maxmemory’
现象 日志里出现异常: OOM command not allowed when used memory > 'maxmemory' 原因 内存已满,不允许再存数据了,可以通过redis-cli ...
- redis之哨兵部署运行日志解读
转载自http://www.run-debug.com/?p=674 192.168.110.21 主 192.168.110.31 从 #两台服务器都安装redis #下载最新稳定版本:http:/ ...
随机推荐
- 【题解】Luogu P5340 [TJOI2019]大中锋的游乐场
原题传送门 没想到省选也会出这种题??! 实际就是一个带有限制的最短路 因为\(k<=10\),所以我们珂以暴力将每个点的权值分为[-k,k],为了方便我们珂以转化成[0,2k],将汉堡的权值记 ...
- 【2】【典型一维动态规划】【剑指offer+leetcode53】连续子数组的最大和
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数 ...
- Linux RedHat7.0_64位系统中安装Oracle_11g_R2
步骤一: 当然是安装rhel7操作系统啦(废话),建议在安装过程中系统软件类型选择最后一项[Server with GUI].其他的默认一般即可. 步骤二:在初装完成的系统中无法像Windows那样直 ...
- tf.concat的用法
import numpy as npimport tensorflow as tfsess=tf.Session()a=np.zeros((1,2,3,4))b=np.ones((1,2,3,4))c ...
- 自学Python编程的第六天(最后代码有更好的请告诉我)----------来自苦逼的转行人
2019-09-16-23:09:06 自学Python的第六天,也是写博客的第六天 今天学的内容是有关dict字典的用法 看视频加上练习,目前还没遇到有难点,但是感觉很不好的样子 没有难点以后突然出 ...
- aria2 https
https://github.com/aria2/aria2/issues/361 ... and also make sure that aria2 was built with HTTPS sup ...
- Laravel入门及实践,快速上手ThinkSNS+二次开发
温馨提示: l 本文纯干货,文字和代码居多,且适合零基础Laravel学习者: l 本文会新建一个名为 blog 的 Laravel 程序,这是一个非常简单的博客. l 欢迎随时关注ThinkSNS ...
- Nuxt.js vue init nuxt-community/koa-template 初始化项目报错
报错提示: Module build failed: Error: Plugin/Preset files are not allowed to export objects, only functi ...
- ABAP-JCO服务错误
1.错误如下图,需SM59调整Unicode,保持JCO服务启动时与SAP-SM59设置Unicode一致.
- laravel项目中通过nvmw安装node.js和npm 开发环境-- windows版
windows版本安装 此教程执行的时候,网速一定要好.不然可能出现各种错误. 如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ git clone nvmw 直接从 githu ...