MySQL笔记14

一、Redis配置文件

配置文件一般在 /etc/redis/redis.conf (Linux系统),可通过命令:find / -name redis.conf 查找。使用 vim 编辑查看文件内容(设置行号命令 :set un )

1.Units(单位)

在Redis配置文件中,定义了内存等资源的基本度量单位,仅支持字节(bytes),不支持比特(bit),且单位大小写不敏感。具体单位换算:

作用:这些单位用于在 Redis 配置文件中指定内存等资源的大小,方便用户根据需求配置 Redis 的各项参数,例如内存限制、数据持久化文件大小等。

2.Includes(引入配置文件)

作用:用于引入一个或多个其他配置文件。在有多台 Redis 服务器共用标准配置模板,但每台服务器又需要个性化设置的场景中非常实用。类似 JSP 程序的 include 机制,多实例部署时可提取公用配置文件,减少重复配置工作。

注意:

include 选项不会被 CONFIG REWRITE 命令重写。

由于Redis会将最后处理的配置行作为指令值,若想避免运行时覆盖配置变更,建议将 include 放在配置文件开头;若想用 include 覆盖配置选项,则建议将其放在最后一行。

配置示例:可通过类似 include /path/to/local.conf 、 include /path/to/other.conf 的格式引入其他配置文件,其中 /path/to/ 为实际文件路径。

3.Network(网络连接)

(1)bind(绑定 ip 地址)

作用:用于指定 Redis 服务器监听的IP地址。默认情况下 bind=127.0.0.1 ,仅允许本机(回环地址)的访问请求;若不配置该选项, Redis 将无限制接受任何IP地址的访问。

生产环境配置建议:

生产环境中若需要远程访问,需填写应用服务器的IP地址,或注释掉该配置项。但需注意,若开启了 protected-mode (保护模式),且未设置 bind IP和密码, Redis 仍仅允许本机访问。

配置修改后,需要通过 "保存-停服务-重启服务" 的步骤,让新配置生效,从而实现非本机访问的需求。

配置示例与说明:

可配置多个IP,如 bind 192.168.1.100 10.0.0.1 ------ 表示监听两个特定的 IPv4 地址;

bind 127.0.0.1 ::1 ------ 表示监听回环 IPv4 和 IPv6 地址;

bind * ::* ------ 表示监听所有可用网络接口(类似不配置 bind 的效果)。

另外,若服务器直接暴露在互联网中,绑定所有接口存在安全风险,因此默认配置会限制 Redis 仅监听回环接口,确保仅本机可连接。如果确认需要监听所有接口,可注释掉默认的 bind 127.0.0.1 -::1 配置行。

(2)protected-mode(保护模式)

作用:用于控制 Redis 的访问保护。默认情况下 protected-mode yes (开启状态),当满足 "未通过 bind 指令显式绑定地址" 且 "未配置密码" 这两个条件时, Redis 仅允许来自回环地址( 127.0.0.1 、 ::1 )和 Unix 域套接字的客户端连接,以此保障 Redis 服务的安全性。

配置建议:

仅当已确定希望其他主机的客户端在未配置认证和显式 bind 接口的情况下也能连接 Redis 时,才建议将其设置为 no (关闭保护模式)。生产环境中若需关闭,需结合密码配置或 bind 配置,避免安全风险。

(3)port(端口号)

作用:指定 Redis 服务器监听的端口号,默认端口为 6379。

注意:可根据需求修改端口,若服务器上运行多个 Redis 实例,需配置不同端口以避免冲突。

(4)tcp-backlog( TCP 连接队列长度)

作用:用于设置 TCP 连接队列的长度,该队列由 "未完成三次握手队列" 和 "已完成三次握手队列" 组成。在高并发环境下,较高的 tcp-backlog 值可避免因客户端连接过慢导致的问题,提升连接处理效率。

注意:在 Linux 系统中,内核会将该值限制为 /proc/sys/net/core/somaxconn (默认128)的值,因此若需调整 tcp-backlog 以达到预期效果,需同时增大 /proc/sys/net/core/somaxconn 和 /proc/sys/net/ipv4/tcp_max_syn_backlog (默认128)这两个内核参数的值。

配置示例:

图中配置为 tcp-backlog 511 ,表示设置 TCP 连接队列长度为511(需结合内核参数调整才能完全生效)。

(5)timeout(空闲客户端连接超时时间)

作用:用于设置空闲客户端连接的超时关闭时间。单位为秒,当值为 0 时,表示关闭该功能,即永不关闭空闲客户端连接。

应用场景:若服务器资源有限,可设置非零值来释放长时间空闲的客户端连接资源;若需保持客户端长期连接,则设置为 0 。

(6)tcp-keepalive( TCP 保活检测间隔时间)

