redis value最大值_Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?...

一、Redis 的默认配置

了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值。

例如:数据库数量,最大可用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等。我相信,关于 AOF 持久化和 RDB 持久化的配置大家都很熟悉,但是关于数据库数量和最大可用内存,是不是恰恰很容易被大家忽略?

当 Redis 实例部署在正式环境时,我们可能会根据系统业务或者服务器配置来对 redis.conf 配置文件里的一些选项进行修改。可能此时我们的潜意识都会觉得,大部分东西都是越多越好:数据库数量越多,那么我们就可以一个业务对应一个数据库,再繁杂的业务也不怕不够用;最大可用内存越大,那么我们就可以往 Redis 里存放越多的数据。

那么,数据库数量是不是真的可以无限大,Redis 没做限制么?是不是真的越多越好用?

最大可用内存是不是设置成越大越好?Redis 会不会对此也有限制呢?

下面我们来分析看看。

二、最大可用内存 maxmemory:

1、Redis 源码里的默认最大可用内存:REDIS_DEFAULT_MAXMEMORY

在 redis.h 里我们可以看到最大可用内存 REDIS_DEFAULT_MAXMEMORY 的默认值是0,即最大可用内存默认没有设置最大值。

如果 maxmemory == 0 ,那么不管用户存放多少数据到 Redis 中,Redis 也不会对可用内存进行检查,直到 Redis 实例因内存不足而崩溃也无作为。

6e994d348f37de5693e39e3c5b0a45b7.png

但是 Redis 其实不是没有做任何限制,对于 32 位实例,Redis 就做了限制。如果你在 32 位的服务器上部署 Redis 实例,它的最大可用内存将限制在 3 GB。

为什么是 3 GB?

因为 32 位的机器最大只支持 4GB 的内存,而系统本身就需要一定的内存资源来支持运行,所以 32 位机器限制最大 3 GB 的可用内存是非常合理的,这样可以避免因为内存不足而导致 Redis 实例崩溃。

我们可以在 redis.c 里看到 32 位限制 3 GB 的源码:

/* 32 bit instances are limited to 4GB of address space, so if there is

* no explicit limit in the user provided configuration we set a limit

* at 3 GB using maxmemory with 'noeviction' policy'. This avoids

* useless crashes of the Redis instance for out of memory. */

// 对于 32 位实例来说,默认将最大可用内存限制在 3 GB

if (server.arch_bits == 32 && server.maxmemory == 0) {

redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.");

server.maxmemory = 3072LL*(1024*1024); /* 3 GB */

server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;

}

2、Redis 配置文件的最大可用内存选项:maxmemory

当然了,用户可以通过 redis.conf 配置文件的 maxmemory 选项来设置最大可用内存。

但是,如果用户在配置文件开启了 maxmemory 选项,那么 Redis 会限制这个值不能小于 1M。

/* Warning the user about suspicious maxmemory setting. */

// 检查不正常的 maxmemory 配置

if (server.maxmemory > 0 && server.maxmemory < 1024*1024) {

redisLog(REDIS_WARNING,"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?", server.maxmemory);

}

此时,我们都知道:

对于最大可用内存的最大限制:只有对 32位 实例才会限制在 3 GB,对于 64 位实例是完全没有限制的。

对于最大可用内存的最小限制:当用户开启了 redis.conf 配置文件的 maxmemory 选项,那么 Redis 将限制选项的值不能小于 1 MB 。

3、最大可用内存该如何设置?

当然是越大越好了,但是前提我们要考虑一下服务器会用来做什么。

假如我们的机器只用来部署一个 Redis 实例,那么大概留个 1 GB 的内存资源来支撑系统本身的运行即可。

但是如果我们部署多个 Redis 实例,或者还要部署其他系统,那么就要好好计算一翻了;如果设置的最大可用内存过大了,就会导致 Redis 实例因为内存不足而崩溃了。

三、数据库数量 dbnum:

1、Redis 源码里的默认数据库数量:REDIS_DEFAULT_DBNUM

在 redis.h 里我们可以看到 Redis 默认的数据库数量 REDIS_DEFAULT_DBNUM 为16。

ad41fb10e1c480757367504421e3b332.png

2、Redis 配置文件的数据库数量选项:databases

用户可以通过 redis.conf 配置文件的 databases 选项来设置数据库数量。

249be21a1861414cbb727b3d37cdabe2.png

3、redis 是否会限制数据库数量的大小?

1)在初始化服务器状态(redisServer)时,直接读取默认值 REDIS_DEFAULT_DBNUM。

84cfa27e38a76877c70327e18a4c37b5.png

2)在读取配置文件时,读取 databases 配置项,并做下一步判断。

rewriteConfigNumericalOption(state,"databases",server.dbnum,REDIS_DEFAULT_DBNUM);

server.dbnum = atoi(argv[1]);

if (server.dbnum < 1) {

err = "Invalid number of databases"; goto loaderr;

}

到此我们都知道:

Redis 不会限制 dbnum 的最大值。

