Redis-04独立功能的实现

1、发布与订阅

介绍:

  • Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。
  • 通过SUBSCRIBE命令,客户端可以订阅一个或多个频道,成为这些频道的订阅者(subscriber)
  • 每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息

常用命令:

  • 订阅频道

    • SUBSCRIBE

    • 当一个客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间就建立起了一种订阅关系

  • 退订频道

    • UNSUBSCRIBE

    • 当一个客户端退订某个或某些频道的时候,服务器将从pubsub_channels中解除客户端与被退订频道之间的关联

  • 订阅模式

    • PSUBSCRIBE
  • 退订模式

    • PUNSUBSCRIBE
  • 发送消息

    • PUBLISH

      • 将消息message发送给频道channel
  • 查看订阅信息

    • PUBSUB

      • PUBSUB CHANNELS [pattern]

        • 用于返回服务当前被订阅的频道,pattern参数可选,用于匹配指定频道
      • PUBSUB NUMSUB

        • 接受任意多个频道作为输入参数,并返回这些频道的订阅者数量
      • PUBSUB NUMPAT

        • 用于返回服务器当前被订阅模式的数量

订阅频道

有A、B、C三个客户端都执行了命令:【订阅频道】

# 客户端订阅news.it频道
SUBSCRIBE "news.is"

向频道中发送消息

# 向 “news.is” 频道中发送 Hello Redis
PUBLISH "news.is" "Hello Redis"

执行效果如下:

pPjugdxpng

频道news.is与ABC 三个订阅者:

pPjK61gpng

向news.is 频道发送消息:

pPjK5NVpng

2、事务

Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。

事务支持:将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,保证事务之间的隔离性

例如以下简单事务执行流程:

# 通过MULTI开启一个事务
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET "name" "PP419"
QUEUED
127.0.0.1:6379(TX)> GET "name"
QUEUED
127.0.0.1:6379(TX)> SET "author" "AtwoodPa"
QUEUED
127.0.0.1:6379(TX)> GET "author"
QUEUED
# EXEC 结束并提交(commit)事务
127.0.0.1:6379(TX)> EXEC
1) OK
2) "PP419"
3) OK
4) "AtwoodPa"

2.1、事务的实现

一个事务从开始到结束会经历三个阶段

  1. 事务开始

  2. 命令入队

  3. 事务执行

2.1.1、事务开始

MULTI命令的执行标志着事务的开始,MULTI命令可以将执行该命令的客户端从非事务状态切换到事务状态,这一切换是通过在客户端状态的flags属性中打开REDIS_MULTI标识来完成的。

MULTI命令实现的伪代码如下:

def MULTI() :# 打开事务标识client.flags |= REDIS_MULTI# 返回OK回复replyOK()

2.1.2、命令入队

当一个客户端处于非事务状态时,该客户端发送的命令会被服务器立即执行。

但是,当一个客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作:

  • 立即执行

    • EXEC

    • DISCARD

    • WATCH

    • MULTI

  • 存入队列

    • 除了上面四种立即执行命令之外,服务器不会立即执行命令

    • 将这个命令放入一个事务队列中,然后向客户端返回QUEUED

      • 事务队列以先进先出(FIFO)的方式保存入队命令

      • 较先入队的命令会被放到数组的前面

      • 较后入队的命令会被放到数组的后面

2.1.3、事务执行

当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令将立即被服务器执行

服务器会遍历客户端的事务队列,执行队列中保存的所有命令,最后将执行命令所得的结果全部返回给客户端

3、Lua脚本

使用lua+aop实现限流:https://www.cnblogs.com/atwood-pan/p/17418814.html

通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子地执行多个Redis命令。

Redis使用串行化的方式来执行Redis命令,在任何特定时间内,最多都只会有一个脚本能够被放进Lua环境中运行,所以整个Redis服务器只需要创建一个Lua环境即可。

