美文网首页
Java学习笔记--Redis的发布与订阅

Java学习笔记--Redis的发布与订阅

作者: Allens_Lee | 来源:发表于2020-10-26 10:00 被阅读0次

一、发布与订阅

订阅者(subscribe)-------> 发布者(publish) <----订阅者(subscribe)

发布:

PUBLISH chan(通道)

示例:
PUBLISH foot duck

订阅:

SUBSCRIBE chan(通道)

示例:
SUBSCRIBE foot

批量订阅:

PSUBSCRIBE chan(通道,可以使用通配符:*)

示例:
PSUBSCRIBE foot*

虽然REDIS可以做类似MQ的事情,但是不建议使用。

二、redis的持久化处理

redis的持久化处理有以下两种模式:

RDB

RDB:每隔一段时间,把内存中的数据写入磁盘的临时文件,作为快照,回复的时候把快照文件读进内存。如果宕机重启,那么内存里的数据肯定会没有的,那么再次启动redis后,则会恢复。默认模式。

优势:
  1. 使用快照模式,每隔一段时间全量备份。备份的文件为一个单文件。
  2. 容灾简单,可远程传输。
  3. 子进程备份的时候,主进程不会有任何io操作(不会有写入修改或删除),保证备份数据的完整。
缺点:
  1. 发生故障时,有可能会丢失最后一次的备份数据。
  2. 子进程所占用的内存比会和父进程一模一样,如会造成CPU负担。
  3. 由于定时全量备份是重量级操作,所以对于实时备份,就无法处理了。
在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节点进行写操作,会报错误

主从就是读写分离。水平扩展,可以通过增加服务器以提升并发量。

数据同步的过程:
  1. slave服务器第一次启动时,会ping一次master服务器,master服务器会把RDB文件通过硬盘复制提交给slave服务器的硬盘,以用于数据的同步。

  2. 第一次之后,每当master服务器接收到新的写操作时,都会提交给slave服务器,以完成数据同步。

  3. 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

相关文章

网友评论

      本文标题:Java学习笔记--Redis的发布与订阅

      本文链接:https://www.haomeiwen.com/subject/vqfamktx.html