• 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 ...]

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

    在这里插入图片描述

  • 相关阅读:
    (科目三)数据库基础知识
    C++基础学习笔记-类与对象
    【已验证-直接用】微信小程序wx.request请求服务器json数据并渲染到页面
    java毕业设计全屋家具定制网站源码+lw文档+mybatis+系统+mysql数据库+调试
    十月,2024北京老博会,北京养老产业展览会
    构建一个WIFI室内定位系统
    MySQL常用函数大全
    神经网络模型的参数量和计算量
    Docker学习笔记
    脉冲波形的产生与变换
  • 原文地址:https://blog.csdn.net/m0_57310550/article/details/126929570