Redis中与Lua环境进行协作有两个组件:

  • 执行组件

    • 该组件是负责执行Lua脚本中包含的Redis命令的伪客户端

      • redis.call

      • redis.pcall

    • 了解服务器与Lua环境的交互过程

  • 存储组件

    • 该组件时负责保存传入服务器的Lua脚本的脚本字典

    • 理解SCRIPT EXISTS命令和脚本复制功能的实现原理

脚本管理命令:

  • SCRIPT FLUSH

    • 用于清除服务器中所有和Lua脚本有关的信息,会释放并重建lua_scripts字典,关闭现有的Lua环境并重新创建一个新的Lua环境
  • SCRIPT EXISTS

    • 根据输入的SHA1校验和,检查和对应的脚本是否存在于服务器中
  • SCRIPT LOAD

    • 在Lua环境中为脚本创建相对应的函数,然后再将脚本保存到lua_scripts字典里面,之后用于载入脚本
  • SCRIPT KILL

    • 结合lua-time-limit配置选项,停止未执行过任何写入操作超时运行的脚本

4、排序

Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序

列表键排序:

# 向列表中插入5个元素
127.0.0.1:6379> RPUSH numbers 5 3 1 4 2
(integer) 5
# 按插入顺序排列的列表元素
127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "3"
3) "1"
4) "4"
5) "2"
# 按值从小到大有序排列的列表元素
127.0.0.1:6379> SORT numbers
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

对包含字符串的集合键进行排序:

# 添加7个元素
127.0.0.1:6379> SADD alphabet a b c d e f g
(integer) 7
# 乱序排序的集合元素
127.0.0.1:6379> SMEMBERS alphabet
1) "c"
2) "a"
3) "e"
4) "b"
5) "d"
6) "g"
7) "f"
# 排序后的集合元素
127.0.0.1:6379> SORT alphabet ALPHA
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"

使用BY命操作有序集合的权重:

# 向有序集合中,添加三个带有权重的值
127.0.0.1:6379> ZADD test-result 3.0 jack 3.5 peter 4.0 tom
(integer) 3
# 按元素的分值排列
127.0.0.1:6379> ZRANGE test-result 0 -1
1) "jack"
2) "peter"
3) "tom"
# 为各个元素设置序号
127.0.0.1:6379> MSET peter_number 1 tom_number 2 jack_number 3
OK
# 使用BY命令,以序号为权重,对有序集合中的元素进行排序
127.0.0.1:6379> SORT test-result BY *_number
1) "peter"
2) "tom"
3) "jack"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监控搭建-Prometheus

监控搭建-Prometheus 1、背景2、目标3、选型4、Prometheus4.1、介绍4.2、架构4.3、构件4.4、运行机制4.5、环境介绍4.6、数据准备4.7、网络策略4.7.1、主机端口放行4.7.2、设备端口放行 4.8、部署4.9、验证4.10、配置 1、背景 随着项目信息化进程的推进,操作系统、…

2579. 统计染色格子数(javascript)

有一个无穷大的二维网格图,一开始所有格子都未染色。给你一个正整数 n ,表示你需要执行以下步骤 n 分钟: 第一分钟,将 任一格子染成蓝色。之后的每一分钟,将与蓝色格子相邻的 所有 未染色格子染成蓝色。 下图分别是 …

Redis-02单机数据库的实现

Redis-02单机数据库的实现 1、服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库; 在初始化服务器时&#xff0c…

竞赛 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

如何从零开始系统的学习项目管理?

一、项目的概念 根据项目管理协会(PMI)的定义,项目是指为了创造独特的产品、服务或成果而进行的临时性工作。这意味着项目需要有明确的目标,且不是日常重复性工作。尽管项目是临时性工作,但它所交付的成果可能会持续存…

锁降级 ReentrantReadWriteLock

锁降级 ReentrantReadWriteLock 所谓降级,可以通过一个例子理解,一般都是写的权限大,读的权限小,从写到读自然是降级,这是通俗的理解。 锁降级:同一个线程先获取写锁,在写锁未释放的情况下&…

【计算机网络】poll | epoll

文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面…

【计算机视觉 05】YOLO论文讲解:V1-V7

