热门标签 | 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”以使生效。

 



推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握Redis集群的应用。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 探讨如何在职业生涯中脱颖而出,研究表明刻意练习而非单纯的经验或天赋是关键。文章分析了为什么一些人即使有多年经验也未能成为专家,而另一些人则能在短时间内达到卓越水平。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
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社区 版权所有