专栏首页阿Q说代码好饭不怕晚,扒一下Redis配置文件的底Ku

好饭不怕晚,扒一下Redis配置文件的底Ku

忙碌是一种幸福,让我们没时间体会痛苦;奔波是一种快乐,让我们真实地感受生活;疲惫是一种享受,让我们无暇空虚。这几句话就能简单概括我最近的工作和生活。

好多小伙伴都来私信“催更”,今天它来了!为了表达阿Q的歉意,特赠送「亿级流量Java高并发与网络编程实战」一本,规则见文末。

在往期的文章中我们已经对Redis的概念和基本命令进行了讲解,今天我们来看下它的配置文件,Redis的配置文件在我们的开发和实际应用中起着非常重要的作用。

我们可以在安装目录下找到redis.conf配置文件,通过vim命令进行查看,为了防止配置文件进行更改,大家在使用前一定要备份一下!

本文Redis的版本为5.0.7

UNITS

1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 1024*1024 bytes
1g => 1000000000 bytes
1gb => 1024*1024*1024 bytes

❝单位不区分大小写,只支持bytes ❞

INCLUDES

structs2配置文件类似,可以通过includes包含。redis.conf可以作为总闸,包含其他。

include /path/to/local.conf
include /path/to/other.conf

MODULES

loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

Redis可以通过loadmodule选项在启动时加载模块,若服务端无法加载模块,服务端会停止。可以通过多个loadmodule选项加载多个模块。

NETWORK

  • 「bind 127.0.0.1」:默认情况下,如果未指定“bind”配置指令,Redis将侦听服务器上所有可用网络接口的连接。

可以使用“bind”配置指令,后跟一个或多个IP地址,只侦听一个或多个选定接口。「例如:」bind 192.168.1.100 10.0.0.1

当设置多个bind地址后,Redis内部会维护多个Socket,每个Socket用于一个network interface

  • 「protected-mode yes」:此选项默认开启。

Redis服务端未使用bind选项显式指定要监听的network interface,并且未设置密码,Redis服务端只会接受来自127.0.0.1::1的客户端以及Unix域的Socket进行连接。

  • 「port 6379」:用于设置Redis监听的TCP端口,默认为6379,设置为0表示不监听TCP端口
  • 「timeout 0」:空闲多少秒之后关闭连接,“0”表示不关闭
  • 「tcp-keepalive 300」:单位为秒,如果为0,则不会进行keepalive检测,建议设置成60
  • 「tcp-backlog 511」:设置tcpbacklogbacklog其实是一个连接队列。

backlog队列总和 = 未完成三次握手队列 + 已经完成三次握手队列 ❞

在高并发环境下需要一个高backlog值来避免慢客户端连接问题。

「注意」Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconntcp_max_syn_backlog两个值来达到想要的效果。

GENERAL

daemonize

Redis采用的是单进程多线程的模式,daemonize是用来指定redis是否要用守护线程的方式启动。默认情况下,Redis不作为守护进程运行。如果需要,请使用“是”。

#daemonize no 
//当前界面将进入redis的命令行界面,
exit强制退出或者关闭连接工具(putty,
xshell等)都会导致redis进程退出。

daemonize yes     
//代表开启守护进程模式。在该模式下,
redis 会在后台运行,并将进程 pid 号写入
至 redis.conf 选项 pidfile 设置的文件中,
此时 redis 将一直运行,除非手动kill该进程。

supervised no

当你通过upstart或者systemd运行Redis时,Redis可以和你的supervision tree进行交互,可选的选项为:

  • no 无交互(默认)
  • upstart 通过向Redis发送SIGSTOP信号来通知upstart
  • systemd 通过向$NOTIFY_SOCKET写入READY=1来通知systemd
  • auto 通过是否设置了UPSTART_JOB或者NOTIFY_SOCKET环境变量来决定选项为 upstart或者systemd

pidfile

pidfile /var/run/redis_6379.pid //进程pid文件

loglevel notice

指定服务器日志级别:从上到下依次减少

  • debug:大量信息,对开发/测试有用
  • verbose:许多很少有用的信息,但不像调试级别那样混乱
  • notice:适度冗长,可能是生产中需要的内容
  • warning:只记录非常重要/关键的消息

logfile

logfile ""

日志的名字,如果为空,redis给控制台标准输出,如果配置为守护进程方式运行,且设置了logfilestdout,则日志将会发送给/dev/null

database

databases 16

系统默认的库16个,默认使用0库