https://ai.deepshare.net/live_pc/l_63243a65e4b050af23b79338 Part1.目标检测与YOLO系列 1. 目标检测任务及发展脉络 2. YOLO的发展史 Anchors Base原理: Part2.YOLOV1-V3 3. YOLO V1的网络结构 4. YOLO V3的网络结构与实验结果 Part3.YOLO的进化 5. YOLO V4的网络…

【JavaEE】多线程进阶(一)饿汉模式和懒汉模式

多线程进阶(一) 文章目录 多线程进阶(一)单例模式饿汉模式懒汉模式 本篇主要引入多线程进阶的单例模式,为后面的大冰山做铺垫 代码案例介绍 单例模式 非常经典的设计模式 啥是设计模式 设计模式好比象棋中的 “棋谱”…

服务器启用SGX(以PowerEdge R750为例)

一、检查处理器是否支持SGX 在shell中输入以下命令查看CPU型号 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c在Product Specifications中找到对应的处理器参数信息,如果支持SGX,可以在Security & Reliability中看到如下信息 二、以“软…

初学者如何选择:前端开发还是后端开发?

#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人,我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先,让我们将编程世界的大城市比作前端开发和后端开…

Git 学习笔记 | Git 基本理论

Git 学习笔记 | Git 基本理论 Git 学习笔记 | Git 基本理论Git 工作区域Git 工作流程 Git 学习笔记 | Git 基本理论 在开始使用 Git 创建项目前,我们先学习一下 Git 的基础理论。 Git 工作区域 Git本地有三个工作区域:工作目录(Working Di…

计算机网络笔记3 数据链路层

计算机网络系列笔记目录👇 计算机网络笔记6 应用层计算机网络笔记5 运输层计算机网络笔记4 网络层计算机网络笔记3 数据链路层计算机网络笔记2 物理层计算机网络笔记1 概述 文章前言 💗 站在巨人的肩膀上,让知识的获得更加容易&#xff01…

vue,前端打包项目、部署上线

前端项目是在本地的IDE开发的。流程是:开发》打包》上线到生产环境》使用。 vue脚手架只是开发过程中,协助开发的工具,当真正开发完了,脚手架不参与上线。 这时候要用到打包了。 打包后,可以生成,浏览器能够直接运行的网页>就是需要上线的源码! 打…

Clion中使用C/C++开发stm32程序

前言 从刚开始学习阶段,一直是用的keil5开发stm32程序,自从看到稚晖君推荐的CLion开发嵌入式程序后,这次尝试在CLion上开发stm32程序。 1、配置CLion用于STM32开发的环境 这里我就不详细写了,没必要重新写,网上教程很多…

华为OD机试 - 数字反转打印(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

dataframe保存excel格式比csv格式小很多很多

问题描述: 一个3万行的数据保存成csv大概10个G,但保存成excel格式只有100多M 原因分析: 因为xlsx 实际上就是 zip 压缩包,同时,如果有大量重复的数据,XLSX 会提取文本值,将其存储在查找表中&…

华为云云耀云服务器L实例评测|部署项目管理工具 Focalboard

华为云云耀云服务器L实例评测|部署项目管理工具 Focalboard 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 产品规格1.4 应用场景 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Focalboard3.1 Focalboard 介绍3.2 Doc…

2023年中国CEM-1型覆铜板产量、需求量及行业销售收入分析[图]

CEM-1指覆铜板的一种,以玻纤布半固化片与纸基半固化片层压铜箔达到固化后形成的板材,属于复合型基材,CEM-1能用来制作频率特性要求高的PCB,如电视机的调谐器、电源开关、超声波设备、计算机电源和键盘,也可以用于电视机…

Xcode 15 编译出错问题解决

正常升级xcode 15以后发现原来没有出现报错的代码,现在出现了编译错误。(如果没有出现请忽略)下面教你如何解决这个问题。 1、pod update更新cocoapods,因为其根据xcode15做了很多的更新,保证cocoapods是最新的。 千…