一、发布与订阅
订阅者(subscribe)-------> 发布者(publish) <----订阅者(subscribe)
发布:
PUBLISH chan(通道)
示例:
PUBLISH foot duck
订阅:
SUBSCRIBE chan(通道)
示例:
SUBSCRIBE foot
批量订阅:
PSUBSCRIBE chan(通道,可以使用通配符:*)
示例:
PSUBSCRIBE foot*
虽然REDIS可以做类似MQ的事情,但是不建议使用。
二、redis的持久化处理
redis的持久化处理有以下两种模式:
RDB
RDB:每隔一段时间,把内存中的数据写入磁盘的临时文件,作为快照,回复的时候把快照文件读进内存。如果宕机重启,那么内存里的数据肯定会没有的,那么再次启动redis后,则会恢复。默认模式。
优势:
- 使用快照模式,每隔一段时间全量备份。备份的文件为一个单文件。
- 容灾简单,可远程传输。
- 子进程备份的时候,主进程不会有任何io操作(不会有写入修改或删除),保证备份数据的完整。
缺点:
- 发生故障时,有可能会丢失最后一次的备份数据。
- 子进程所占用的内存比会和父进程一模一样,如会造成CPU负担。
- 由于定时全量备份是重量级操作,所以对于实时备份,就无法处理了。
在redis.conf 中的配置
<!-- 保存时间 -->
<!-- 表示15分钟内至少发生过1次变动,则15分钟后会进行一次备份 -->
save 900 1
<!-- 表示5分钟内至少发生过10次变动,则5分钟后会进行一次备份 -->
save 300 10
<!-- 表示1分钟内至少发生过10000次变动,则1分钟后会进行一次备份 -->
save 60 10000
<!-- 备份过程中出现错误则停止备份,默认yes,为no时可能造成数据的不一致 -->
stop-writes-on-bgsave-error yes
<!-- 是否压缩(LZF格式),如果想要降低CPU的损耗,可以设置为no,但是此时备份的数据会比较大 -->
rdbcompression yes
<!-- 校验数据 -->
rdbchecksum yes
<!-- 备份的文件名 -->
dbfilename dump.rdb
<!-- 备份的文件路径 -->
dir /usr/local/redis/working
AOF
全称: APPEND ONLY MODEL
在redis.conf 中的配置
<!-- 默认关闭 -->
appendonly yes
<!-- 备份文件名称 -->
appendfilename "appendonly.aof"
<!-- 策略,有以下三种 -->
<!-- 针对每一次写入操作都会进行备份 -->
# appendfsync always
<!-- 每一秒钟进行一次备份,默认 -->
appendfsync ererysec
<!-- 关闭 -->
#appendfsync no
<!-- 当重写的时候不做同步,默认为no -->
no-appendfsync-on-rewrite no
<!-- -->
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
可以同时使用两种模式,默认先加载的是AOF文件,如果AOF出现问题,才会去加载RDB文件,这种做法也称为冷热备份。
三、主从架构
主:master,只能有一个,写处理。
从:slave,可以多个,读处理。在slave节点进行写操作,会报错误
主从就是读写分离。水平扩展,可以通过增加服务器以提升并发量。
数据同步的过程:
-
slave服务器第一次启动时,会ping一次master服务器,master服务器会把RDB文件通过硬盘复制提交给slave服务器的硬盘,以用于数据的同步。
-
第一次之后,每当master服务器接收到新的写操作时,都会提交给slave服务器,以完成数据同步。
-
slave服务器重启后,会加载RDB中保存的数据,同时与master服务器缺失的数据,master服务器会同步给slave。
注意:必须开通master服务器的持久化机制。否则,master服务器重启,会删除所有slave服务器的数据。
主从配置:
<!-- 进入到redis-cli,查询节点信息 -->
info replication
<!-- 在redis.conf中搜索REPLICATION -->
<!-- masterip:主节点ip masterport:主节点端口 -->
replicaof <masterip> <masterport>
<!-- 设置主节点的密码 -->
masterauth <master-password>
<!-- 默认配置,表示从节点是只读的,不处理写操作 -->
replica-read-only yes
无磁盘化复制
如果磁盘是机械硬盘,那么主从磁盘复制的效率会比较低,那么此时就可以使用无磁盘华复制的方式。
目前无磁盘化复制,使用的是socket方式,但是是处于试验阶段,不建议在生产环境中使用。
<!-- 在redis.conf中搜索diskless -->
<!-- 无磁盘化复制的开关,默认关闭 -->
repl-diskless-sync no
<!-- 无磁盘化复制的等待时间,默认5秒 -->
repl-diskless-sync-delay 5
网友评论