热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

REdis之maxmemory解读

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

 

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








maxmemory 1048576

maxmemory 1048576B

maxmemory 1000KB

maxmemory 100MB

maxmemory 1GB

maxmemory 1000K

maxmemory 100M

maxmemory 1G


 

没有带单位尾巴的为字节数,以B结尾的表示相应的大小。但需要注意KBKMBMGBG是不同的,如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”以使生效。

 



推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 最近学习反射机制的时候Properties.load(读取本地文件流的时候怎么也找不到加载文件后面发现IDEA的默认根目录是在它的Project工程下IDEA的文件目录和Ec ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
author-avatar
huanghxn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有