但是会限制 dbnum 的最小值为 1。

4、数据库数量是不是越多越好?

Redis 数据库的数量无非就是想对应不同业务的数量,一个业务对应一个数据库,清晰明了;但是如果数据库数量太多,却可能会导致一些用户不易发现的问题!

例如删除过期键的 activeExpireCycle 函数中,就会对数据库数量有限制了:

一般情况下,函数只处理 REDIS_DBCORN_DBS_CALL 个数据库(即16个数据库)的过期键,除非上一次处理过期键遇到了时间限制,才会对所有数据库进行扫描;这其实就和 Redis 默认就是 16个数据库是一一对应的。

a0212a7044a83ca8486bc7a6810fabe7.png

然后程序接着从数据库 0 - 15,一一遍历处理过期键:

/* We usually should test REDIS_DBCRON_DBS_PER_CALL per iteration, with

* two exceptions:

*

* 一般情况下,函数只处理 REDIS_DBCRON_DBS_PER_CALL 个数据库

* 除非:

*

* 1) Don't test more DBs than we have.

* 当前数据库的数量小于 REDIS_DBCRON_DBS_PER_CALL

* 2) If last time we hit the time limit, we want to scan all DBs

* in this iteration, as there is work to do in some DB and we don't want

* expired keys to use memory for too much time.

* 如果上次处理遇到了时间上限,那么这次需要对所有数据库进行扫描,

* 这可以避免过多的过期键占用空间

*/

if (dbs_per_call > server.dbnum || timelimit_exit)

dbs_per_call = server.dbnum;

//.....

// 遍历数据库

