我们启动redis服务器的时候,经常要指定配置文件以便加载文件中的配置项,这个配置文件叫做redis.conf
,如果是源码安装,配置文件被存放在源码安装包目录里边,如下图:
在这个配置文件redis.conf
中有很多的配置项,并且redis配置文件中对内存大小单位不区分大小写
,并且使用的时候要注意:k != kb
,m!=mb
,g!=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.
|
下面介绍一些项目开发过程中常用的一些配置项:
- include 包含 {#1-include-包含} =============================
指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件,总结一句话:多实例的情况可以把公用的配置提取出来,作为公共配置文件来使用。
|-----------|-------------------------------------|
| 1
| include /path/to/local.conf
|
- 网络配置 - NETWORK {#2-网络配置-NETWORK} ===================================
2.1 bind {#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 {#2-2-protected-mode}
设置保护模式,如果保护模式为yes
,非本机客户端无法连接到redis服务器,如需连接需要设置为no
|-----------|----------------------------|
| 1
| protected-mode yes
|
2.3 port {#2-3-port}
指定Redis监听端口,默认端口为6379
(作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为在手机按键上6379对应的字母为MERZ,而MERZ取自意大利女歌手Alessia Merz的名字)
|-----------|-------------------|
| 1
| port 6379
|
2.4 tcp-backlog {#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 {#2-5-timeout}
指定当客户端闲置多长时间后(单位:秒)断开连接,如果指定为0,表示关闭该功能,不自动断开连接
|-----------|-------------------|
| 1
| timeout 0
|
2.6 tcp-keepalive {#2-6-tcp-keepalive}
对已经连接的客户端进行心跳检测,每隔N秒检测一次,如果设置为0,则不会进行Keepalive检测,建议设置成60
|-----------|--------------------------|
| 1
| tcp-keepalive 60
|
- 通用配置 - GENERAL {#3-通用配置-GENERAL} ===================================
3.1 daemonize {#3-1-daemonize}
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,设置为yes
以守护进程方式后台启动
|-----------|----------------------|
| 1
| daemonize no
|
3.2 pidfile {#3-2-pidfile}
当Redis以守护进程方式运行时,Redis默认会把进程ID写入/var/run/redis.pid
文件,也可以自定义路径和名字
|-----------|------------------------------------|
| 1
| pidfile /var/run/redis.pid
|
3.3 loglevel {#3-3-loglevel}
设置redis服务器的日志级别,一共有四个,由低到高分别为:debug
、verbose
、notice
、warning
,级别越高写到文件中的日志信息越少。
|-----------|-------------------------|
| 1
| loglevel notice
|
3.4 logfile {#3-4-logfile}
设置日志的处理方式:打印到当前终端或者写入到磁盘文件,或者直接丢弃,如果需要经日志信息写入到磁盘可以指定文件的存储路径和名字。
|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5
| # 服务器为非守护进程, 日志直接打印到终端 # 服务器为守护进程, 而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null == 数据被丢弃 logfile stdout logfile "/home/robin/redis.log" # 服务器为守护进程,日志信息被写入到指定的磁盘文件中 logfile "/dev/null" # 服务器为守护进程,日志信息被写入到空设备中 == 数据被丢弃
|
3.5 databases {#3-5-databases}
设置数据库的数量,默认redis自带16个数据库,数据库的ID分别为【0,1,2,3,...,15】默认使用的数据库为0,可以在客户端使用SELECT <dbid>
命令切换当前使用的数据库。
|-----------|----------------------|
| 1
| databases 16
|
- 安全配置 - SECURITY {#4-安全配置-SECURITY} =====================================
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供该密码,默认是关闭的,客户端可以直接连接redis服务器。
|-----------|----------------------------------|
| 1
| requirepass hello-dabing
|
- 限制配置 - LIMITS {#5-限制配置-LIMITS} =================================
5.1 maxclients {#5-1-maxclients}
设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。
当客户端连接数到达限制时
,Redis会关闭新的连接并向客户端返回 max number of clients reached
错误信息。
|-----------|------------------------|
| 1
| maxclients 128
|
5.2 maxmemory {#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 {#5-3-maxmemory-policy}
当设置的redis内存被写满之后,指定内存数据的移除策略,处理方式有一下六种:
volatile-lru
:使用LRU(least recently used 最近最少使用
)算法移除key,只对设置了过期时间的键;allkeys-lru
:在所有集合key中,使用LRU算法移除keyvolatile-random
:在过期集合中移除随机的key,只对设置了过期时间的键allkeys-random
:在所有集合key中,移除随机的keyvolatile-ttl
:移除那些TTL值最小的key,即那些最近要过期的keynoeviction
:不进行移除。针对写操作,只是返回错误信息
|-----------|-------------------------------------|
| 1
| maxmemory-policy noeviction
|
5.4 maxmemory-samples {#5-4-maxmemory-samples}
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以我们可以设置样本的大小,redis默认会检查设置的N个key,并选择其中最近最少使用(LRU - Least Recently Used)的那个。一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。
|-----------|-----------------------------|
| 1
| maxmemory-samples 5
|
- 持久化设置 {#6-持久化设置} ===================
6.1 save {#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 {#6-2-rdbcompression}
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
|-----------|----------------------------|
| 1
| rdbcompression yes
|
6.3 dbfilename {#6-3-dbfilename}
如果使用rdb方式进行数据持久化,指定存储数据的磁盘文件名字,默认值为 dump.rdb
|-----------|-----------------------------|
| 1
| dbfilename dump.rdb
|
6.4 dir {#6-4-dir}
指定持久化过程中存储数据的磁盘文件(rdb and aof)的路径(可以是相对路径
也可以是绝对路径
),
|-----------|----------------|
| 1
| dir ./
|
6.5 appendonly {#6-5-appendonly}
开启aof
模式进行数据的持久化,默认是关闭的,如需开启,需要将值修改为yes
|-----------|-----------------------|
| 1
| appendonly no
|
6.6 appendfilename {#6-6-appendfilename}
指定aof
模式下,用于存储持久化数据的磁盘文件的名字,默认文件名为 appendonly.aof
,存储路径通过dir
控制
|-----------|---------------------------------------|
| 1
| appendfilename appendonly.aof
|
6.7 appendfsync {#6-7-appendfsync}
指定aof
模式下,数据持久化的方式,有三种模式:
no
:redis不主动进行同步,把同步时机交给操作系统,由系统将数据同步到磁盘always
:表示每次更新操作后手动调用fsync()将数据写到磁盘everysec
:表示每秒同步一次
|-----------|------------------------------|
| 1
| appendfsync everysec
|