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

  1. Redis整合Lua

  2. Redis的消息模式

  3. Redis实现分布式锁

  4. 常见的缓存问题

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

  1. 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行。

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

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

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

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帮我们提供的事务功能太差。

lua pcall 返回值_Redis和Lua整合相关推荐

  1. lua函数返回值 lua_call lua_getglobal lua_gettop(L)

    lua函数返回值 学习目标lua_call与返回值lua_pcalllua_getgloballua_gettop(L) //参数个数 lua_getglobal:把全局变量 name 里的值压入堆栈 ...

  2. bat获取命令返回值_redis中list和hash的基本命令和使用场景

    Redis的数据类型 Redis的数据类型共有五种:string,list,hash,set,zset: String 字符串相对来说做平常,key-value,类似是hashmap的用法: List ...

  3. lua 函数 默认值_Unity热更新框架之xLua

    一:xLua概述 二:Lua文件加载 三:xLua文件配置 四:Lua与C#交互 五:xLua热更新 一:xLua概述 1.1 xLua简介 xLua是由腾讯维护的一个开源项目,xLua为Unity. ...

  4. [Axis2与Eclipse整合开发Web Service系列之三] 服务端返回值

    前言 在前面的三篇中 [Axis2与Eclipse整合开发Web Service系列之一] 生成Web Service Client(将WSDl 转化成 Java代码) [Axis2与Eclipse整 ...

  5. lua元表和元方法 《lua程序设计》 13章 读书笔记

    lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...

  6. cocos2dx java 调用lua_Cocos2d-x Lua实现从Android回调到Lua的方法

    最近在研究怎么把积分墙嵌入到Cocos2d-x Lua的里,折腾了几天,总算调通了,主要要解决的问题是,调用积分墙之后,当积分发生改变的时候,有一个回调方法,回调会返回用户还剩下多少积分,当Andro ...

  7. linux打开lua后中文有乱码,总结Lua使用中遇到的小问题

    Lua可以被C/C++ 代码调用,反过来也可以调用C/C++的函数,这使得Lua被广泛应用.Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行.Lua在目前解释型脚本引擎 ...

  8. lua mysql 存储类型_Lua学习----Lua基础数据类型

    前言 Lua有6中数据类型,分别是nil(空).boolean(布尔).number(数字).string(字符).table(表).function(函数) 在Lua中可以使用type函数来返回一个 ...

  9. Lua:01---Lua语言介绍、运行Lua程序(lua解释器)

    一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...

最新文章

  1. CVPR 2022 | 室外多模态3D目标检测(DeepFusion)
  2. java计算文件里的总分_java程序读取txt文件并计算总分 求帮忙
  3. 如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
  4. vue组件的基本使用:入门示例
  5. VC++ 19 (VS2015) 编译器系统环境变量配置
  6. java socket 二次发送_发过2次帖子,都没有了,再发。JAVA中SOCKET通信中的数据压缩问题...
  7. STM32F103构建固件库模板(PS固件库文件树介绍)
  8. nbiot开发需要掌握什么_学习软件开发需要准备什么?
  9. centos 安装oracle java,CentOS 4.4下安装Oracle 10
  10. 倦怠和枯燥_我如何艰难地学习倦怠
  11. C#进行Post请求(解决url过长的问题)
  12. Flink_大数据技术之电商用户行为分析
  13. python基础--函数作用域
  14. 斐讯n1 无线打印服务器,斐讯N1 设置旁路由(网关)的方法 | nas2x
  15. 如何使用Python来提取视频中的音频
  16. 北大计算机考研822 911区别,北大考研成绩“上热搜”,4位神仙“打架”,旁人:倒吸一口气!...
  17. 小白学习的sql注入
  18. 电脑音箱什么牌子好,该如何选购?
  19. 校园共享单车停放问题的调研
  20. 《实用C++》第11课:if 语句实现逻辑运算与冒号表达式

热门文章

  1. 不错!SpringBoot发布Jar包优化瘦身指南!
  2. 如何让mysql索引更快一点
  3. Springboot遇到的问题
  4. 离线部署 CDH 6.2 及使用 CDH 部署 Hadoop3 大数据平台集群服务
  5. win10雷电3接口驱动_技嘉推出B550 主板首发雷电3接口:40Gbps速率、Intel主控
  6. c++11特性move和forward区别
  7. 用户态和核心态的转换
  8. 思科CCNA第一学期期末考试答案
  9. python 列表索引位置,python – 在列表中查找值的第一个位置
  10. 为什么python提示没有clock_python – 为什么time.clock比time.time给出更长的时间?