热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis中lua脚本实战

redis的lua脚本说明lua脚本其实是一个语言,有完整的程序控制语法和一些简单的特殊的数据结构比如table。不依赖于redis的,但是lua脚本是c写的一个非常简单的语言,所

redis的lua脚本说明

lua脚本 其实是一个语言,有完整的程序控制语法和一些简单的特殊的数据结构比如table。不依赖于redis 的,但是lua脚本是c写的一个非常简单的语言,所以redis也提供了对lua的支持,而且是默认支持,以插件的方式。

 

redis中调用lua 做什么呢? 一般就是利用lua 做一些稍微复杂的事情,其实就是执行lua脚本。 具体什么样的脚本呢? 通常还是执行redis 的命令, 也就是让几个redis 命令按照指顶的程序逻辑来执行。

为什么一般都使用lua呢?因为没有更好、更简单的其他的方式。—— 难不成直接让用户执行 c语言脚本? 我觉得其实也不是不可以,但是我估计这样会非常不安全,c 的指针可是很难控制的。

说起来有点绕,不过事实就是这样的,redis中执行lua脚本,然后lua中又调用redis命令。

 

lua中如何调用redis命令?redis.call、或者 redis.pcall

 

 

下面是我实验遇到的小问题以及解决方案。

 


Unknown Redis command called from Lua script

127.0.0.1:6379> EVAL "return redis.call('KEYS * ')" 0

(error) ERR Error running script (call to f_90c305887706feea8ab72f092121aa1b4c5b043a): @user_script:1: @user_script: 1: Unknown Redis command called from Lua script

127.0.0.1:6379>

127.0.0.1:6379> EVAL "KEYS * " 0

(error) ERR Error compiling script (new function): user_script:1: '=' expected near '*'

 

——似乎不支持 KEYS * 命令...

 

 


ERR wrong number of arguments for 'eval' command

127.0.0.1:6379> redis.call(set,hello,world)

(error) ERR unknown command 'redis.call(set,hello,world)'

127.0.0.1:6379> eval redis.call(set,hello,world)

(error) ERR wrong number of arguments for 'eval' command

127.0.0.1:6379> eval redis.call(set,hello,world) 0

(error) ERR Error running script (call to f_317adb9b83d8b5df45f0bc67609674b0ae930a62): @enable_strict_lua:15: user_script:1: Script attempted to access unexisting global variable 'set'

 

127.0.0.1:6379> eval 'redis.call("set","hello", "world")'

(error) ERR wrong number of arguments for 'eval' command

127.0.0.1:6379>  eval 'redis.call("set","hello", "world")' 0

 

—— eval 必须要 引号, 单双都行

 

127.0.0.1:6379> EVALSHA 1b936e3fe509bcbc9cd0664897bbe8fd0cac101b 0

(error) NOSCRIPT No matching script. Please use EVAL.

127.0.0.1:6379> SCRIPT EXISTS 1b936e3fe509bcbc9cd0664897bbe8fd0cac101b

1) (integer) 0

127.0.0.1:6379> SCRIPT LOAD "return 'hello'"

"1b936e3fe509bcbc9cd0664897bbe8fd0cac101b"

127.0.0.1:6379> SCRIPT EXISTS 1b936e3fe509bcbc9cd0664897bbe8fd0cac101b

1) (integer) 1

—— 返回1  是表示存在!

 


Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE

第一个窗口:127.0.0.1:6379> eval "while true do end" 0

—— 没有响应。

第二个窗口:127.0.0.1:6379> get hello(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.127.0.0.1:6379>

第一个窗口 关掉了, 后面的窗口还是无法执行, 一直 BUSY Redis is busy .. 只有重启redis

 

why ?

其实也可以通过script kill命令终止正在执行的脚本。如果当前执行的lua脚本对redis的数据进行了修改,比如(set)操作,那么script kill命令没办法终止脚本的运行,因为要保证lua脚本的原子性。如果执行一部分终止了,就违背了这一个原则在这种情况下,只能通过 shutdown nosave命令强行终止。





版权声明


本文原创发表于 博客园,作者为 阿K .    

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

欢迎关注本人微信公众号:觉醒的码农,或者扫码进群:







推荐阅读
  • redis知识汇总[随笔记录]
      ... [详细]
  • Server Installation for Jitsi Meet
    2019独角兽企业重金招聘Python工程师标准ServerInstallationforJitsiMeetThisdescribesconfiguringaserverji ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
  • cocos2dx-lua使用UIListView制作二级折叠菜单
    折叠菜单,用过jqueryaccordion的同学都知道是啥玩艺儿~,图片效果就是介样:cocos2dx不带有此控件,因此我们动手来实现一个。原理很简单,展开的时候往listview里i ... [详细]
  • 整整的花了一个下午的时候,才在lua中调用了动态链接库。比起其他脚本语言,lua的调用方式算是比较繁琐的,但是lua的编程思想非常的统一& ... [详细]
  • 我有一个非常大的TSV文件。第一行是标题。如果字段为空白,则以下各行包含数 ... [详细]
author-avatar
sdx3418153
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有