redis 教程 6(Redis 的Pipeline , Lua)

news2024/12/22 15:30:56

Redis 的Pipeline, Lua

  • Pipeline
    • Pipeline简介
    • 为什么需要Pipeline
    • Pipeline 性能测试
    • 与原生批量命令对比
  • Lua
    • Lua 与事物
    • Lua 的用法
    • Redis 如何管理Lua脚本

Pipeline

Pipeline简介

Pipeline(流水线) 能够将一组redis命令进行组装, 通过一次RTT(Round Trip Time) 传输给redis, 然后再将这组命令的执行结果按照顺序返回给redis客户端

为什么需要Pipeline

下图为redis 客户端对redis的n次请求过程
在这里插入图片描述

注意: redis客户端执行一次命令分为四个步骤,

  • 发送命令
  • 命令排队
  • 命令执行
  • 返回结果
    整个过程称之为Round Trip Time (RTT, 往返时间), 那在redis的所有操作命令里面, 提供了很多批量的操作, 能够有效的节省RTT 时间, 但是像hgetall, 没有批量命令, 如果要执行n次的话, 那就跟上图一样, 会有n次的RTT消耗, 这个时候Pipeline就刚好改善了这个问题。

在这里插入图片描述

注意: 上图这个过程就是使用PIpeline针对redis客户端多次命令发送的优化过程,极大的减少了RTT。

Pipeline 性能测试

对于Pipeline是能够改善RTT, 但是性能到底如何, 我们来分析下, 假设我们有10000次set命令需要执行, 分别在没有Pipeline的情况下, 在有Pipeline的情况下, 对比使用的时间。

注意: 下表是在10000条set命令, 不通的网络情况下, 在不使用Pipeline, 和使用Pipeline的情况所耗时间, 从表可以很直观的看出, Pipeline的性能很强

网络延迟非PipelinePipeline
本级0.17ms573ms134ms
内网服务器0.41ms1610ms240ms
异地机房7ms78499ms1104ms

与原生批量命令对比

Pipeline 的性能我们已经能够清楚, 那对于批量的redis命令有什么优缺点呢?

  1. 原生的批量命令是原子的, Pipeline是非原子的
  2. 原生批量命令是一个命令多个key, Pipeline是两次(来回)网络传输, 对应多个命令, 多个key
  3. 原生批量命令是redis服务端支持实现的, 而Pipeline需要服务端, 客户端共同配合实现。

注意: Pipeline的使用也要建立在调试的结果上, 不能一味的组装命令,

Lua

Pipeline可以组装多个redis命令, 但是是非原子性的, 是不安全的, 那如果即想组装命令, 又可以做到原子性呢? 这个时候Lua就出现了。
Lua 就是能够保证多条命令组合的原子性

Lua 与事物

Lua 保证了多条命令的组合是原子性的
事物, 即一批操作要么都执行成功, 要么都执行失败, 保证数据的一致性
redis 提供了multi 和exec 两个命令的组合, 在这两个命令之间的一组redis命令按照原子顺序执行, multi代表食物的开始, exec代表食物的结束。

multi
sadd user:a:follow  user:b
sadd user:b:fans user:a
// 这时命令并没有真整执行, 知识保存在redis里面
// 此时如果执行
sismember user:a:follow user:b 返回0
exec
返回1
再执行 sismember user:a:follow user:b 返回1

Lua 的用法

  1. eval

eval 脚本内容 key 个数 key 列表 参数列表

redis 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 key3 key4
1) "key1"
2) "key2"
3) "key3"
4) "key4"

在这里插入图片描述

  1. evalsha

evalsha 脚本 SHA1 值 key个数 key列表 参数列表
sha1 : 通过 SCRIPT LOAD 生成的 sha1 校验码。
numkeys: 用于指定键名参数的个数。
key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"

redis 127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"

在这里插入图片描述

  1. lua 的Redis Api

Lua 可以使用redis.call函数实现对Redis 的访问
redis.call(“set”, “hello”, “world”)
redis.call(“get”, “hello”)
在redis 的执行效果如下:

redis 127.0.0.1:6379> eval 'return redis.call("get", KEY[1])'  1 hello
"word"

Lua 还可以使用redis.pcall 函数实现对redis的调用, redis.call执行失败,脚本执行结束回返回错误, redis.pcall 会忽略错误继续执行。

Lua 可以用redis.log函数将Lua脚本的日志输出到redis 的日志文件中, 需要控制日志级别。

Redis 如何管理Lua脚本

  1. script load

script load 是将Lua脚本加载到Redis 内存中

  1. script exists

script exists sha1 {sha1 …}
判断sha1 是否已经加载到redis 内存中

  1. script flush

script flush
次命令用于清除Redis内存已经加载的所有Lua脚本

  1. script kill

script kill
杀掉正在执行的Lua脚本, 杀掉一些一直阻塞的lua脚本

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

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

相关文章

fmriprep2