作用:是对访问客户端的心跳检测机制,单位为秒。用于在客户端无通信时发送 TCP ACK 包,一是检测失效的客户端("僵死"节点),二是强制中间网络设备认为连接处于活跃状态。若设置为 0 ,则不进行 Keepalive 检测,建议设置为 60 或 300 (Redis 3.2.1及以上默认300秒)。

配置说明:

在Linux系统中,配置的数值(秒)是发送ACK包的周期,关闭连接则需要两倍时间;其他内核系统的周期取决于内核配置。图中配置为 tcp-keepalive 300 ,即每300秒进行一次心跳检测。

4.General(通用配置)

(1)daemonize(守护进程)

作用:控制Redis是否以后台守护进程方式运行,实现后台启动,避免终端占用。

配置说明:默认 no (前台运行),设置为 yes 启用后台运行;由 upstart 或 systemd 管理时该参数无影响。

(2)pidfile( PID 文件)

作用:存储Redis进程ID(PID)的文件路径,用于进程管理(如查看、停止进程)。

配置说明:启动时写入PID文件,退出时删除;未指定且以守护进程运行时默认 /var/run/redis.pid ;图中配置为 /var/run/redis_6379.pid 。

(3)loglevel(日志级别)

作用:用于指定 Redis 的日志记录级别,通过控制日志输出的详细程度,满足不同场景(如开发调试、生产监控)的需求,帮助技术人员排查问题、了解 Redis 运行状态。

配置说明:

Redis支持四个日志级别(默认值为 notice ),分别是------

debug :输出大量信息,包含详细的调试细节,适用于开发和测试阶段,便于深入排查问题;

verbose :输出较多信息,但不像 debug 级别那样繁杂,在一些需要较多上下文信息但又不需要过度细节的场景中可使用;

notice :信息输出程度适中,是生产环境中较为推荐的级别,能在记录关键信息的同时避免日志过度冗余;

warning :仅记录非常重要或关键的消息,在对日志简洁性要求较高的生产场景中可选择,减少不必要的日志干扰。

(4)logfile(日志文件)

作用:指定 Redis 日志文件的名称及存储路径,实现日志的集中存储与管理,方便技术人员查看、分析 Redis 的运行日志,追溯历史操作和问题。

配置说明:可设置具体的日志文件路径,例如 logfile "/var/log/redis/redis.log" ;若将其设置为空字符串(如 logfile "" ),则Redis会将日志输出到标准输出(如终端)。需要注意的是,如果Redis以守护进程方式运行且日志输出到标准输出,那么日志会被发送到 /dev/null (即丢弃日志)。

(5)databases(数据库数量)

作用:用于设定Redis数据库的数量。

配置说明:默认数据库数量为16,默认使用的数据库是 DB 0。可以使用 SELECT <dbid> 命令在每个连接上指定要使用的数据库 ID( dbid 的范围是0到 "databases数量 - 1" )。图中配置为 databases 16 ,即保持默认的16个数据库设置。

5.Security(安全)

作用:用于为 Redis 设置访问密码,保障 Redis 服务的安全性,防止未授权访问。

配置说明:在Redis 6及以上版本中, requirepass 是兼容层配置,用于设置默认用户的密码。客户端可通过 AUTH <password> 或 AUTH default <password> 进行认证。需注意, requirepass 与ACL文件配置( aclfile )和 ACL LOAD 命令不兼容,若使用后者, requirepass 会被忽略。默认配置中该选项被注释,需解开注释并设置密码(如 requirepass foobared )。

操作示例:

如果设置完密码后没有进行认证,可能会报错:

此时客户端必须先通过 auth 密码命令完成认证,才能继续执行需要权限的操作:

注意:在命令中只能修改临时密码,重启 redis 服务器后便还原了。想要永久修改密码,需要在配置文件中进行设置。

6.Clients(客户端)

(1)maxclients

作用:用于设置 Redis 同时可连接的客户端最大数量,保障 Redis 服务的连接资源合理分配,避免因客户端连接过多导致服务异常。

配置说明:默认值为10000个客户端。若达到该限制, Redis 会拒绝新的连接请求,并向请求方返回 "max number of clients reached" 的错误提示。

注意:若 Redis 服务器无法配置进程文件限制以支持指定的客户端数量,实际允许的最大客户端数会是当前文件限制减32(因为Redis会预留一些文件描述符用于内部使用);若使用 Redis 集群,集群总线也会共享连接数,每个集群节点会使用两个连接(一个入站、一个出站),在超大型集群场景下需据此调整该配置。图中配置为 maxclients 10000 ,即保持默认的最大客户端连接数设置。

(2)maxmemory

作用:用于设置Redis可使用的最大内存量,防止Redis因内存占满导致服务器宕机,保障服务稳定性。

