(转) Lua: 给 Redis 用户的入门指导
Hello, Lua!
| 1 | local msg = "Hello, world!" | 
print?
| 1 | local link_id = redis.call("INCR", KEY[1]) | 
| 2 | redis.call("HSET", KEYS[2], link_id, ARGV[1]) | 
| 3 | return link_id | 
们将用call()函数首次访问Redis。call()的参数就是发给Redis的命令:首先INCR <key>, 然后HSET
<key> <field>
<value>。这两个命令将依次执行——当这个脚本执行时,Redis不会做任何事,它将非常快地运行。
- 表是基于1的,也就是说索引以数值1开始。所以在表中的第一个元素就是mytable[1],第二个就是mytable[2]等等。
- 表中不能有nil值。如果一个操作表中有[1, nil, 3, 4],那么结果将会是[1]——表将会在第一个nil截断。
| 1 | redis-cli EVAL "$(cat incr-and-stor.lua)"2 links:counter links:urls http://malcolmgladwellbookgenerator.com/ | 
print?
| 1 | local link_id = redis.call("INCR", "links:counter") | 
print?
| 1 | if redis.call("EXISTS",KEYS[1]) == 1 then | 
| 2 | return redis.call("INCR",KEYS[1]) | 
| 3 | else | 
| 4 | return nil | 
| 5 | end | 
print?
| 1 | redis-cli SCRIPT LOAD "return 'hello world'" | 
| 3 | 
脚本加载与注册执行
print?
| 1 | redis-cli SCRIPT LOAD "return 'hello world'" | 
| 3 | 
何时使用Lua
支持WATCH/MULTI/EXEC这样的块,能进行一组操作,也能一起提交执行,看起来与Lua有重叠。应该如何进行选择?MULT块中所有操作独
立,但在Lua中,后面的操作能依赖前面操作的执行结果。同时使用Lua脚本还能够避免WATCH使用后竞争条件引起客户端反应变慢的情况。
访问库
print?
| 1 | if redis.call("EXISTS", KEYS[1]) == 1 then | 
| 2 | local payload = redis.call("GET", KEYS[1]) | 
| 3 | return cjson.decode(payload)[ARGV[1]] | 
| 4 | else | 
| 5 | return nil | 
| 6 | end | 
| 1 | redis-cli set apple '{ "color": "red", "type": "fruit" }' | 
| 2 | => OK | 
| 3 | 
print?
| 1 | if redis.call("EXISTS", KEYS[1]) == 1 then | 
| 2 | local payload = redis.call("GET", KEYS[1]) | 
| 3 | return cmsgpack.unpack(payload)[ARGV[1]] | 
| 4 | else | 
| 5 | return nil | 
| 6 | end | 
数值转换
print?
| 1 | local indiana_pi = 3.2 | 
| 2 | return indiana_pi | 
| 1 | local indiana_pi = 3.2 | 
| 2 | redis.call("SET", "pi", indiana_pi) | 
| 3 | return redis.call("GET", "pi") | 
总结:
- 表是Lua中的表达式,与很多流行语言不同。KEYS中的第一个元素是KEYS[1],第二个是KEYS[2](译注:不是0开始)
- nil是表的结束符,[1,2,nil,3]将自动变为[1,2],因此在表中不要使用nil。
- redis.call会触发Lua中的异常,redis.pcall将自动捕获所有能检测到的错误并以表的形式返回错误内容。
- Lua数字都将被转换为整数,发给Redis的小数点会丢失,返回前把它们转换成字符串类型。
- 确保在Lua中使用的所有KEY都在KEY表中,否则在将来的Redis版中你的脚本都有不能被很好支持的危险。
- Lua脚本和其它Redis操作一样,在脚本执行时,其它的一切都不能运行。考虑用脚本来护展Redis服务器能力,但要保持短小和有用。
补充读物补充读物
Lua Reference ManualLua Tutorial DirectoryEVAL Docsevalsha.com — 偶尔会有垃圾邮件,但内容很好(译注:里面有很多的Lua脚本,以EVALSHA方式提供,超棒,希望对你有用。)
(转) Lua: 给 Redis 用户的入门指导的更多相关文章
- Lua: 给 Redis 用户的入门指导
		转自:http://www.oschina.net/translate/intro-to-lua-for-redis-programmers 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有 ... 
- Lua: 给 Redis 用户的入门指导(转)
		add by zhj : Lua与Multi/EXEC的功能比较像,在执行过程中,redis不会执行其它命令,这就不会有并发访问的问题, 这是非常好的.但Multi/EXEC要求所有命令都是独立的,后 ... 
- 全网最完整的Redis入门指导
		前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ... 
- Redis入门指导
		前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ... 
- Lua 与 Redis
		Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的 ... 
- Redis详解入门篇
		Redis详解入门篇 [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介 ... 
- Redis详解入门篇(转载)
		Redis详解入门篇(转载) [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 ... 
- 【建议收藏】Redis超详细入门教程大杂烩
		写在前边 Redis入门的整合篇.本篇也算是把2021年redis留下来的坑填上去,重新整合了一翻,点击这里,回顾我的2020与2021~一名大二后台练习生 NoSQL NoSQL(NoSQL = N ... 
- React-Native入门指导之iOS篇 —— 一、准备工作
		React-Native 入门指导系列教程目录 一.准备工作 (已完成) 二.项目介绍与调试 三.CSS样式与Flex布局 四.常用UI控件的使用 五.JSX在React-Native中的应用 六.事 ... 
随机推荐
- Android网络开发之蓝牙
			蓝牙采用分散式网络结构以及快调频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(I-工业.S-科学.M-医学)频段,其数据速率为1Mbps,采用时分双工传输方案. 蓝牙 ... 
- Swift中的Any 与 AnyObject、AnyClass的区别?
			在 Swift 中能够表示 “任意” 这个概念的除了Any .AnyObject以外,还有一个AnyClass. Any.AnyObject.AnyClass有什么区别: AnyObject是一个成员 ... 
- NYOJ----蛇形填数
			蛇形填数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 ... 
- Tensorflow异常集锦
			一.tensorflow checkpoint报错 在调用tf.train.Saver#save时,如果使用的路径是绝对路径,那么保存的checkpoint里面用的就是绝对路径:如果使用的是相对路径, ... 
- 转载:kafka c接口librdkafka介绍之二:生产者接口
			转载:from:http://www.verydemo.com/demo_c92_i210679.html 这个程序虽然我调试过,也分析过,但是没有记录笔记,发现下边这篇文章分析直接透彻,拿来借用,聊 ... 
- 【转】25.windbg-!gle、g(错误码、g系列)
			!gle !gle 扩展显示当前线程的最后一个错误码.这个太好记了,getlasterror取首字母: <span style=:> !gle LastErrorValue: (Win32 ... 
- socket编程及API简介
			什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域 ... 
- iscsi target 之LIO配置
			LIO 配置 现在主流Linux都可以设置iSCSI,如STGT/TGT.LIO Target等.Linux-IO(LIO)Target是当前Linux标准的iSCSI target的开源实现,包含在 ... 
- win7系统总是安装不了net2.0的解决方法
			一些网友询问说ghost win7系统总是安装不了net2.0怎么办呢?net2.0是什么?ATI显卡的控制中心 就需要在NET2.0的基础上.可是一些用户说win7系统总是安装不了net2.0如何解 ... 
- IE6,IE7浏览器下 margin 无效的解决方法
			今天有时间,所以特意做了一个测试. 复制代码 代码如下: <style type="text/css"> .test-1,.test-2{border:5px soli ... 