for (j = 0; j < dbs_per_call; j++) {

int expired;

// 指向要处理的数据库

redisDb *db = server.db+(current_db % server.dbnum);

// ....

那么存在一种情况:

如果用户设置了 databases 20,而正常情况下,只有数据库 0 -15 这 16 个数据库的过期键得到定期删除策略的删除,而数据库 16 -19 这几个数据库不能通过定期删除策略删除掉过期键;只能等待惰性删除策略:即当数据库键被访问时才判断此键是否过期,过期了才删除此键。但是如果这些库的过期键很长一段时间都不被访问,那么会导致浪费不少宝贵的内存空间。

最后关于数据库数量的建议:

当然了,既然 Redis 将默认的数据库数量设置为 16,那么很多地方应该都会用到此来对数据库数量做一些限制,所以,我们正常情况下,尽量不要修改 Redis 的数据库数量;而且,我自己感觉 16 个其实是挺多的了,我们连一半都用不到,尴尬尴尬~ 😂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java成长之路

在Java语言中&#xff0c;一维数组的使用类似于变量的使用&#xff0c;分为以下4个步骤&#xff1a; 声明数组 创建数组 初始化数组 引用数组元素 语法&#xff1a;数据类型 [] 数组名 ; 或数据类型 数组名 []; int[] age; // 用于存储年龄 String names[]; // 用于存储…

程序员》推荐C++ 图书三人谈

程序员》推荐C 图书三人谈 主持人&#xff1a;熊节&#xff08;透明&#xff09;&#xff0c;《程序员》杂志编辑&#xff0c;C-View成员 嘉 宾&#xff1a;孟岩&#xff08;梦魇&#xff09;,联想公司掌上设备事业部应用开发处任职&#xff0c;C-View成员。与侯捷先生合译《C …

谁是对象谁是类?你搞清楚了吗?

今天带大家了解一下Java中类与对象的知识&#xff0c;一起来学习吧 现实世界中的所有具体的事物都可以视为对象 Java中万物皆对象&#xff0c;属性——对象具有的各种特征 每个对象的每个属性都拥有特定值&#xff0c;类是对对象的描述&#xff0c;是创建对象的“模板”&am…

实现页面适配_微信公众号文章页面适配深色模式

最近安卓微信7.0.10正式版发布&#xff0c;更新过后&#xff0c;很多用户发现&#xff0c;之前在测试版中对系统深色模式的适配功能被取消了&#xff0c;小伙伴们对此很是不满&#xff0c;好在Android 10系统手机用户占比很少&#xff0c;影响范围还不是很大&#xff0c;并且也…

推荐系统相关资源搜集

1.open source code: https://mymediaproject.codeplex.com/ 2.推荐系统常见推荐算法比较&#xff1a; http://fantasticinblur.iteye.com/blog/1333899 3.Hulu项亮的博士论文以及论著&#xff1a; http://vdisk.weibo.com/s/KCCWk 4.MovieLens的Dataset: http://www.grouplens…

iframe悬浮在html上_HTML Iframe

HTML Iframeiframe 用于在网页内显示网页。添加 iframe 的语法URL 指向隔离页面的位置。Iframe - 设置高度和宽度height 和 width 属性用于规定 iframe 的高度和宽度。属性值的默认单位是像素&#xff0c;但也可以用百分比来设定(比如 "80%")。实例&#xff1a;html&…

cdn需要备案吗_cdn需要备案么

cdn需要备案么&#xff1f;需要的&#xff0c;使用国内的cdn节点&#xff0c;必须要有备案才可以做cdn&#xff0c;相关部门为防止cdn滥用&#xff0c;要求必须先备案。国内节点只要是大型数据中心的&#xff0c;基本都要备案。使用CDN产品是需要备案的&#xff0c;但不限制在提…

POJ 3667 Hotel

题目大意&#xff1a; 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 2 a b:将[a,ab-1]的房间清空 思路&#xff1a;线段树的区间合并。 用cov记录区段的状态&#xff0c;-1代表没有被更新&#xff0c;0代表空闲&#xff0c;1代表是有人入住的。 用lmax代表从左端点开…

Mysql能删了重装吗_mysql卸载重新安装

1.控制面板——》所有控制面板项——》程序和功能&#xff0c;卸载mysql server!2.然后删除mysql文件夹下的my.ini文件及所有文件3.运行“regedit”文件&#xff0c;如图&#xff0c;打开注册表删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MyS…

(转)unity web 缓存解决方案

unity web 缓存解决方案 官方发布 web版限制五十M缓存&#xff0c;根据自己的经验绕了过去&#xff0c;解决了缓存的问题。带工程&#xff0c;带源代码。由于本人的水平也有限&#xff0c;是用JS来解决的&#xff0c;如果你还是没有头绪&#xff0c;可以购买来试试。 http://it…

mysql 当前timestamp_MySQL表结构使用timestamp以自动获取当前时间

一、怀念ACCESS的时代ACCESS的表结构如果想自动插入当前时间的时候&#xff0c;可以在列定义的时候输入默认值now ()就可以实现自动插入当前时间了。而MySQL则行不通&#xff0c;MySQL这个东东默认是命令行下面的产物&#xff0c;如果不是后来有了phpMyAdmin这个图形化界面东东…

[转]如何设置win7一直以管理员身份运行

如何设置win7一直以管理员身份运行 在win7有些程序需要以管理员的身份才能运行&#xff0c;但是我们几乎天天都要运行这些程序&#xff0c;老是要手动选下很麻烦&#xff0c;怎么样设置才能这个程序以后运行都直接是以管理员的身份运行&#xff0c;不用在让我们去选择了&#x…

mysql5.7转移_mysql从5.7.17迁移到5.7.22业务报错

本帖最后由 mark_huang 于 2018-5-22 16:45 编辑mysql从5.7.17迁移到5.7.22后&#xff0c;业务半个月报错2次(报错时间毫无规律) 以下是业务报错日志&#xff0c;truncate表后重启执行程序业务恢复正常。 原库和新库的 wait_timeout都是8个小时2018-05-20 06:30:30.020 [schedu…

15. HTML 块 div span

一&#xff1a; 块元素 block level element. 内联元素 inline element. 二&#xff1a; 块元素特点&#xff1a; 块级元素在浏览器显示时&#xff0c; 通常会以新行开始和结束。 例子&#xff1a;<h1> <p> <ul> <table> 内联元素特点&…

mysql 优化 修复原理_mysql下表的修复与优化

在很多的linux生产服务器里很多时候用数据库是mysql&#xff0c;在数据库里算是轻量级的数据库&#xff0c;但是长期以来的使用往往会出现一些问题&#xff0c;一般的状况是无法读取表&#xff0c;此时我们就要来修复表、优化表&#xff0c;减小磁盘使用量&#xff0c;以方便数…

funny

var life { "work_hard","have_fun","make_history" };转载于:https://www.cnblogs.com/yqskj/p/3205328.html

MySQL substring-index_mysql函数之SUBSTRING_INDEX(str,/,-1)

SUBSTRING_INDEX的用法&#xff1a; •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前&#xff0c;从字符串str返回自字符串。若count为正值,则返回最终定界符(从左边开始)若为-1则是从后往前截取SELECT substring_index(Hn_P00001, P, -1) -- 结果是0000…

根据/proc/meminfo对空闲内存进行占用

#include <stdio.h>#include <sys/sysinfo.h> #include <linux/kernel.h> /* 包含sysinfo结构体信息*/ #include <unistd.h>#include <string> #include <iostream> #include <fstream> #include <map> #include <vect…

integer 负数字符串比较_JAVA源码之Integer-1

四、方法toString三个方法&#xff0c;其中两个static方法。1、public String toString()&#xff1a;该方法内部使用toString(int i)实现。2、public static String toString(int i)&#xff1a;该方法内部使用stringSize方法巧妙的获取入参的size&#xff0c;然后用getChars把…

springboot mysql url_spring boot 连接Mysql介绍

Spring Boot 集成教程概述java应用的数据库接口的层次图如下JDBCJava应用通过JDBC接口访问数据库&#xff0c;JDBC(Java DataBase Connectivity/Java数据库连接)为各种数据库&#xff0c;如mysql、oracle等&#xff0c;提供一个统一的接口&#xff0c;应用程序通过JDBC执行各种…