(转) 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中的应用 六.事 ...
随机推荐
- js实现放大缩小页面
<script type="text/JavaScript"> var size = 1.0; function zoomout() { size = size + 0 ...
- 得到类所在的jar包路径
//理论上用class.getProtectionDomain().getCodeSource().getLocation().getFile();比较准. //不过有两个需要注意的: //1.返 ...
- ubuntu中查看各种设备和资源的命令汇总
一.系统信息 1.查看内核信息: $uname -a 2.查看操作系统版本: ...
- Node单线程高并发原理
一.node是如何处理web请求的 浏览器中的js是单线程的,node也是单线程的.这个单线程相当于一个大管家,一切大小事务都要经过他的手才能办成,它总是把IO任务放入到任务池中. 虽然说是单线程,但 ...
- grib文件
一.grib文件简介 WMO是世界气象组织,world meteorology organization. GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式.最初GRIB表示&qu ...
- java hashcode的Delphi实现
程序使用java做后台服务,数据处理时使用了java的hashcode,Delphi程序也需要生成这个hashcode,为了一致,所以要在Delphi下实现和Java一样的算法. 下面即Delphi版 ...
- 微信小程序-从零开始制作一个跑步微信小程序
来源:伯乐在线 - 王小树 链接:http://ios.jobbole.com/90603/ 点击 → 申请加入伯乐在线专栏作者 一.准备工作 1.注册一个小程序账号,得用一个没注册过公众号的邮箱注册 ...
- 树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM
我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi. PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平 ...
- 【java基础】Java反射机制
一.预先需要掌握的知识(java虚拟机) 1)java虚拟机的方法区: java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存 ...
- numpy 切片
numpy 中的切片与数组中的切片类似. 数组 [ 起始:终止:步长, 起始:终止:步长, ... ] 所有的切片操作(无论是步长为+的正序,还是步长为 - 的逆序)都是开始位置包含,结束位置不包含( ...