在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制,
所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了。。。
一:Lua脚本
说来也巧,redis的大老板给了你解决这种问题的方法,那就是Lua脚本,而且redis的最新版本也支持Lua Script debug,这应该也是未来Redis的一
个发展趋势,要想学好Redis,必会Lua Script。。。

有趣的是,官网上还提供了一个视频教程教你如何进行Debug操作。。。 【https://redis.io/topics/ldb】 youtube上面的视频,要是被墙了,记得
上VPN哦。。。淘宝上不知道有没有售卖这种同款的吸顶灯~~~

二:使用Redis-Cli Lua Script 解决几个灵活性问题
1. Lua语法的问题
lua是一门编程语言,所以这个就已经超出了redis本身的范畴,如果大家想好好学习一下,可以看下http://www.lua.org/ 的官网,然后下载一下玩一玩。

比如这里我下载了一个windows版本的lua 编译器,具体语法上就不细说了。。有了这个主题,我们再进行下一个环节。

2. Eval的使用
EVAL script numkeys key [key ...] arg [arg ...]
首先大家一定要知道eval的语法格式,其中:
<1> script: 你的lua脚本
<2> numkeys: key的个数
<3> key: redis中各种数据结构的替代符号
<4> arg: 你的自定义参数
ok,可能乍一看模板不是特别清楚,下面我可以用官网的小案例演示一下:
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" username age jack
上面这一串代码大概是什么意思呢? 第一个参数的字符串就是script,也就是lua脚本。2表示keys的个数,KEYS[1] 就是 username的占位符, KEYS[2]就是
age的占位符,ARGV[1]就是jack的占位符,ARGV[2]就是20的占位符,,以此类推,,,所以最后的结果应该就是:{return username age jack 20} 是不
是有点像C#中的占位符:{0}呢??? 下面我在Redis中给大家演示一下:
[root@localhost Desktop]# redis-cli
127.0.0.1:> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" username age jack
) "username"
) "age"
) "jack"
) ""
127.0.0.1:>
通常境况下,我们不要在redis-cli中直接写lua脚本,这样非常不方便编辑,通常情况下我们都是把lua script放到一个lua文件中,然后执行这个lua脚本,比如
下面这样:

然后我们通过下面命令执行,这种方式和前面介绍的不一样,参数 --eval script key1 key2 , arg1 age2 这种模式,key和value用一个逗号隔开就好了,
最后我们也看到了,数据都出来了,对吧。
[root@localhost Desktop]# redis-cli --eval /usr/redis/sbin/.lua username age , jack
) "username"
) "age"
) "jack"
) ""
[root@localhost Desktop]#
三:实战
下面我可以构思几个小案例通过lua解决。
1. 通过lua脚本获取指定的key的List中的所有数据
local key=KEYS[]
local list=redis.call("lrange",key,,-);
return list;
这里面的redis.call就是用来执行redis中list的lrange命令,接下来我通过lpush给person塞入三条数据,如下:
[root@localhost Desktop]# redis-cli
127.0.0.1:> lpush person mary jack peter
(integer)
127.0.0.1:>
然后我们来执行这个lua脚本,效果如下图,是不是很牛逼的感觉???

有了这个1+1的效果,就可以玩些更复杂的操作。比如:
2.根据外面传过来的IDList 做“集合去重”的lua脚本逻辑:
local key=KEYS[];
local args=ARGV
local i=;
local result={};
for m,n in ipairs(args) do local ishit=redis.call("sismember",key,n); if(ishit) then
table.insert(result,,n);
end end return result;
2. 找到hash中age小于指定值的所有数据,lua脚本如下:
local result={};
local myperson=KEYS[];
local nums=ARGV[];
local myresult =redis.call("hkeys",myperson);
for i,v in ipairs(myresult) do
local hval= redis.call("hget",myperson,v);
redis.log(redis.LOG_WARNING,hval);
if(tonumber(hval)<tonumber(nums)) then
table.insert(result,,v);
end
end
return result;
大家可以试着看下这段脚本,然后按照这个逻辑自己玩一玩,很有意思的,还是那句话,学好redis,必会Lua。。。。
在redis中使用lua脚本让你的灵活性提高5个逼格的更多相关文章
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
- redis中使用lua脚本
lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- redis中使用java脚本实现分布式锁
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/115.html?1455860390 edis被大量用在分布式的环境中,自 ...
- Redis进阶实践之十九 Redis如何使用lua脚本
一.引言 redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...
随机推荐
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- Oracle碎碎念~1
1. 设置SQL*Plus提示符 SQL> set sqlprompt "_user'@'_connect_identifier>" SYS@orcl> 为了对所 ...
- 【Java大系】Java快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...
- mysql百万级分页优化
普通分页 数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start , 这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后 ...
- 两个变量交换的四种方法(Java)
对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...
- [Django]用户权限学习系列之Permission权限基本操作指令
若需建立py文件进行测试,则在文件开始加入以下代码即可 #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODU ...
- JavaMail发送邮件
发送邮件包含的内容有: from字段 --用于指明发件人 to字段 --用于指明收件人 subject字段 --用于说明邮件主题 cc字段 -- 抄送,将邮件发送给收件人的同时抄 ...