redis基础之---配置文件(二)

6、redis配置文件

6.1、redis主要配置项

bind 0.0.0.0 # 监听地址,可以用空格隔开后多个监听IP

protected-mode yes #redis3.2之后加入的新特性,在没有设置bind IP 和密码的时候,redis只允许访问127.0.0.1:6379,远程访问将提示警告信息并拒绝访问
也就是在69行 bind 和 500行 requirepass 全部注释掉并且88行 protected-mode设置为yes的情况下只允许本地访问,远端访问会报错如下:

[root@Ansible bin]# ./redis-cli -h 192.168.1.138 -p 6379
192.168.1.138:6379> info
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
192.168.1.138:6379>

不仅仅是报错,还给了4个解决办法:

​ 第一种:通过交互式指令’CONFIG SET protected-mode no’把安全模式关掉,也就是把88行 protected-mode值改为no

​ 第二种:是通过配置文件把88行 protected-mode值改为no

​ 第三种:是通过启动server的时候在后边添加启动选项,–protected-mode no

​ 第四种:设置监听地址或者设置一个认证密码就行,设置一个就可以

port 6379 # 监听端口

tcp-backlog 511 # 三次握手的时候server端接收到client ack确认好之后的队列值。(保持默认值就行)

timeout 0 #客户端(一般是指应用程序,真正的客户端时不会直接连接我们的redis的)和redis服务端的连接超时时间,默认是0,表示永不超时,一般情况下都是0,保持长链接,这样就减少每次连接时三次握手的开销了,也是一种优化方式,有时候如果连接池被撑爆了就需要研发处理下大量空连接的资源,这里边我们也以设置3分钟或者5分钟,参数的值单位是秒,需要做下换算,例如300秒或者600秒,mysql也会出现连接池会被撑爆的情况

tcp-keepalive 300 # tcp 回话保持时间

daemonizen yes # 默认情况下redis不是作为守护进程运行的,如果你想让它后台运行,你就把它改成yes,当redis作为守护进程运行的时候,它会写一个pid到/var/run/redis.pid文件里面

supervised no # 和操作系统相关参数,可以设置通过upstart和systemd管理redis守护进程,centos7以后都是用systemd

pidfile /var/run/redis_6379.pid # pid文件路径

loglevel notice # 日志级别,一共分为4个日志级别,分别为:

​ debug (最高的)

​ verbose

​ notice (默认的)

​ warning (最低的)

logfile “” # 日志路径,这里边我修改日志路径,如下:

vim /usr/local/src/redis/etc/redis.conf
......
171 logfile "/usr/local/src/redis/logs/redis.log"	# 自定义日志路径以及日志名称,如果一台服务器有多个redis实例,则可以通过加端口后缀区分,要与pid中的后缀保持一致
......

**注意:**每次修改完配置文件一定要重启服务!!!

databases 16 # 设置db库数量,默认是16个库,也可以改成其他数,例如改成50个,默认的库是db0,可以通过select进行切换,例如切换到第一个库:select 1;db是在逻辑上区分key的,例如APP1和APP2有相同的key,如果都用1库的话谁后写数据会用谁的value值,先写的会被覆盖掉,就会出现生产事故,所有不同的APP可以用不同的库,这样即使不同的APP key的value值不一样,也不会有问题,因为已经通过db给隔离开了,尽量一个业务用一个库

always-show-log yes # 在动redis时是否显示log,并没有实际意义

200 # save # seconds 秒, 也就是说在多少秒内发生多少次变化就做快照,可以写多个,是兼容的

save 900 1 # 在900秒内有一个键内容发生更改就出快照机制

save 300 1

save 60 10000

只要满足三个中的一个就做一个RDB快照,是或的关系

206 # after 900 sec (15 min) if at least 1 key changed
207 # after 300 sec (5 min) if at least 10 keys changed

stop-writes-on-bgsave-error no # 快照出错时是否禁止redis写入操作,例如磁盘空间已经满了,redis无法把快照存到磁盘中去了,此时,所有应用均无法把数据写入到redis中,如何处理呢,参数默认值是yes,将值改成no即可。

