lua pcall 返回值_Redis和Lua整合

前面我们已经介绍完了Redis相关的理论知识,从本篇开始我们介绍一些Redis相关的时机应用。比如:
  1. Redis整合Lua

  2. Redis的消息模式

  3. Redis实现分布式锁

  4. 常见的缓存问题

我们先从Redis整合Lua的使用开始。lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。在Redis中使用Lua有以下好处:
  1. 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行。

  2. 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件。

  3. 复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。

使用Lua脚本具体的示意图如下:

b7da758ea6930c4b2dc0488fc576de6c.png

Redis整合Lua脚本

通过执行redis的eval命令,可以运行一段lua脚本。
EVAL script numkeys key [key ...] arg [arg ...]
命令的具体说明如下:
  1. script参数:是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个Lua函数。

  2. numkeys参数:用于指定键名参数的个数。

  3. key [key ...]参数:从EVAL的第三个参数开始算起,使用了numkeys个键(key),表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形 式访问( KEYS[1], KEYS[2],以此类推)。

  4. arg [arg ...]参数:可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

eval "return {KEYS[1], KEYS[2], ARGV[1],ARGV[2]} 2 key1 key2 first second"

Lua脚本中调用Redis命令

我们可以在Lua脚本中调用Redis命令:
  1. redis.call()

  2. redis.pcall()

redis.call()和redis.pcall()的返回值都是redis命令执行的返回值,区别在于如果出错,call()则返回错误信息,不继续执行,而pcall()继续执行。在脚本中,使用return语句将返回值返回给客户端,如果没有return,则返回nil。
eval "return redis.call('set', KEYS[1], ARGV[1])" 1 n1 eleven

SCRIPT命令

另外一方面在Redis中有一些管理Lua脚本的命令:
  1. SCRIPT FLUSH:清除所有脚本缓存

  2. SCRIPT EXISTS:根据给定的脚本校验和,检查指定的脚本是否存在于脚本缓存

  3. SCRIPT LOAD:将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它

  4. SCRIPT KILL:杀死当前正在运行的脚本

192.168.24.131:6380> script load "return redis.call('set',KEYS[1],ARGV[1])""c686f316aaf1eb01d5a4de1b0b63cd233010e63d"192.168.24.131:6380> evalsha c686f316aaf1eb01d5a4de1b0b63cd233010e63d 1 n2elevenOK192.168.24.131:6380> get n2

EVALSHA

EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来传送脚本主体并不是最佳选择。为了减少带宽的消耗, Redis 实现了 EVALSHA 命令,它的作用和 EVAL 一样,都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 校验和(sum)。下面我们举两个使用Lua脚本的例子:
return redis.call('set', KEYS[1], ARGV[1])
上面是一个set脚本,在redis中我们可以这样使用:
redis-cli -h 192.168.24.131 -p 6380 --eval test.lua n3, 'eleven'
总结一下利用Redis整合Lua,主要是为了性能以及事务的原子性。因为redis帮我们提供的事务功能太差。

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

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

相关文章

java 异步调用webapi_Async Await异步调用WebApi

先铺垫一些基础知识 在 .net 4.5中出现了 Async Await关键字,配合之前版本的Task 来使得开发异步程序更为简单易控。 在使用它们之前 我们先关心下 为什么要使用它们。好比 一个人做几件事,那他得一件一件的做完,而如果添加几个人手一起帮着…

哲学家就餐问题python_哲学家就餐-同步问题解析-python

五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到。叉子的摆放如图所示。那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁。解法1:让他等待能够使用的时候,然后去…

java compare equla_Java中的equals,==,compareTo和compare的比较

Java中的equals(),,compareTo()和compare()首先只有可以用作两个基本类型数据之间的比较,当然是值比较。当用作两个对象比较时,比较的是对象引用,而不是值比较。其次任何对象都可以调用.equals()方法,因为这是从Object类继承下来的…

百度相关搜索软件_不太热门的办公神器软件篇搜索相关

这次介绍两个windows平台超好用的搜索神器——listary和everything全文阅读约需3分钟在工作中,虽然大部分文件都会分门别类地放在对应的文件夹中,但总有一些放完就忘了在哪或是层级过深打开不便的情况。这两个搜索神器完美地解决了找不到文件且windows自…

java摘要_java 摘要

