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

 



推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 使用 SourceTree 管理 SVN 代码仓库的详细指南
    SourceTree 是一款功能强大的 Git 管理工具,但很多人不知道它同样支持管理 SVN 代码仓库。本文将详细介绍如何使用 SourceTree 来管理和操作 SVN 代码仓库。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • 本视频教程将带你快速了解 Android 开发的基础知识,并详细讲解如何在 Android 应用中使用 SQLite 数据库进行数据存储和管理。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 河北省工业和信息化厅公文收发管理系统
    河北省工业和信息化厅及其下属各地市工信管理部门之间的文件传输主要依赖于纸质或电子邮件方式,这种方式存在效率低下、安全性差等问题。为了解决这些问题,省工信厅计划开发一套公文收发管理系统,实现文件的电子化和统一管理。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
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社区 版权所有