syslog

  • syslog-enabled no:是否把日志输出到syslog中,系统日志默认是关着
  • syslog-ident redis:指定syslog里的日志标志设备以redis开头
  • syslog-facility local0:指定syslog设备,值可以是USERLOCAL0-LOCAL7,默认使用local0

Security (安全)

requirepass 12345!@#

设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过Auth <password>命令提供密码,默认关闭。

如果设置完密码,ping就失败了,提示“NoAuth Authentication required”,加上auth + 密码就通了。

「要求必须auth + password 在任何命令之前」

Redis一般做的是缓存,不是安全,而且系统会认为Linux是在安全的环境下。 ❞

CLIENTS

maxclients 10000:最大连接数

设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。

当你无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自身内部处理逻辑留一些句柄出来。

如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出「max number of clients reached」以作回应。

MEMORY MANAGEMENT

设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。

如果redis无法根据移除规则来移除内存中的数据,或者设置了「不允许移除」,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SETLPUSH等。但是对于无内存申请的指令,仍然会正常响应,比如GET等。

如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

最大缓存

#maxmemory <bytes>
maxmemory 128MB

设置maxmemory和相对应的回收策略算法,设置最好为物理内存的「3/4」,或者比例更小,因为redis复制数据等其他服务时,也是需要缓存的。以防缓存数据过大致使redis崩溃,造成系统出错不可用。

牺牲一部分缓存数据,保存整体系统可用性。redis新的内存机制,会把key放在内存,value存放在swap区。

此配置需要和「maxmemory-policy」配合使用,当redis中内存数据达到maxmemory时,触发「清除策略」。在「内存不足」时,任何write操作(比如setlpush等)都会触发「清除策略」的执行。

实际环境

建议redis的所有物理机器的硬件配置保持一致(内存一致),同时确保master/replica「maxmemory policy」配置一致。

内存满时

如果还接收到set命令,redis将先尝试剔除设置过expire信息的key,而不管该key的过期时间有没有到达。

在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,内存还不够用,那么将返回错误。这样,redis将不再接收写请求,只接收get请求。

maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用。 ❞

最大缓存策略