配置说明:

一旦内存使用达到该上限,Redis 会根据 maxmemory-policy 指定的规则尝试移除内部数据。若无法移除数据(或设置为"不允许移除"),Redis 会对需要申请内存的指令(如 SET 、 LPUSH 等)返回错误,但对无内存申请的指令(如 GET )仍正常响应。

若Redis作为主节点(有从节点),设置内存上限时需为同步队列缓存留出部分内存空间(仅当策略为 noeviction 时无需考虑)。因为给从节点喂数据的输出缓冲区大小会从已用内存计数中扣除,避免因网络问题或重新同步触发键驱逐循环,导致数据库被完全清空。配置格式为 maxmemory <bytes> ,需根据服务器内存资源和业务需求设置具体的字节数。

(3)maxmemory-policy

作用:当 Redis 内存使用达到 maxmemory 上限时,通过该配置指定数据的移除策略,以保障Redis 在内存受限情况下的运行逻辑。

可选参数及说明(若所有策略都无合适的键可移除, Redis 会对需要更多内存的写操作返回错误。):

volatile-lru :仅对设置了过期时间的键,使用 LRU(最近最少使用)算法移除。

allkeys-lru :在所有键中,使用 LRU 算法移除。

volatile-random :仅对设置了过期时间的键,随机移除。

allkeys-random :在所有键中,随机移除。

volatile-ttl :移除 TTL(生存时间)值最小的键(即最近要过期的键)。

noeviction :不进行键移除,对需要申请内存的写操作(如 SET 、 LPUSH 等)返回错误,默认采用该策略。

(4)maxmemory-samples

作用:用于设置 LRU(最近最少使用)、LFU(最近最少频率使用)和最小 TTL 算法的样本数量。由于这些算法并非精确算法,而是估算值,通过设置样本数量可在性能和准确性之间做权衡。

配置说明:Redis 默认会检查5个键,并选择其中最久未使用的键。一般可设置3到7之间的数值,数值越小,样本准确性越低,但性能消耗也越小;数值越大(如10),越接近真实的 LRU 算法,但 CPU 消耗会增加。图中配置为 maxmemory-samples 5 ,即保持默认的样本数量设置。

二、发布和订阅

1.简介

Redis 发布订阅 ( pub / sub ) 是一种消息通信模式:发送者 ( pub ) 发送消息,订阅者 ( sub ) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 ,以及订阅这个频道的三个客户端 ------ client1 、client2 和 client3 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

2.常用命令

|-------------------------------------------------|------------------|
| 命令语法 | 描述 |
| PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道 |
| PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态 |
| PUBLISH channel message | 将信息发送到指定的频道 |
| PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有给定模式的频道 |
| SUBSCRIBE channel [channel ...] | 订阅给定的一个或多个频道的信息 |
| UNSUBSCRIBE [channel [channel ...]] | 指退订给定的频道 |

3.示例

以下实例演示了发布订阅是如何工作的。在实例中创建了一个名为 redisChat 的订阅频道(Redis 客户端通过一个 subscribe 命令可以同时订阅任意数量的频道。在输出了订阅了主题后,命令处于阻塞状态,等待相关频道的消息。):

查看定义频道:

先重新开启另一个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息(返回值为接收到该消息的订阅者数量)。

切换到原来的客户端,可以看到如下信息:

按下 ctrl+c 或输入下面命令来终止订阅:

查看订阅频道为无:

用途:一般常用于向所有在线用户发送实时通知,比如新消息、新订单等。

相关推荐
酌量5 小时前
从 ROS 订阅视频话题到本地可视化与 RTMP 推流全流程实战
经验分享·笔记·ffmpeg·音视频·ros
绵绵细雨中的乡音5 小时前
MySQL 常用函数实操指南:从基础到实战案例
数据库·mysql
凉栀お_6 小时前
MySQL相关知识查询表中内容(第二次作业)
数据库·mysql
摇滚侠6 小时前
Spring Boot 3零基础教程,WEB 开发 HttpMessageConverter @ResponseBody 注解实现内容协商源码分析 笔记33
java·spring boot·笔记
Java水解6 小时前
【SQL】MySQL中空值处理COALESCE函数
后端·mysql
moringlightyn6 小时前
c++11可变模版参数 emplace接口 新的类功能 lambda 包装器
开发语言·c++·笔记·其他·c++11·lambda·包装器
崎岖Qiu6 小时前
【OS笔记11】:进程和线程9-死锁及其概念
笔记·操作系统·os
ss2736 小时前
手写Spring第7弹:Spring IoC容器深度解析:XML配置的完整指南
java·前端·数据库
PFinal社区_南丞6 小时前
PostgreSQL-10个鲜为人知的强大功能
数据库·后端