一. sub-subXXX文件夹 sub-subXXX.html 二. sub-subXXX文件夹 sub-sub097 / anat / figures / func / log / anat / anat文件夹内文件比较多,文件命名规则遵守BIDS要求( https://bids-specification.readthedocs.io/en/stable/05-derivatives/01-introduction.ht…

【国内chatgpt使用方法合集】

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

2023_4_23_VS下Release怎么打断点进行debug

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

MySQL——流程控制函数

在 MySQL 中,流程控制函数是指可以控制存储过程(stored procedure)或函数(function)中执行流程的语句。以下是几个常用的流程控制函数: 1. IF函数 实现IF……ELSE……的效果。 # 如果expr1为true&#x…

深入探究java中的 xxxable和xxxator

前言 相信有一定工作经验的朋友,都见过或者用过xxxable和xxxator ,比如常见的Comparable和Comparator, 还有还有常见并且容易迷糊的Iterable和Iterator, 看这名字,前两个是和比较相关的, 后两个是和迭代相关. 但是命名如此相似的接口, 又有何区别呢?各自的用途又是什么呢? 今…

详解车载设备FOTA测试

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 引言:上一篇文章我们以车载Tbox为例介绍了相关的性能测试(车载TBOX嵌入式设备软件的性能测试),本篇我们介绍另外一个重要功能的专项测试:OTA(Over…

MySQL安装及卸载

安装 mysql现在安装的是5.7.mysql的安装方式有两种: 一种是exe方式 另外一种解压版 这次就使用解压版安装 解压缩到非中文目录 编写配置文件 1) 在安装目录下新建my.ini的配置文件 打开文件后缀和隐藏文件显示 2) 新建文件内编写内容 [Client] port 3306 [mysqld] #设置330…

【移植Ardupilot的日志记录方法到linux上】

移植Ardupilot的日志记录方法到linux上 说明日志结构组成日志写入操作预定义日志项运行时添加日志项的方法 单例测试编译方法查看数据其他 说明 采用二进制文件记录,可在mission planer查看 支持所有数据类型记录精巧移植方便可直接在地面站绘制曲线查看可导出生成…

觉非科技发布:基于BEV的数据闭环融合智驾解决方案

2023年上海车展期间,觉非科技基于BEV的数据闭环融合智能驾驶解决方案正式发布。 该方案可通过量产车BEV的实时感知结果,提供完整的城市Map-lite及Map-free数据闭环融合解决方案,并满足城市NOA、记忆通勤/泊车以及感知大模型训练的需要。 车…

OSPF基础配置实验

目录 一、实验要求与拓扑结构 1、实验要求 2、提前规划好的网段以及拓扑结构如下图 二、实验步骤 1、给各个路由器的每个接口配ip 2、运行ospf协议并划分区域 一、实验要求与拓扑结构 1、实验要求 首先划分区域,蓝色区域为Area 0,黄色区域为Area…

MyBatis(十五)MyBatis的逆向工程

前言、 所谓的逆向工程是:根据数据库表逆向生成Java的pojo类,SqlMapper.xml文件,以及Mapper接口类等。 要完成这个工作,需要借助别人写好的逆向工程插件。 思考:使用这个插件的话,需要给这个插件配置哪些…

基于 TensorRT 使用 python 进行推理优化

文章大纲 简介TensorRT 简介构建测试的conda 环境注意事项TensorRT 安装参考文献与学习路径简介 TensorRT 简介 TensorRT是NVIDIA推出的一个高性能的深度学习推理框架,可以让深度学习模型在NVIDIA GPU上实现低延迟,高吞吐量的部署。TensorRT支持Caffe,TensorFlow,Mxnet,P…

【Python】实战:生成无关联单选问卷 csv《压疮风险评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 (1)创建文件 (2)代码示例 四、csv 文件 一、适用场景 实战场景: 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

FPGA基于XDMA实现PCIE X8采集AD7606数据 提供工程源码和QT上位机程序和技术支持

1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很…

倍数+路径之谜

倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中,有多少个…

Java十大排序算法

排序算法 对一序列对象根据某个关键字进行排序 (1)稳定性 在排序中对于相等的两个元素a、b。如果排序前a在b的前边,排序之后a也总是在b的前边。位置不会因为排序而改变称之为稳定。反之,如果排序后a、b的位置可能会发生改变&am…

Java线程池从入门到精通(线程池实战)

参考 java常用线程池及它们的适用场景(JDK1.8) Java线程与线程池实战 线程池的拒绝策略_线程池 RejectedExecutionHandler 拒绝策略 ThreadPoolExecutor原理解析-关闭线程池 代码经验—java获取cpu个数-docker 一、概念 Java 中的线程池核心实现类是 …

鉴源论坛 · 观模丨面向界面的图形化测试技术

作者 | 熊一衡 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 01 什么是面向界面的图形化测试(GUI Testing) 图形用户界面(GUI) 是一种通过图形化方式呈现信息、数据、功能和操作的用户界面,旨在…

一起学 WebGL:三角形加上渐变色

大家好,我是前端西瓜哥。之前教大家绘制一个红色的三角形,这次我们来画个有渐变的三角形。 本文为系列文章,请先阅读如何绘制红色三角形的文章: 《一起学 WebGL:绘制三角形》 原来的写法,颜色是在片元着色器…

移动边缘计算意味着真正的5G时代已经来临

5G的承诺尚未实现,但现在宣布其失败还为时过早。DataBank首席执行官劳尔k马丁尼克(Raul K. Martynek)表示 ,真正的5G正在通过移动边缘计算实现,而数据中心将成为其中的核心。 在美国所有主要的移动运营商都在大力宣传他们在全美范围内提供无…