Redis-04独立功能的实现

news2024/12/26 22:04:40

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.coloradmin.cn/o/1073670.html

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

相关文章

API网关是什么?

API网关是什么? API网关很多人都知道它的实现原理,但是并不清楚它存在的意义和背景是什么,这里我给大家通俗易懂地讲解下!举个例子,假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务&#xf…

多个方法多个出路!Microsoft Excel中合并单元格的8种方法

合并单元格是初学者电子表格用户使用的最流行的选项之一。但它们有许多缺点,使它们不是那么好的选择。 在这篇文章中,我将向你展示有关合并单元格的所有信息,包括8种合并单元格的方法。我还将告诉你为什么不应该使用它们,以及一个更好的替代方案,它将产生相同的视觉效果。…

前端预览、下载二进制文件流(png、pdf)

前端请求设置 responseType: “blob” 后台接口返回的文件流如下&#xff1a; 拿到后端返回的文件流后&#xff1a; 预览 <iframe :src"previewUrl" frameborder"0" style"width: 500px; height: 500px;"></iframe>1、预览 v…

【APP】上架指南:iOS App Store 首次上架被拒原因分析与解决方案

目录 一、前言 二、APP 审核备案新规 &#xff08;1&#xff09;iOS 上架审核申请被拒 &#xff08;2&#xff09;苹果应用商店重大调整 &#xff08;3&#xff09;首次备案流程 ① 阿里云备案 ② 华为云备案 ③ 腾讯云备案 三、iOS 首次上架拒审原因分析 &#…

Redis-03持久化

1、RDB持久化 Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含着任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;通常情况下将服务器中的非空数据库以及它们的键值对统称为数据库状态 Redis是内存数据库&#xff0c;它将自己…

【Ingress】

Ingress 一、作用二、使外部应用能够访问集群内服务方案1.NodePort2.LoadBalancer3.externalIPs4.Ingress 三、Ingress的组成1.ingress:nginx配置文件2.ingress-controller: 当作反向代理或者说是转发器 四、Ingress工作原理五、ingress暴露服务的方式方式一&#xff1a;Deploy…

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;没有源代码&#xff0c;你连控件的背景色怎么改都找不着&#xff01;&#xff01; 2.下载你所使用的版本&#x…

Tomcat 线程模型性能调优

Linux I/O模型详解 I/O要解决什么问题 I/O&#xff1a;在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令&#xff0c;数据从外部设备拷贝至内存需要一段时间&#xff0c;这段时间CPU就没事情做了&#xff0c;程序就会两种选择&#xff1a; 让出…

投资 3DEXPERIENCE® WORKS 的 10 大理由

3DEXPERIENCE Works 通过利用基于云的 3DEXPERIENCE 平台提供一个统一的协作环境&#xff0c;扩展 SOLIDWORKS 的价值&#xff0c;使参与 产品开发的每个人都能为创新流程做出贡献。简而言之&#xff0c;如果您喜欢使用 SOLIDWORKS&#xff0c;那么您可以在继续使用的同时&…

在minkube上部署Milvus

Milvus Milvus是一个向量数据库&#xff0c;可以为ai做数据支撑。 Preparatory Work minikube minikube是一款微型本地k8s install curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/loca…

深入理解强化学习——强化学习的定义

分类目录&#xff1a;《深入理解强化学习》总目录 在机器学习领域&#xff0c;有一类任务和人的选择很相似&#xff0c;即序列决策&#xff08;Sequential Decision Making&#xff09;任务。决策和预测任务不同&#xff0c;决策往往会带来“后果”&#xff0c;因此决策者需要为…

电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)

下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&#xff5c;橘猫旗下新概念云平台&#xff0c;取件码&#xff1a;ZdRW 一、软件介绍 AquaSnap(界面增强软件)是一款功能强大的界面增强软件。这款软件支持屏幕边缘吸附与屏幕分屏即多显示器控制、摇晃窗口…

重构项目 vue2 => vue3 nuxt2 => nuxt3 遇到的问题

vue3获取组件的上下文 import { getCurrentInstance } from vue; // 获取当前组件实例 const instance getCurrentInstance();// 获取当前组件的上下文&#xff0c;下面两种方式都能获取到组件的上下文。// 方式一&#xff0c;这种方式只能在开发环境下使用&#xff0c;生产环…

文件名太长,批量改名不求人:轻松解决文件名问题

在电脑使用过程中&#xff0c;我们经常需要处理各种文件&#xff0c;有时候会遇到文件名过长的问题。过长的文件名可能会让人感到混乱&#xff0c;也可能会引发一些操作问题。那么&#xff0c;如何快速解决文件名过长的问题呢&#xff1f;其实&#xff0c;我们可以通过批量重命…

webpack不同环境下使用CSS分离插件mini-css-extract-plugin

1.背景描述 使用mini-css-extract-plugin插件来打包css文件&#xff08;从css文件中提取css代码到单独的文件中&#xff0c;对css代码进行代码压缩等&#xff09;。 本次采用三个配置文件&#xff1a; 公共配置文件&#xff1a;webpack.common.jsdev开发环境配置文件&#x…

《DevOps 精要:业务视角》- 读书笔记(七)

DevOps 精要:业务视角&#xff08;七&#xff09; DevOps历程什么是企业体系的DevOps&#xff1f;DevOps的目标是什么&#xff1f; DevOps的知识体系规范敏捷持续交付IT服务管理以TPS理念为基础 DevOps团队角色流程主管&#xff08;Process Master&#xff09;服务主管&#xf…

环信web、uniapp、微信小程序SDK报错详解---登录篇

项目场景&#xff1a; 记录对接环信sdk时遇到的一系列问题&#xff0c;总结一下避免大家再次踩坑。这里主要针对于web、uniapp、微信小程序在对接环信sdk时遇到的问题。主要针对报错400、404、401、40 (一) 登录用户报400 原因分析&#xff1a; 从console控制台输出及networ…

Fuzz测试:发现软件隐患和漏洞的秘密武器

0x01 什么是模糊测试 模糊测试&#xff08;Fuzz Testing&#xff09;是一种广泛用于软件安全和质量测试的自动化测试方法。它的基本思想是向输入参数或数据中注入随机、不规则或异常的数据&#xff0c;以检测目标程序或系统在处理不合法、不正常或边缘情况下的行为。模糊测试通…

Elasticsearch搜索引擎:ES的segment段合并原理

在讲 segment 之前&#xff0c;我们先用一张图了解下 ES 的整体存储架构图&#xff0c;方便后面内容的理解&#xff1a; 一、segment文件的合并流程&#xff1a; 当我们往 ElasticSearch 写入数据时&#xff0c;数据是先写入 memory buffer&#xff0c;然后定时&#xff08;默…

react create-react-app v5配置 px2rem (不暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 不暴露 eject 配置自己的webpack&#xff1a; 1.下载react-app-rewired 和 customize-cra-5 npm install react-app-rewired customize-cra…