「maxmemory-policy」:

  • volatile-lru:使用LRU(最近最少使用)算法移除key,只对设置了过期时间的键
  • allkeys-lru:使用LRU算法移除key(所有key
  • volatile-lfu:对过期键使用 LFU(最不经常使用)近似算法
  • allkeys-lfu:对所有键使用 LFU 近似算法
  • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
  • allkeys-random:移除随机的key
  • volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
  • noeviction:不进行移除。针对写操作,只是返回错误信息(默认)(去公司观察维度,不应该选择这个)

LRU算法、LFU算法或者TTL算法都是不是很精确算法,而是个近似算法。 ❞

「使用策略规则:」

  1. 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
  2. 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

样本数量

设置样本数量,上边提到的算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小。

maxmemory-samples 5

默认值是 5,也就是说Redis随机挑出5个键,然后选出一个最符合条件的。对LRU来说5是比较合适的。10已经很接近于真正的LRU,但会消耗更多的CPU。3会更快但没有那么精确。

副本忽略最大内存

replica-ignore-maxmemory yes

Redis 5开始,默认情况下,replica节点会忽略maxmemory设置(除非在发生failover后,此节点被提升为master节点)。

这意味着只有master才会执行过期删除策略,并且master在删除键之后会对replica发送DEL命令。

这个行为保证了masterreplicas的一致性,并且这通常也是你需要的,但是若你的replica节点是可写的,或者你希望replica节点有不同的内存配置,并且你确保所有到replica写操作都幂等的,那么你可以修改这个默认的行为 (请确保你明白你在做什么)。

「注意」默认情况下replica节点不会执行过期策略,它有可能使用了超过maxmemory设定的值的内存。因此你需要监控replicas节点所在的机器并且确保在master节点到达配置的maxmemory大小时,replicas节点不会超过物理内存的大小。

今天我们就先说到这了,至于配置文件中关于主从复制和持久化部分我们将在后续的内容进行讲解。

赠书活动

《亿级流量Java高并发与网络编程实战》系统全面的介绍了开发人员必学的知识,如JVM、网络编程、NIO等知识,让开发人员系统地掌握JAVA高并发与网络编程知识。

「推荐理由」

  • 全面。本书从并发的底层核心技术、互联网应用框架、数据处理等三部分对高并发系列技术做了系统讲解。
  • 实用。本书以实战化训练为宗旨,用详尽且经典的案例阐述了Java大数据及高级编程中的重点、难点。书中案例由真实项目演化而来,既体现了所述知识点的精华,又屏蔽了无关技术的干扰。
  • 案例完整。案例都是以“理论讲解 环境搭建 完整代码及分析 运行截图”这种完善的结构进行讲解,考虑到了读者可能会遇到的各种问题。

本文分享自微信公众号 - 阿Q说代码(AQ_Shuo),作者:阿Q

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 正经的聊聊分布式架构中的 redis

    话还得从上次报税说起,耳边还回绕这残留的芬芳:“SX系统,这也不能点,那也不能用!”,

    用户1577699
  • 白帽子到底是黑还是白?

    自从“黑客”一词被妖魔化后,贵圈人士一时间找不到合适的词来标榜自己,突然间有一天顿悟,发现“白帽子”这词不错,完全从“黑”变“白”。于是,这个词开始在贵圈流行,...

    C4rpeDime
  • 数据版春节攻略,帮你成为过年回家最靓的仔

    每个从12月底就开始掰指头为假期倒计时的年轻人,迄今为止大致经历了从短暂的期盼、兴奋到长期的焦虑、急躁和疲惫的心理过程。

    CDA数据分析师
  • 黑客故事:如何逼小偷把 iPhone 还回来的

    看到一哥们太给力了,忍不住分享下.身边有太多朋友手机被偷了,要是get到这个技能.啧啧!!!还愁没有妹子?哈哈哈. 有个问题要问一问:假期有没有丢手机?以下是...

    仇诺伊
  • 你在“囤货”吗?

    许多同学都在干货的周围神游,打开你的微信收藏,看看花多久时间能拉到底,收藏的文章“干货”多么?打开你标红的硬盘,里面收藏这四年前的毕向东Java...

    赵腰静
  • 利用Python搞定女朋友的小情绪~

    脱单狗福利!每天不同时间段给女友定时给女友发消息,不错过早上起床、中午吃饭、晚上吃饭、晚安时间!

    Python数据科学
  • 程序员如何用Python了解女朋友的情绪变化?

    有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

    Python数据科学
  • 程序员如何用Python了解女朋友的情绪变化?

    有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

    小小詹同学
  • Redis快照持久化

    redis的基础知识我们已经准备的差不多了,接下来两篇文章,我想和大家聊聊redis持久化这个话题。

    江南一点雨
  • 微信定时消息之搞定女朋友

    有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

    chenchenchen
  • 70/80/90后春节行为数据报告

    序言 猴年春节长假刚刚落幕,年味的气氛犹在。作为中国最隆重的传统节日,团圆饭、放鞭炮、看春晚是春节一直以来不可或缺的元素,但互联网文化也逐渐渗透春节里,成为一种...

    腾讯大数据
  • 程序员如何用技术搞定女朋友情绪?

    有时候,很想关心她,但是你太忙了,以至于她一直抱怨,觉得不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又一次忘记了。你觉得自己很委屈

    养码场
  • 蚂蚁金服内推二面

    早上刚面完oppo(oppo的面经不敢写,当时面试的时候说要保密,需要的可以私聊下),本来晚上想休息下,结果阿里电话来了(关键我没做测评,以为做了才有),吐槽...

    牛客网
  • 520来了,教你用Python感知女朋友的情绪变化!

    有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

    智能算法
  • 教你用Python感知女朋友的情绪变化!

    有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

    昱良
  • 妈妈微信给你的惊悚鸡汤文,怎么回才合适?| 微观

    知晓君
  • 阅文集团停更咪咕阅读让用户“二选一”,试问怎能伤了用户们的心?

    这几天,互联网上网络文学爱好者炸开了锅,不少用户在贴吧、论坛、微博等处爆料,阅文集团所有内容在咪咕阅读平台上都已停更,包括最受咪咕阅读用户关注的《太古神王》、《...

    罗超频道
  • 宅家做菜大赏:数据告诉你全民下厨都爱做些啥?

    居家隔离14天,返工继续隔离14天,漫漫无期的宅家生活已经成为年轻人们最近的日常。除了与疫情有关的最新消息,无事可做的年轻人们最关心的两件事情无非就是Tony老...

    CDA数据分析师
  • 程序猿一定要知道的&过年&习俗

    农历正月初一是春节,又叫阴历(农历)年,俗称“过年”。这是我国民间最隆重、最热闹的一个古老传统节日。春节是汉族最重要的节日。 今天是大年三十 辛辛苦苦忙了一年...

    互扯程序

扫码关注云+社区

领取腾讯云代金券