我们启动redis服务器的时候,经常要指定配置文件以便加载文件中的配置项,这个配置文件叫做redis.conf,如果是源码安装,配置文件被存放在源码安装包目录里边,如下图:

image-20210521163326199

在这个配置文件redis.conf中有很多的配置项,并且redis配置文件中对内存大小单位不区分大小写,并且使用的时候要注意:k != kbm!=mbg!=gb,区别如下:

1
2
3
4
5
6
7
8
9
10
11
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.

下面介绍一些项目开发过程中常用的一些配置项:

1. include 包含

指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件,总结一句话:多实例的情况可以把公用的配置提取出来,作为公共配置文件来使用。

1
include /path/to/local.conf

2. 网络配置 - NETWORK

2.1 bind

绑定本机的IP地址,默认情况bind 127.0.0.1只能接受本机的访问请求。

  • 如果当前计算机有多块网卡,可以指定某一块网卡的IP地址,也可以指定127.0.0.1
  • 如果没有绑定(该配置项被注释了,或者 bind 0.0.0.0),可以接受来自任意一个网卡的Redis请求,如果非本机客户端想要访问redis服务器,需要解除IP的绑定。

生产环境需要指定应用服务器的地址;如果服务器是需要远程访问的,需要将其注释掉或者指定为0.0.0.0

1
bind 127.0.0.1

如果开启了protected-mode,那么在没有绑定ip且没有设密码的情况下,Redis还是只允许接受本机的访问。

2.2 protected-mode

设置保护模式,如果保护模式为yes,非本机客户端无法连接到redis服务器,如需连接需要设置为no

1
protected-mode yes

2.3 port

指定Redis监听端口,默认端口为6379(作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为在手机按键上6379对应的字母为MERZ,而MERZ取自意大利女歌手Alessia Merz的名字)

1
port 6379

2.4 tcp-backlog

设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。在高并发环境下需要一个高 backlog 值来避免慢客户端连接问题。

1
tcp-backlog 511

注意,Linux内核会将这个值减小到 /proc/sys/net/core/somaxconn 文件中存储的值(128),所以需要确认增大/proc/sys/net/core/somaxconn/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个文件中存储的值来达到想要的效果。

2.5 timeout

指定当客户端闲置多长时间后(单位:秒)断开连接,如果指定为0,表示关闭该功能,不自动断开连接

1
timeout 0

2.6 tcp-keepalive

对已经连接的客户端进行心跳检测,每隔N秒检测一次,如果设置为0,则不会进行Keepalive检测,建议设置成60

1
tcp-keepalive 60

3. 通用配置 - GENERAL

3.1 daemonize

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,设置为yes以守护进程方式后台启动

1
daemonize no

3.2 pidfile

当Redis以守护进程方式运行时,Redis默认会把进程ID写入/var/run/redis.pid文件,也可以自定义路径和名字

1
pidfile /var/run/redis.pid

3.3 loglevel

设置redis服务器的日志级别,一共有四个,由低到高分别为:debugverbosenoticewarning,级别越高写到文件中的日志信息越少。

1
loglevel notice

3.4 logfile

设置日志的处理方式:打印到当前终端或者写入到磁盘文件,或者直接丢弃,如果需要经日志信息写入到磁盘可以指定文件的存储路径和名字。

1
2
3
4
5
# 服务器为非守护进程, 日志直接打印到终端
# 服务器为守护进程, 而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null == 数据被丢弃
logfile stdout
logfile "/home/robin/redis.log" # 服务器为守护进程,日志信息被写入到指定的磁盘文件中
logfile "/dev/null" # 服务器为守护进程,日志信息被写入到空设备中 == 数据被丢弃

3.5 databases

设置数据库的数量,默认redis自带16个数据库,数据库的ID分别为【0,1,2,3,…,15】默认使用的数据库为0,可以在客户端使用SELECT <dbid>命令切换当前使用的数据库。

1
databases 16

4. 安全配置 - SECURITY

设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供该密码,默认是关闭的,客户端可以直接连接redis服务器。

1
requirepass hello-dabing

5. 限制配置 - LIMITS

5.1 maxclients

设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息。

1
maxclients 128

5.2 maxmemory

指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。

  • 建议必须设置,否则,将内存占满,造成服务器宕机。
  • 如果设置redis可以使用的内存量,一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
  • 如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。对于无内存申请的指令,仍然会正常响应,比如GET等。
  • 如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是 “不移除” 的情况下,才不用考虑这个因素。
1
maxmemory <bytes>

5.3 maxmemory-policy

当设置的redis内存被写满之后,指定内存数据的移除策略,处理方式有一下六种:

  • volatile-lru:使用LRU(least recently used 最近最少使用)算法移除key,只对设置了过期时间的键;
  • allkeys-lru:在所有集合key中,使用LRU算法移除key
  • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
  • allkeys-random:在所有集合key中,移除随机的key
  • volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
  • noeviction:不进行移除。针对写操作,只是返回错误信息
1
maxmemory-policy noeviction

5.4 maxmemory-samples

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以我们可以设置样本的大小,redis默认会检查设置的N个key,并选择其中最近最少使用(LRU - Least Recently Used)的那个。一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

1
maxmemory-samples 5

6. 持久化设置

6.1 save

设置以rdb方式进行数据持久化的频率(可以设置多个,为互补关系

1
2
3
4
5
6
7
8
# 表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改,满足其中
# 任意一个条件就将内存数据同步到磁盘文件中
save 900 1
save 300 10
save 60 10000

# 关闭 rdb 这种持久化方式
save ""

6.2 rdbcompression

指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

1
rdbcompression yes

6.3 dbfilename

如果使用rdb方式进行数据持久化,指定存储数据的磁盘文件名字,默认值为 dump.rdb

1
dbfilename dump.rdb

6.4 dir

指定持久化过程中存储数据的磁盘文件(rdb and aof)的路径(可以是相对路径也可以是绝对路径),

1
dir ./

6.5 appendonly

开启aof模式进行数据的持久化,默认是关闭的,如需开启,需要将值修改为yes

1
appendonly no

6.6 appendfilename

指定aof模式下,用于存储持久化数据的磁盘文件的名字,默认文件名为 appendonly.aof,存储路径通过dir控制

1
appendfilename appendonly.aof

6.7 appendfsync

指定aof模式下,数据持久化的方式,有三种模式:

  • no:redis不主动进行同步,把同步时机交给操作系统,由系统将数据同步到磁盘
  • always:表示每次更新操作后手动调用fsync()将数据写到磁盘
  • everysec:表示每秒同步一次
1
appendfsync everysec