目录
连接前的配置
vim 显示行号:在命令模式下输入 :set nu
跳转到指定行:输入:n (n表示行号)
绑定客户端 IP
Redis 可以通过修改配置文件来限定可以访问自己的客户端 IP。
通过以上设置就能实现192.168.11.10和127.0.0.1的IP访问Redis数据库。
保护模式
我们想要其他机器连接我们的Redis服务,有三种方式:
- 让Redis运行在protected-mode为no的模式。
- 如果protected-mode为yes,那么我们可以在Redis服务上设置bind,也就是我们的一台机器有几个ip,指定我们的服务绑定监听本机的哪个ip。
- 如果protected-mode为yes,除了设置bind外,亦可通过设置密码的形式,也即是设置参数requirepass,从而达到可以从其他机器访问的目标。
设置访问密码
为 Redis 设置访问密码,可以对要读/写 Redis 的用户进行身份验证。没有密码的用户可以登录 Redis,但无法访问。
![image-20230401142757225](https://liubing-1314895948.cos.ap-chengdu.myqcloud.com/img/202304011427416.png)
警告是由于输入密码的方式是以明文的方式输入。如果不想要出现警告,可以先登录,然后在输入密码。
禁止/重命名命令
以下两个命令非常危险:
- flushall
- flushdb
它们都是用于直接删除整个 Redis数据库的。若让用户可以随便使用它们,可能会危及数据安全。Redis 可以通过修改配置文件来禁止使用这些命令,或重命名这些命令。
将这两个命令重命名为空串,就表示禁用了。
设置开机自启动
Redis配置文件详解
include
Redis只有一个配置文件,但如果是多个人进行开发维护,那么就需要多个这样的配置文件。Redis针对这种场景,提供了include关键字将其他配置文件引入进来。include关键字指定要在当前配置文件中包含的配置文件。这样做的目的主要是便于配置信息管理:可以将不同场景的配置都进行单独定义,然后在当前核心配置文件中根据不同场景选择包含进不同的配置文件。
modules
Redis 配置文件中可以通过加载不同的第三方模块,来增强、扩展 Redis 的功能。模块扩展功能是在redis4.0上新增出来的,通过loadmodule配置引入自定义模块来新增一些功能。比如新增一种数据类型。
![image-20230401151342024](https://liubing-1314895948.cos.ap-chengdu.myqcloud.com/img/202304011513185.png)
network
Network 配置模块是比较重要的部分,主要进行网络相关的配置。其中较重要的有:
-
bind:用于绑定redis服务器网卡IP,默认为127.0.0.1,只能通过本机的客户端连接redis服务,而无法通过远程连接。
-
port:设置redis进程的端口号,默认是6379。
-
timeout:设置客户端连接的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。默认值为0,表示不关闭。
-
tcp-backlog:tcp-backlog 是一个 TCP 连接的队列,其主要用于解决高并发场景下客户端慢连接问题。这里设置的值就是这个队列的长度。该队列与 TCP 连接的三次握手有关。不同的 Linux 内核,backlog 队列中存放的元素(客户端连接)类型是不同的。
Linux 内核 2.2 版本之后 TCP 系统中维护了两个队列:SYN_RECEIVED 队列与 ESTABLISHED队列。SYN_RECEIVED 队列中存放的是未完成三次握手的连接,ESTABLISHED 队列中存放的是已完成三次握手的连接。此时的 backlog 就是 ESTABLISHED 队列。
TCP 中的 backlog 队列的长度在 Linux 中由内核参数 somaxconn 来决定。所以,在 Redis中该队列的长度由 Redis 配置文件设置与 somaxconn 来共同决定:取它们中的最小值。
- 如何修改Linux内核参数 somaxconn:打开/etc/sysctl.conf 文件,在最后添加net.core.somaxconn=2048。修改之后重启系统或者使用sysctl -p命令来让系统重新加载内核参数。
-
tcp-keepalive:周期性的检查客户端是否处于健康状态,避免服务器一直阻塞,单位为秒。默认为300;如果设置为0,则不会周期性的检测。
-
protected-mode:该配置项设置外部网络连接redis服务,设置方式如下:
- 关闭protected-mode模式,此时外部网络可以直接访问。
- 开启protected-mode保护模式,需配置bind ip或者设置访问密码。
如下是network模块的一部分
![image-20230401153409822](https://liubing-1314895948.cos.ap-chengdu.myqcloud.com/img/202304011534975.png)
general
-
daemonize:控制 Redis 启动是否采用守护进程方式,即是否是后台启动。yes 是采用后台启动;默认值为no。
-
pidfile:该配置用于指定 Redis 运行时 pid 写入的文件,无论 Redis 是否采用守护进程方式启动,pid 都会写入到该配置的文件。
注意:如果没有配置 pidfile,不同的启动方式,pid 文件的产生效果是不同的:
-
采用守护进程方式启动(后台启动,daemonize 为 yes):pid 文件为/var/run/redis_6379.pid。
-
采用前台启动(daemonize 为 no):不生产 pid 文件
- loglevel :定义日志级别。默认值为notice,可选值有以下4种:
- debug(记录大量日志信息,适用于开发、测试阶段)
- verbose(较多日志信息)
- notice(适量日志信息,适用于生产环境)
- warning(仅记录部分重要、关键信息)
-
logfile:指定日志文件。如果设置为空串,则强制将日志记录到标准输出设备(显示器)。如果使用的是守护进程启动方式,设置为空串,则意味着会将日志发送到设备/dev/null(空设备)。
-
databases:设置数据库的数量,默认为16。默认为第0个数据库,客户端可通过select 命令选择一个数据库。
security
- rename-command:命令重命名,通常用于将一些重要命令重命名,从而起到安全保护的作用。例如:
-
flushdb(清空数据库)
-
flushall(清空所有记录)
-
config(客户端连接后可配置服务器)
-
keys(客户端连接后可查看所有存在的键)
可通过rename-command FLUSHALL ""禁用命令,也可以保留命令但是不能轻易使用,如:rename-command flushall abcdefg。这样的话,重启服务器后则需要使用新命令来执行。
- requirepass:设置redis的连接密码,比如:requirepass 123。
clients
该模块用于设置与客户端相关的属性,其中仅包含一个属性 maxclients。maxclients 用于设置 Redis 可并发处理的客户端连接数量,默认值为 10000。如果达到了
该最大连接数,则会拒绝再来的新连接,并返回一个异常信息:已达到最大连接数。
注意:
该值不能超过 Linux 系统支持的可打开的文件描述符最大数量阈值。查看和修改该阈值的方式详见:Linux命令之ulimit命令 (CSDN)
如果Linux的支持的打开最大文件描述符的数量超过了10000,此时Redis的最大连接数量也并不是10000,因为Redis系统本身会消耗掉一些文件描述符,官方文档如下:
所以最大的客户端连接数最多是10000-32个。
memory management
该配置可以控制最大可用内存及相关内容移除问题。
-
maxmemory:设置Redis的最大内存,如果设置为0,表示不作限制。当达到内存限制时,Redis 将根据选择的逐出策略 maxmemory-policy 尝试删除符合条件的 key。如果不能按照逐出策略移除 key,则会给写操作命令返回 error,但对于只读的命令是没有影响的。
-
maxmemory-samples:该属性用于指定挑选要删除的 key 的样本数量。样本的选择采用的是 LRU 算法,其不能修改。但从样本中再选择要移除的 key,则采用的是 maxmamory-policy 指定的策略。
为什么要指定样本数量,因为实际场景可能有10万个key,如果把每个key都遍历一遍,效率会很低,只能遍历一部分数量的Key,当需要淘汰的key的数量达到指定数量的时候就停止遍历。这种办法在淘汰key的精确度和效率上都兼顾到了。
官方注释:当maxmemory-samples设置为5时,工作的结果已经非常不错了;当设置为10的时候,结果将会非常精确,但会消耗更多的cpu资源;当设置为3的时候选择需要淘汰的key的结果可能并不精确。
- maxmemory-policy :当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策略。有以下几种可以选择:
-
volatile-lru:使用近似 LRU 算法移除,仅适用于设置了过期时间的 key。
-
allkeys-lru:使用近似 LRU 算法移除,可适用于所有类型的 key。
-
volatile-lfu:使用近似 LFU 算法移除,仅适用于设置了过期时间的 key。
-
allkeys-lfu:使用近似 LFU 算法移除,可适用于所有类型的 key。
-
volatile-random:随机移除一个 key,仅适用于设置了过期时间的 key。
-
allkeys-random:随机移除一个 key,可适用于所有类型的 key。
-
volatile-ttl:移除距离过期时间最近的 key。
-
noeviction:不移除任何内容,只是在写操作时返回一个错误,默认值。
也就是说假如maxmemory-samples设置为5时,会从5个样本中使用上面的淘汰策略,淘汰掉其中的一个。
- maxmemory-eviction-tenacity:设置移除容忍度。数值越小表示容忍度越低,需要移除的数据移除延迟越小;数值越大表示容忍度越高,需要移除的数据移除延迟越大。
官方文档:在正常情况下,当设置为默认值(10)的时候可以工作的很好。但是如果出现写操作的高并发时,可以将这个默认值调大一些。如果设置为0表示没有容忍度(当淘汰策略选择到相应的key后会立即淘汰)。
threaded I/O
该配置模块用于配置 Redis 对多线程 IO 模型的支持。
- io-threads:该属性用于指定要启用多线程 IO 模型时,要使用的线程数量。
官方文档:多线程默认是关闭的,但是我们建议打开,当你的机器的CPU核数超过4个时,并且要至少预留一个线程去完成持久化(CPU核数超过4,io-threads最多为3)。
查看当前机器CPU核数:4
- io-threads-do-reads:用于启用多线程 IO 模型中的多线程处理读请求的能力,该属性默认是关闭的。