1、总览

redis - 图1

2、redis_conf 说明

  1. 参数说明
  2. redis.conf 配置项说明如下:
  3. 0.protected-mode yes
  4. # 是否开启保护模式,默认开启,要是配置里面没有指定bind和密码,开启该参数后,redis只会本地进行访问, 拒绝外部访问,要是开启了密码和bind,可以开启,否则最好关闭,设置为no
  5. 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
  6. daemonize no
  7. 2. Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
  8. pidfile /var/run/redis.pid
  9. 3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
  10. port 6379
  11. 4. 绑定的主机地址
  12. bind 127.0.0.1
  13. 5. 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
  14. timeout 300
  15. 6. 指定日志记录级别,Redis总共支持四个级别:debugverbosenoticewarning,默认为verbose
  16. loglevel verbose
  17. 7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
  18. logfile stdout
  19. 8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
  20. databases 16
  21. 9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
  22. save <seconds> <changes>
  23. Redis默认配置文件中提供了三个条件:
  24. save 900 1
  25. save 300 10
  26. save 60 10000
  27. 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
  28. stop-writes-on-bgsave-error yes
  29. # 在出现错误的时候,是否要停止保存
  30. 10. 指定存储至本地数据库时是否压缩数据,默认为yesRedis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
  31. rdbcompression yes
  32. 11. 指定本地数据库文件名,默认值为dump.rdb
  33. dbfilename dump.rdb
  34. 12. 指定本地数据库存放目录
  35. dir ./
  36. 13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
  37. replicaof <masterip> <masterport>
  38. replica-serve-stale-data yes
  39. # 当从库同主机失去连接或者复制正在进行,从库有两种运行方式 (1)、默认yes,从库会继续相应客户端的请求 (2)、no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress"
  40. replica-read-only yes
  41. # yes开启从库只读
  42. 14. master服务设置了密码保护时,slav服务连接master的密码
  43. masterauth <master-password>
  44. 15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
  45. requirepass foobared
  46. 16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
  47. maxclients 128
  48. 17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap
  49. maxmemory <bytes>
  50. 18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
  51. appendonly no
  52. 19. 指定更新日志文件名,默认为appendonly.aof
  53. appendfilename appendonly.aof
  54. 20. 指定更新日志条件,共有3个可选值:
  55. no:表示等操作系统进行数据缓存同步到磁盘(快)
  56. always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
  57. everysec:表示每秒同步一次(折衷,默认值)
  58. appendfsync everysec
  59. 21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析RedisVM机制)
  60. vm-enabled no
  61. 22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
  62. vm-swap-file /tmp/redis.swap
  63. 23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
  64. vm-max-memory 0
  65. 24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
  66. vm-page-size 32
  67. 25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8pages将消耗1byte的内存。
  68. vm-pages 134217728
  69. 26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
  70. vm-max-threads 4
  71. 27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
  72. glueoutputbuf yes
  73. 28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
  74. hash-max-zipmap-entries 64
  75. hash-max-zipmap-value 512
  76. 29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
  77. activerehashing yes
  78. 30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
  79. include /path/to/local.conf
  80. 31.重启redis恢复数据集时,很少会使用rdb来恢复内存状态,因为会丢失大量数据。通常会使用aof日志恢复数据,但是重放aof日志性能相对rdb来说要慢很多,这样在redis实例很大的情况下,启动需要花费很长时间。Redis4.0为了解决这个问题,带来了新的持久化选项——混合持久化。
  81. aof-use-rdb-preamble yes
  82. 如果开启了混合持久化,aof在重写时,不再是单纯将内存数据转换为RESP命令写入aof文件,而是将重写这一刻之前的内存做rdb快照处理,并且将rdb快照内容和增量的aof修改内存数据的命令存在一起,都写入新的aof文件,新的aof文件一开始不叫appendonly.aof,等到重写完成后,新的aof文件才会进行改名,原子的覆盖原有的aof文件,完成新旧两个aof文件的替换。于是在redis重启的时候,可以先加载rdb文件,然后再重放增量的aof日志就可以完全替代之前的aof全量文件重放,因此重启效率大幅得到提高
  83. 32.
  84. aof-rewrite-incremental-fsync yes
  85. # 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
  86. 33 tcp-backlog 511
  87. # 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,此值必须不大于linux系统定义的 /proc/sys/net/core/somaxconn值,默认是511,而linux的默认参数值是128,当系统并发量并且客户端 速度缓慢的时候,可以将这两个参数一起参考设定,该内核参数默认值一般是128,对于负载很大的程序来说 不能满足,一般会将它修改为2048或者更大,在/etc/sysctl.conf中添加:net.core.somaxconn=2048,然后 使用:sysctl -p使该设定生效
  88. 34
  89. tcp-keepalive 300
  90. # 如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。 降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中, 设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
  91. repl-diskless-sync no
  92. # 是否使用socket方式复制数据,目前redis复制提供两种凡是,disk和socket,如果新的slave连上来或者重连的slave 无法部分同步,就会执行全量同步,master会生成rdb文件,有两种方式: (1)、disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传送给slave (2)、socket是master创建一个新的进程,直接把rdb文件以socket的方式给slave disk方式的时候当一个rdb保存的过程中,多个slave都能共享这个rdb文件,socket的方式就是一个个slave顺序复制 在磁盘速度缓慢,网速快的情况下建议使用socket方式
  93. repl-diskless-sync-delay 5
  94. # diskless复制的延迟时间,防止设置为0,一旦开始复制,节点不会再接受新的slave的复制请求,直到下一个rdb传输, 所以最好等待一段时间,等更多的slave连上来
  95. repl-disable-tcp-nodelay no
  96. # 是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes 来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。 默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。