Java真的不难(四十九)Redis的入门及使用(2)

上一篇文章对Redis的安装、启动、数据结构做了一些介绍,通过练习可以了解Redis对数据的存储方法,现在我们将继续学习Redis!

一、Redis 发布订阅

Redis 发布订阅就是一种消息通信模式,发送者 发送消息,订阅者接收消息
而且Redis 客户端可以订阅任意数量的频道:

如下图:
频道A ,以及订阅这个频道的三个客户端1、客户端2、客户端3
在这里插入图片描述
当有新消息通过 PUBLISH 命令发送给频道A时, 这个消息就会被发送给订阅它的三个客户端:
在这里插入图片描述
理论完成,上手:
我们需要开启两个 redis-cli 客户端:redis-cli.exe -h 127.0.0.1 -p 6379
首先在第一个客户端:
按照上图中来取名创建订阅频道名为A
指令:SUBSCRIBE A
在这里插入图片描述
重新开启个 redis 客户端,然后在频道内发布消息:
指令: PUBLISH A "Hello Redis"

在这里插入图片描述

然后打开第一个客户端就会发现:
在这里插入图片描述
在第二个客户端发送的消息在第一个客户端内已经接收到

其他Redis 发布订阅命令:
订阅一个或多个符合给定模式的频道: PSUBSCRIBE pattern [pattern ...]
查看订阅与发布系统状态:PUBSUB subcommand [argument [argument ...]]
将信息发送到指定的频道:PUBLISH channel message
退订所有给定模式的频道:PUNSUBSCRIBE [pattern [pattern ...]]
订阅给定的一个或多个频道的信息: SUBSCRIBE channel [channel ...]
指退订给定的频道:UNSUBSCRIBE [channel [channel ...]]


二、Redis 事务

事务相信大家都不陌生,那么一起来看看Redis的事务吧
Redis 事务可以一次执行多个命令,且有三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中

一个事务从开始到执行会经历以下三个阶段: 开始事务、命令入队、执行事务

一起来试试:
启动一个客户端,先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务:
在这里插入图片描述
注意: 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的

也就是批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做

其他Redis 事务命令:
取消事务:DISCARD
执行所有事务块内的命令: EXEC
标记一个事务块的开始: MULTI
取消 WATCH 命令对所有 key 的监视: UNWATCH
监视一个或多个key,若在事务执行之前这些key 被其他命令所改动,那么事务将被打断: WATCH key [key ...]


三、Redis 服务器

Redis 服务器命令主要是用于管理 redis 服务的
启动客户端,输入INFO 获取 redis 服务器的统计信息:
在这里插入图片描述
获取连接到服务器的客户端连接列表:CLIENT LIST
在这里插入图片描述

Redis 服务器的相关命令:
在后台异步保存当前数据库的数据到磁盘: BGSAVE
关闭客户端连接:CLIENT KILL [ip:port] [ID client-id]
获取连接的名称: CLIENT GETNAME
在指定时间内终止运行来自客户端的命令: CLIENT PAUSE timeout
获取 Redis 命令详情数组:COMMAND
获取 Redis 命令总数: COMMAND COUNT (我试过了,是172条)
返回当前服务器时间: TIME
获取指定配置参数的值:CONFIG GET parameter
修改 redis 配置参数,无需重启:CONFIG SET parameter value
返回当前数据库的 key 的数量:DEBUG OBJECT key
删除所有数据库的所有key:FLUSHALL
删除当前数据库的所有key:FLUSHDB
获取 Redis 服务器的各种信息和统计数值: INFO [section]
同步保存数据到硬盘:SAVE

这里就不写全部了,大家根据所需自行查阅即可!


四、Redis GEO

什么是GEO?
GEO:Geographic 地理位置

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在Redis 3.2 版本新增的

Redis GEO 操作方法有:
添加地理位置的坐标:geoadd
获取地理位置的坐标:geopos
计算两个位置之间的距离:geodist
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合:georadius
根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合:georadiusbymember
返回一个或多个位置对象的 geohash 值:geohash


上手:
在Redis内存入北京和上海的经纬度信息:
附上经纬度查询网址:https://jingweidu.bmcx.com/
北京:116.23128,40.22077
上海:121.48941,31.40527
在这里插入图片描述
下面geodist city beijing shanghai km 指令为计算两个经纬度直接的距离
单位可以是m、km、ml、ft

返回所有指定名称的位置信息: geopos city beijing shanghai

在这里插入图片描述
关于GEO其他的功能大家可以自己去试试啦


五、Redis Stream

Redis Stream主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

也就是发布订阅可以分发消息,但无法记录历史消息
Redis Stream 是 Redis 5.0 版本新增加的数据结构
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失(偷个懒,复制网上的嘻嘻嘻)

消息队列:
我们可以再来理解一下消息队列
简而言之,消息队列就是在消息的传输过程中保存消息的容器

消息是在两台计算机间传送的数据单位,比如A和B两台计算机,在AB直接有个容器X,所以传递流程是这样的:A—X—B,如果B因为一些原因不能接收到A传过来的信息,那么消息队列X会保留消息,直到可以成功地传递它。

所以我们在使用消息队列时,希望它具备以下功能:

  1. 支持阻塞等待拉取消息
  2. 支持发布 / 订阅模式
  3. 消费失败,可重新消费,消息不丢失
  4. 实例宕机,消息不丢失,数据可持久化
  5. 消息可堆积

Redis Stream 的结构可以参考以下图,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容(参考互联网):
在这里插入图片描述
其实每个 Stream 都有唯一的名称,就是 Redis 的 key,在我们首次使用 XADD指令追加消息时就会自动创建

例图解释:
Consumer Group : 消费组,使用 XGROUP CREATE 命令创建,一个消费组有多个消费者
last_delivered_id : 游标,每个消费组会有个游标,任意一个消费者读取了消息都会使游标往前移动
pending_ids : 消费者的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有ack 。

消息队列相关命令:
添加消息到末尾:XADD
对流进行修剪,限制长度:XTRIM
删除消息:XDEL
获取流包含的元素数量,即消息长度:XLEN
获取消息列表,会自动过滤已经删除的消息:XRANGE
反向获取消息列表,ID 从大到小:XREVRANGE
以阻塞或非阻塞方式获取消息列表:XREAD

消费者组相关命令:
创建消费者组:XGROUP CREAT
读取消费者组中的消息:XREADGROUP GROUP
将消息标记为"已处理":XACK
为消费者组设置新的最后递送消息ID:XGROUP SETID
删除消费者:XGROUP DELCONSUMER
删除消费者组:XGROUP DESTROY
显示待处理消息的相关信息:XPENDING
转移消息的归属权:XCLAIM
看流和消费者组的相关信息:XINFO
打印消费者组的信息:XINFO GROUPS
打印流信息:XINFO STREAM

Stream简单的生产、消费模型:

在这里插入图片描述


使用XADD添加信息:

使用 XADD 向队列添加消息,如果指定的队列不存在,则创建一个队列:
语法:XADD key ID field value [field value ...]
key:队列名称,如果不存在就创建
ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性
field value : 记录
在这里插入图片描述
上图就是对person队列添加了两个信息:zhangsan 和 lisi

XDEL:
使用 XDEL 删除消息,语法格式:XDEL key ID [ID ...]

大家可以根据消息队列相关命令进行各种操作~~~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_57310550/article/details/126929570