(转) 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 用代码画虚线边框背景
1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_ ...
- iOS 上传App Store提示WARNING ITMS-90703错误的说明
今天上传app到appstore的时候,上传到最后一步的时候,报了一个警告: 原文如下: WARNING ITMS-90703: "Deprecated Xcode Build. Due t ...
- Socket编程:之双机通信
服务端: #include<sys/socket.h> #include<sys/types.h> #include<stdio.h> #include<un ...
- windbg !logexts(自带的监控API)
Logexts.dll windbgth自带了跟进API的功能,这样我们可以方便的跟踪整个API的调用具体的示意图如下: !logexts.logi 将Logger注入目标程序,初始化监控,但是并不开 ...
- [aaronyang] nodejs学习-mongodb[1]
1.资源提供与安装(ayjs.net) 学习说明:nodejs还是在非windows环境下操作好,所以一切还是 当前时间:2014年12月06日aaronyang 官网地址:www.mongodb.o ...
- Python读文本文件中文乱问题
file_object = open('thefile.txt')try: all_the_text = file_object.read().decode("gb2312")fi ...
- MySQL -- 全文检索(布尔全文检索)
modifier的值为in boolean mode的时候,可以使用布尔全文检索.在布尔全文检索中,有些字符在检索字符串的开头或结尾会有特殊含义.在下面的示例中,+和-操作符表明在匹配的时候,单词必须 ...
- 【转】Scheme 编程环境的设置
Scheme 编程环境的设置 介绍了这么久的 Scheme,却没有讲过如何配置一个高效的 Scheme 的编程环境.有些人开始学习 Scheme 的时候感觉无从下手,所以今天讲一下它的配置. Sche ...
- mysql数据库,创建只读用户
数据库当前只有一个root用户,需要创建一个只读帐户给其他使用,因使用者是使用数据库管理工具在其他主机访问,所以还要开户远程访问权限,操作步骤如下. 1. 使用现有的root用户登录到Mysql. m ...
- 如何利用IPv6进行远程桌面连接
如何利用IPv6进行远程桌面连接 学校是教育网,其中寝室和实验室的IPv4地址被划分成了两个VLAN,所以没法使用windows的远程连接功能.今天突然想到学校的IPv6地址可能并未划分成两个VLAN ...