ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis中lua脚本实战

2022-07-02 11:07:35  阅读:195  来源: 互联网

标签:实战 127.0 script 0.1 6379 redis lua


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命令强行终止。

标签:实战,127.0,script,0.1,6379,redis,lua
来源: https://www.cnblogs.com/FlyAway2013/p/16436886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有