rdbcompression yes # 持久化到RDB文件时,是否压缩,“yes”为压缩,“no”则反之,一般保持默认

dbfilename dump.rdb # 快照文件名

dir ./ #快照文件保存位置

replica-stale-data yes # 当从库同主库失去连接或者复制正在进行,从库有两种运行方式:

​ 1、如果replica-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。

​ 2、如果replica-stale-data设置为no,除去指定的命令之外的任何请求都会返回一个错误 “SYNC with master in progress” 。

replica-read-only yes # 是否设置从库只读

repl-diskless-sync no # 是否使用socket方式复制数据(无盘同步),新slave连接时候需要做数据的全量同步,redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:

​ 1、基于硬盘(disk-backed):master创建一个新进程dump RDB,RDB完成之后由父进程(即进程)传给slave。

​ 2、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过(master的)硬盘。

基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的slave,但是基于socket的话,新slave连接到master之后得逐个同步数据。

在磁盘IO较慢并且网络较快的时候,可以用diskless(yes),否则使用磁盘(no)

repl-disk-sync-delay 30 # diskless复制的延迟时间,设置0为关闭,在延迟时间内连接的新客户端,会一直通过disk方式同步数据,但是一旦复制开始还没有结束之前,master节点不会在接收新slave的复制请求,直到下一次同步开始。

repl-ping-slave-period 10 # slave根据master指定时间进行周期性的PING监测,是master告诉slave过10s向master同步一次,是slave过10s会ping一次master是否存活。为什么不是master ping slave呢?因为slave太多,会消耗master的资源,如果slave有多个就要ping多次,如果是slave ping master的话,只需要ping一次就行了。

repl-timeout 60 # 复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时

repl-disable-tcp-nodelay no # 在socket模式下是否在slave套接字发送SYNC之后禁用TCP_NODELAY,如果选择“yes”,redis将使用更少的TCP包和带宽来向slave发送数据,但这样将使用数据传输到slave上有延迟,linux内核的默认配置会达到40毫秒,如果你选择了“no”,数据传输到slave的延迟会减少但要使用更多的带宽。

repl-backlog-size 512mb # 复制缓冲区内存大小,只有在slave连接之后才分配内存,这个数值是根据公司数据写入量计算的,如果不确定,最大写512M。也就是说当master和slave进行同步数据的时候,如果此时有应用程序进行写数据的话,会卸载缓冲区,当master和slave同步完成后,master在将缓冲区数据发给slave,如果系统给redis分配了8G内存,而这512M不在redis的8G以内包括,单独两块内存,512M是专门给数据同步使用的。redis需要多大内存呢?一般是物理机或者虚拟机1/2的内存。

在这里插入图片描述

repl-backlog-ttl 36000 # 多长时间master没有slave连接,就清空backlog缓冲区。

replica-priority 100 # 当master不可用,sentinel会根据slave的优先级选举一个master,最低的优先级slave,当选master,而slave如果配置成0,永远不会被选举。

requirepass foobared # 设置redis连接密码

rename-command # 重命名一些高危命令,例如我不想让能连到我redis的用户执行 “flushall” 命令,此时我就可以给 “flushall” 重命名一下,如:

# 操作之前执行flushall命令
127.0.0.1:6379> flushall
OK

# 修改配置文件
517 # rename-command CONFIG ""					# 修改之前是被注释掉的
518  rename-command flushall "cleanAlldb"		 # 修改之后

# 修改之后执行flushdb命令
127.0.0.1:6379> flushall
(error) ERR unknown command `flushall`, with args beginning with:

# 但执行重命名后的“别名”就可以
127.0.0.1:6379> cleanAlldb
OK

maxclients 10000 # redis最大连接客户端

maxmemory # 最大内存,单位为bytes字节,8G内存的计算方式8(G)1024(KB)*1024(kbyte),需要注意的是slave的输出缓冲区是不计算在maxmemory内。