packagecom.aarony.test;importjava.io.IOException;importjava.security.MessageDigest;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;public classDigestDemo {/**** 此方法描述的是:base64 解码**author: Aarony*version: 2018年6月20日 下午9:16…

python的装饰器、迭代器、yield_python装饰器,迭代器,生成器,协程

python装饰器[1]首先先明白以下两点#嵌套函数defout1():definner1():print(1234)inner1()#当没有加入inner时out()不会打印输出1234,当前层级也就是作用域下必须调用函数才能引用out1()#函数作用域defout2():a aaadefinner2():a bbbprint(a)inner2()print(a)out2()#当相同变量处…

jni c 传递对象到java_JNI将二进制数据从C传递到Java

我需要帮助将二进制数据传递给Java.我正在尝试使用jbytearray但是当数据进入Java时它看起来很糟糕.有人可以帮我一把吗?这是一些示例代码的片段.首先是原生C面:printf("Building audio array copy\n");jbyteArray rawAudioCopy env->NewBy…

python查看电脑配置_怎么查看电脑配置(教你如何查看电脑配置信息和型号)

如今,由于游戏、影音、学习或者工作的需要,用户都会有购买电脑的时候,不过对于一些不懂电脑的小白来说,如果连电脑配置都不会差的话,是十分容易被宰的。比如组装台式机的时候,可能一个不注意就被JS调包了&a…

mysql gtid深入_深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executedPREVIOUS GTID EVENT

之所以把MySQL.GTID_EXECUTED表的作用和PREVIOUS GTID EVENT的改变放到一起进行描述是因为它们后面文章探讨的基础。这部分使用到了我自己使用C语言写的原生BINLOG解析工具INFOBIN。一、GTID EVENT为什么要先描述什么是GTID EVENT呢?因为后面会用到,实际…

mysql 回滚段_MySQL和PostgreSQL比较

1、MySQL相对来说比较年轻,首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包,包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL,包括那些知名的应用&#xff0c…

java应用程序多态_java – 多态和n层应用程序

这是一个很好的问题.这里有不止一个似是而非的方法;你必须平衡权衡,做出适合你情况的选择.(1)有些人会认为Document接口应该为实例提供一个自己呈现的方法.这从OO的角度来看是有吸引力的,但是根据您的观点技术,加载您的具体文档类(可能是简单的域模型类),具有JSP,Swing组件或其…

支持向量机python实例_Python机器学习SVM简单应用实例 | kTWO-个人博客

1、前言在上一篇理论性的文章中我们说过了,SVM是分线性可分和线性不可分两种情况的,线性可分的比较容易理解,比较容易一些,线性不可分的就稍微复杂一点了。我们测试就分别用线性可分和线性不可分两种情况分别测试Python中的SVM算法…

dbscan java_DBSCAN算法的Java,C++,Python实现

最近由于要实现‘基于网格的DBSCAN算法’,网上有没有找到现成的代码[如果您有代码,麻烦联系我],只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿,之后对比研究。DBSCAN简介:1.简介DBSCAN 算法是一种基于密…

python云计算主要是干嘛的_国内python 云计算是干什么的

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

python画pr曲线代码_Yolov3测试图及绘制PR曲线,yoloV3,map,和,画

训练指令:./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 | tee train_yolov3.logps:For training with mAP (mean average precisions) calculation for each 4 Epochs (set validvalid.txt or train.txt in obj.data fil…

xampp 支持pdo mysql_在Windows上安装PHP PDO(xampp)

我正在尝试开发一个可以在PHP上连接到尽可能多的不同数据库的Web应用程序. PDO(http://www.php.net/manual/en/book.pdo.php)似乎是正确的界面,但我无法安装所需要的所有不同PDO数据库驱动程序所需的扩展.请注意,我在Windows 7机器上使用xampp. PHP版本5.3.8. PDO驱动启用了Mys…

python常用的库有哪些餐厅_这十个Python常用库,学习Python的你必须要知道!

想知道Python取得如此巨大成功的原因吗?只要看看Python提供的大量库就知道了包括原生库和第三方库。不过,有这么多Python库,有些库得不到应有的关注也就不足为奇了。此外,只在一个领域里的工作的人并不知道另一个领域里有什么好东…

java将图片转byte存入数据库_Java将byte[]转图片存储到本地的案例

Java中,将字节数组转成图片的有很多种方式,今天在这里记录其中一种,方便以后查询,也可以提供给没有接触的童鞋做一个参考。首先是将图片转成字节数组import sun.misc.BASE64Encoder;import java.io.*;// 传入图片路径,…

python高阶函数看不懂_Python进阶:高阶函数的详细说明

这篇文章讲述了Python进阶:高阶函数的详细说明有需要的朋友可以参考函数式编程函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称…

java callable接口_Java多线程之Callable接口的实现有返回值的线程

import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;//在主线程获取callable线程返回值时,如果callable线程还存在线程没有执行完,则主线程…