Redis进阶
Redis.conf解析
Redis.conf是我们开启Redis服务器时使用的配置文件,关于Redis大多数设置都需要在配置文件中进行。
下面分析配置文件的常用的一些设置:
单位换算
includes 引入外部配置
NETWORK 网络相关配置——常用
################################## NETWORK #####################################
# 这里一些官方注释省略了... ...
bind 192.168.37.100 # bind可以设置可以访问的ip(这里表示可以通过192.168.37.100来访问)
# ... ...
protected-mode yes # 是否开启保护模式
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379 # 设置服务开启的端口
# 其他的配置一般使用默认配置即可
GENERAL 通用配置
################################# GENERAL #####################################
# ... ...
daemonize yes # 是否以守护进程方式运行,默认为no,需要手动开启,让redis可以在后台运行
pidfile /var/run/redis_6379.pid # 指定一个pid的文件路径
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice # 设置日志级别
logfile "" # 日志文件的存放位置与文件名
databases 16 # 数据库的数量 默认为16
always-show-logo yes # 是否总是显示Redis的Logo
SNAPSHOTTING 快照
就是进行持久化操作,因为Redis时存储在内存的,如果不进行持久化,一旦断电数据就会全部丢失
################################ SNAPSHOTTING ################################
save 900 1 # 900s内至少1个key被修改,就进行持久化
save 300 10 # 300s内至少300个key被修改,就进行持久化
save 60 10000 # 60s内至少10000个key被修改,就进行持久化
stop-writes-on-bgsave-error yes # 持久化出错时是否还要继续运行redis服务
rdbcompression yes # 是否压缩rdb文件,会消耗一些CPU的资源
rdbchecksum yes # 保存rdb文件时是否进行错误检验
# The filename where to dump the DB
dbfilename dump.rdb # 设置rdb文件名
dir ./ # rdb文件保存路径
REPLICATION 复制(主从复制)
SECURITY 安全策略
可以在配置文件设置redis密码,但是一般会在命令中设置:
192.168.37.100:6379> config get requirepass # config get requirepass得到redis的密码
1) "requirepass"
2) ""
192.168.37.100:6379> config set requirepass "123456" # set requirepass设置redis密码
OK
192.168.37.100:6379> ping # 可以发现设置密码后无法直接ping了
(error) NOAUTH Authentication required.
192.168.37.100:6379> auth 123456 # auth + 密码可以进行登录
OK
192.168.37.100:6379> config get requirepass # 此时可以查看密码,发现是之前设置的
1) "requirepass"
2) "123456"
192.168.37.100:6379> config set requirepass "" # set "" 可以重新将密码删去
OK
192.168.37.100:6379> ping
PONG
192.168.37.100:6379> config get requirepass
1) "requirepass"
2) ""
CLIENTS 客户端配置
MEMORY MANAGEMENT 内存管理
# maxmemory <bytes> # 给redis配置的最大内存容量
# maxmemory-policy noeviction # 内存到达上限后进行的操作方式
APPEND ONLY MODE AOF配置
appendonly no # aof是否开启(默认关闭)
appendfilename "appendonly.aof" # 持久化的文件名
# 下面是持久化的方式
# appendfsync always # 每次修改都会更新,比较消耗性能
appendfsync everysec # 每秒执行一次更新,可能丢失这一秒的数据
# appendfsync no # 不执行更新,此时操作系统自己同步数据,速度最快
Redis持久化⭐
Redis由于是存储在内存的数据库,因此如果不进行持久化操作将数据保存到硬盘上,一旦断电,数据库中的数据就会全部消失。
Redis持久化的两种方式:
一、RDB(Redis DataBase)
将当前进程数据生成快照以二进制的方式保存到硬盘;
当进行恢复的时候,就把保存的快照重新读回内存;
RDB中Redis会单独创建一个子进程来进行持久化,子进程先将数据写入到一个临时文件中,等持久化结束后,用这个临时文件替换上次持久化好的文件。期间主进程不进行任何IO操作,因此确保了性能。
特点
-
适合大规模的数据恢复(占用空间少)
-
适合对数据完整性要求不高的(因为最后一次持久化出错时数据可能会丢失)
相关配置在配置文件SNAPSHOTTING 区域中配置
################################ SNAPSHOTTING ################################
save 900 1 # 900s内至少1个key被修改,就进行持久化
save 300 10 # 300s内至少300个key被修改,就进行持久化
save 60 10000 # 60s内至少10000个key被修改,就进行持久化
stop-writes-on-bgsave-error yes # 持久化出错时是否还要继续运行redis服务
rdbcompression yes # 是否压缩rdb文件,会消耗一些CPU的资源
rdbchecksum yes # 保存rdb文件时是否进行错误检验
dbfilename dump.rdb # 设置rdb文件名
dir ./ # rdb文件保存路径
二、AOF(Append Only File)
AOF是将我们所有的命令都记录下来(不包括查询的命令),恢复时就相当于通过保存的文件把所有命令再执行一遍。
再Append Only Model中配置:
appendonly no # aof是否开启(默认关闭)
appendfilename "appendonly.aof" # 持久化的文件名
# 下面是持久化的方式
# appendfsync always # 每次修改都会更新,比较消耗性能
appendfsync everysec # 每秒执行一次更新,可能丢失这一秒的数据
# appendfsync no # 不执行更新,此时操作系统自己同步数据,速度最快
当然因为保存的是命令,因此AOF进行持久化会比较消耗存储,一般我们都使用RDB方式。
修复持久化文件
可以通过redis-check-aof/rdb --fix + 文件名
对两种持久化文件进行修复。
消息订阅
Redis发布订阅是一种消息通信模式——发送者发送消息,订阅者就会接收消息。
类似微信公众号发送文章,关注者就会收到文章。
命令汇总
命令 | 具体写法 | 作用 |
---|---|---|
SUBSCRIBE | SUBSCRIBE [channel] [channel]… … | 订阅一个或多个频道的信息 |
PUBLISH | PUBLISH [channel] [message] | 将消息发送到指定的频道 |
用例
# ①订阅者订阅频道:
192.168.37.100:6379> SUBSCRIBE mychannel # 开始订阅频道mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# ②此时操作发布者发布消息:
192.168.37.100:6379> PUBLISH mychannel hello # 发布消息到频道mychannel
(integer) 1
192.168.37.100:6379> PUBLISH mychannel nihao
(integer) 1
# ③此时观察订阅者:
192.168.37.100:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
1) "message" # message表示发送来消息
2) "mychannel" # 提示频道信息
3) "hello" # 发送的消息内容
1) "message"
2) "mychannel"
3) "nihao"
主从复制
简介
主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者是主节点(master),后者是从节点(slave),并且数据的复制是单向的,只能由主节点到从节点,Master主要用来进行写操作,Slave节点用来读操作。
想要实现主从复制,至少需要三个服务器开启(一个主服务器,两个从服务器)。因此需要复制并修改三个redis的配置文件,让三个服务器分别用三个配置文件来启动。
需要修改的内容: 1、端口port; 2、pid名字; 3、log文件名; 4、dump.rdb名字。
例如:
#主服务器:
port 6379
# ... ...
pidfile /var/run/redis_6379.pid
# ... ...
logfile "6379.log"
# ... ...
dbfilename dump6379.rdb
#从服务器1:
port 6380
# ... ...
pidfile /var/run/redis_6380.pid
# ... ...
logfile "6380.log"
# ... ...
dbfilename dump6380.rdb
#从服务器2:
port 6381
# ... ...
pidfile /var/run/redis_6381.pid
# ... ...
logfile "6381.log"
# ... ...
dbfilename dump6381.rdb
基础的一主二从服务器设置:
主服务器一般不用进行多余设置,需要设置的是从服务器
# 主服务器:6379端口
[root@localhost bin]# redis-server myconfig/redis6379.conf # 启动主服务器,使用redis6379.conf配置文件
[root@localhost bin]# redis-cli -h 192.168.37.100 -p 6379
192.168.37.100:6379> info replication # 查看主从信息
# Replication
role:master # 角色为主人
connected_slaves:2 # 有两个从服务器
slave0:ip=192.168.37.100,port=6380,state=online,offset=56,lag=1 # 从服务器信息
slave1:ip=192.168.37.100,port=6381,state=online,offset=56,lag=1 # 从服务器信息
master_replid:9305db612978ac32e79cde2a6e81d99c3b0ac9ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
# 从服务器1:6380端口
[root@localhost bin]# redis-server myconfig/redis6380.conf # 启动从服务器,使用配置文件
[root@localhost bin]# redis-cli -h 192.168.37.100 -p 6380
192.168.37.100:6380> SLAVEOF 192.168.37.100 6379 # SLAVEOF命令将自己作为目标的从服务器
OK
192.168.37.100:6380> info replication # 查看主从信息
# Replication
role:slave # 角色为从服务器
master_host:192.168.37.100 # 主服务器信息
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9305db612978ac32e79cde2a6e81d99c3b0ac9ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
# 从服务器2:6381端口,与从服务器1类似
[root@localhost bin]# redis-server myconfig/redis6381.conf
[root@localhost bin]# redis-cli -h 192.168.37.100 -p 6381
192.168.37.100:6381> SLAVEOF 192.168.37.100 6379
OK
192.168.37.100:6381> info replication
# Replication
role:slave
master_host:192.168.37.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9305db612978ac32e79cde2a6e81d99c3b0ac9ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:28
手动由从服务器升级成主服务器:
通过命令slaveof no one
让自己成为主服务器,其他从服务器可以更换主服务器为当前服务器。
全量赋值与增量复制
Slave 启动成功连接到 master 后会发送一个sync同步命令
Master 收到命令会启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行
完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:slave服务器在收到数据库文件的数据后,将其存盘并加载到内存中。
增量复制:master继续将新的数据传给slave,完成同步
哨兵模式⭐
哨兵模式就是在主服务器宕机后自动选举主服务器的一种模式。
使用传统的主从复制模式来保证Redis的安全运行时,如果发生主服务器宕机的情况,需要手动去设置新的主服务器,修改从服务器的主人,这样手动操作是十分麻烦的,因此需要用到哨兵模式进行自动选举主服务器。
哨兵通过发送命令,让监控的Redis服务器返回自身状态,如果检测到主服务器宕机了,就会对一个从服务器进行升级为主服务器(如果是多哨兵模式,则需要通知其他哨兵服务器,进行投票选举主服务器,并且多哨兵模式下,各个哨兵之间也会互相监控)然后发布订阅模式,通知其他从服务器切换自己的主机。
启动哨兵
这里以单哨兵监控主服务器为例
创建哨兵的配置文件
[root@localhost bin]# vi myconfig/sentinel.conf
格式为sentinel monitor 自定义名字 ip port 1
启动三个redis服务器:
[root@localhost bin]# redis-server myconfig/redis6379.conf
[root@localhost bin]# redis-server myconfig/redis6380.conf
[root@localhost bin]# redis-server myconfig/redis6381.conf
[root@localhost bin]# ps -ef | grep redis
root 1444 1 0 11:24 ? 00:00:00 redis-server 192.168.37.100:6379
root 1449 1 0 11:24 ? 00:00:00 redis-server 192.168.37.100:6380
root 1454 1 1 11:24 ? 00:00:00 redis-server 192.168.37.100:6381
root 1459 1317 0 11:24 pts/0 00:00:00 grep --color=auto redi
配置6379端口的redis为主服务器,其他两个为从服务器,过程同上,完成后效果:
此时启动哨兵:
[root@localhost bin]# redis-sentinel myconfig/sentinel.conf
此时模拟主服务器宕机(这里手动shutdown)
查看两台原本的从服务器的状态,可以发现6381端口的服务器变成了主服务器,6380端口的服务器称为了他的从服务器。
并且,当原先的主服务器(6379)再次启动的时候,他不会再成为主服务器,而是作为现在的主服务器的从服务器存在。