通过"info"命令可以查看默认设置的最大内存

[root@redis-server ~]# redis-cli
127.0.0.1:6379> info
......
# Memory
used_memory:903964
used_memory_human:882.78K
used_memory_rss:2232320
used_memory_rss_human:2.13M
used_memory_peak:903964
used_memory_peak_human:882.78K
used_memory_peak_perc:100.12%
used_memory_overhead:902454
used_memory_startup:852816
used_memory_dataset:1510
used_memory_dataset_perc:2.95%
total_system_memory:1927585792
total_system_memory_human:1.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.47
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0

我们可以看到最大内存是 maxmemory:0 ,如果是物理内存是4G,则分出来2G给redis使用,换算成字节为:

G~M 2*1024=2048M

M~KB 2048*1024=2097152

KB~字节(bytes) 2097152*1024=2147483648

修改过之后查看内存

[root@redis-server ~]# redis-cli
127.0.0.1:6379> info
......
# Memory
used_memory:903960
used_memory_human:882.77K
used_memory_rss:2056192
used_memory_rss_human:1.96M
used_memory_peak:903960
used_memory_peak_human:882.77K
used_memory_peak_perc:100.12%
used_memory_overhead:902454
used_memory_startup:852816
used_memory_dataset:1506
used_memory_dataset_perc:2.94%
total_system_memory:1927585792
total_system_memory_human:1.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:1073741824
我们可以看到内存变成了1073741824,因为我的redis主机是2G的内存,所有分出来1G给redis使用

如果redis将分配给它的内存用完后就会写不进入去数据了,系统将报内存已用完

redis使用默认的持久化方式是用的RDB快照

appendonly no # 是否开启AOF日志记录,默认redis使用的是rdb方式持久化,所有这个地方的值是no,这种方式在许多应用中已经足够了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dumpd数据的间隔时间),根据save来策略进行持久化,append only file(aof) 是另一种持久化方式,可以提供更好的持久化特性,redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时redis都会先把这个文件的数据读入内存里,先忽略RDB文件。

appendonly yes # 默认是值 “no”,我们将其改为yes,如下:

# 默认是no,我们改成yes
 674 appendonly yes
 675 
 676 # The name of the append only file (default: "appendonly.aof")
 677 
 # aof文件名是 appendonly.aof ,我们可以自定义
 678 appendfilename "appendonly.aof"

AOF 默认的放置路径是RDB的路径,也就是 /usr/local/src/redis/data

APPendfilename “appendonly.aof” # AOF文件名

修改完保存重启redis,查看aof是否产生

[root@redis-server ~]# ll /usr/local/src/redis/data/
总用量 8
-rw-r--r--. 1 root root 3907 4月  11 12:35 appendonly.aof
-rw-r--r--. 1 root root 1783 4月  11 12:35 dump.rdb

# 查看该文件的类型
[root@redis-server data]# file appendonly.aof
appendonly.aof: ASCII text, with CRLF line terminators
[root@redis-server data]#
可以看到是文本文件

**注意:**生产环境如果对文件不了解的情况下千万不要直接用vim打开,有可能文件太大或者是其他格式的文件会导致服务器异常问题,所以建议用 head 命令打开,或者用file + 文件名查看文件类型,在做处理!

appendfsync everysec # aof持久化策略的配置,no表示不执行fsync,由操作系统保证数据同步到磁盘,always表示每次写入都执行fsync,以保证数据同步到磁盘,everysec表示每秒执行一次fsync,可能会导致丢失1s数据。

no-appendfsync-on-rewrite no # 在aof rewrite期间,是否对aof新纪录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示“不暂缓”,新的aof记录任然会被立即同步,linux的默认fsync策略是30秒,如果为yes可能丢失30秒数据,但由yes性能较好而且会避免出现阻塞因此比较推荐。

auto-aof-rewrite-percentage 100 # 当aof log增长超过指定百分比例时,重写aof文件,如果下边参数写的是64mb,则当文件大小达到128mb的时候会再次重写一次,设置为0表示不自动重写aof日志,重写是为了是aof体积保持最小,但是还可以确保保存最完整的数据。

auto-aof-rewrite-min-size 64mb # 触发aof rewirte的最小文件大小,这个参数是可以修改的

aof-load-truncated yes # 是否加载由于其他原因导致的末尾异常的aof文件(主进程被kill/断电等)

aof-use-rdb-preamble no # redis4.0新增RDB-AOF混合持久化合适,在开始这个功能之后,aof重写产生的文件将同时包含rdb格式的内容和aof格式的内容,其中rdb格式的内容用于记录已有的数据,而aof格式的内存则用于记录最近发生了变化的数据,这样redis就可以同时兼有rdb持久化和aof持久化的优点(既能够快速的生成重写文件,也能够在出现问题时,快速的载入数据)。

lua-time-limit 5000 # lua脚本的最大执行时间,单位为毫秒

cluster-enabled yes # 是否开启集群模式,默认是单机模式

cluster-config-file nodes-6379.conf # 由node节点自动生成的集群配置文件,我们只需要指定个名称就行,如果不指定则生产默认的

dluster-node-timeout 15000 # 集群中node节点连接超时时间,单位是毫秒,这个地方是15秒

cluster-replica-validity-factor 10 # 在执行故障转移的时候可能有些节点和master开一段时间数据比较旧,这些节点就不适用于选举为master,超过这个时间的就不会被进行故障转移,例如:一台master有两个slave,第一个slave在12秒之前和master同步的数据,第二个salve和master8秒之前同步数据,此时master宕机,第一台就不会被选举为master,因为第一台的数据比较旧,单位是秒

cluster-migration-barrier 1 # 集群迁移屏障,一个主节点拥有的至少正常工作的从节点,即如果主节点的slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点,如果是一主一从,当主的挂掉之后从的会代替主的进行应用程序的读写,要保证master至少要有一个从节点,单位是个数

cluster-require-full-coverage no # 集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出现集群槽位补全,那么yes情况下redis集群槽位验证不全就不再对外提供服务,而no则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失),真个redis集群一共有16384个槽位来存储数据,会分摊到所有master节点,slave节点上是没有槽位的,如果master宕机后接管master的slave节点也会接管master的槽位;如果有一共有3个master,每个master有两个slave,假如前两个master的槽位各式5000个,第三个master是6384个,当第三个集群全部挂掉之后(主从都挂了),那么这6384个槽位将会丢失,如果此参数为yes,当整个集群验证槽位不全(此时只有10000个槽位了),则不再对应用程序提供服务了,该成no是不管槽位够不够16384都会对外提供服务,如下图:

在这里插入图片描述

Slow log # 是Redis用来记录查询执行时间的日志系统,slow log保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启slow log而损害Redis的速度。

slowlog-log-slower-than 10000 # 以微秒为单位的慢日志记录,默认是10毫秒,为负数会禁用慢日志,为0会记录每个命令操作。
slowlog-max-len 128 # 记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除

查询慢日志数量:

127.0.0.1:6379> slowlog len
(integer) 3

查询慢日志内容:

# 查询都有哪些慢日志
127.0.0.1:6379> slowlog get
1) 1) (integer) 3
   2) (integer) 1618197739
   3) (integer) 4
   4) 1) "slowlog"
      2) "len"
   5) "127.0.0.1:41102"
   6) ""
2) 1) (integer) 2
   2) (integer) 1618197730
   3) (integer) 21
   4) 1) "get"
      2) "key1"
   5) "127.0.0.1:41102"
   6) ""
3) 1) (integer) 1
   2) (integer) 1618197725
   3) (integer) 26
   4) 1) "set"
      2) "key1"
      3) "1"
......

清空慢日志记录:

127.0.0.1:6379> slowlog reset
OK

**说明:**笔记是参考马哥视频整理出来的,如有侵权请联系删除!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值