最近在看《Redis入门指南》第二版,感觉收获挺大,推荐大家有时间看一看。其中有一章讲Lua脚本,感觉挺实用,把总结整理一下。

Redis在2.6中推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。Lua脚本可以调用大部分的Redis命令,使用Lua脚本的好处是:

1)减少网络开销,作为内存型数据库redis的性能开销主要花在发送指令和接收结果的网络开销上,把多条redis指令写在1个Lua脚本里,只需要通过网络发送1次就可以了

2)原子操作 Redis将整个脚本作为1个整体执行,中间不会被其他命令插入。

3)复用,客户端发送的脚本会存储在redis中,其他客户端就可以复用

先说一下Lua的语法

1、数据类型



  1个变量可以存储任意数据类型

2、变量

分全局、局部变量,全局变量无需声明可以直接使用默认nil。如a =1  print(b)  redis脚本中不允许使用全局变量,防止脚本间影响

变量名命名规则和java一样。

局部变量声明方式:

local a  -- 默认为nil

local b=1

local c,d

局部变量的作用域是 从声明开始到所在层的语句块结尾

声明一个存储函数:

local say_hi = function()

    print "hi"

end

3、注释

单行注释 --

多行注释 –[[           ]]

4、赋值

local a = 1

多重赋值:

local a,b = 1,2,3  -- 1=1  b=2  3 舍弃

local a,b = 1      -- a=1 b=nil

执行多重赋值时,会先计算出表达式的值

local a = { 1 ,2 ,3}

local i = 1

i,a[i] = i+1 , 5     -- i,a[1] = 2,5

所以 i= 2   a = {5 , 2 , 3}

5、操作符

1)数学操作符

    +、-、 *、 /、 %、-(取负)、^(幂运算)

数学操作符的操作数如果是字符串会自动转成数字

    '1' + 1   --2

    2)比较操作符

==    比较类型和值是否都相等

~=   

> >= < <=

1 == ‘1’  --false  类型不同

    {'1'} == {'1'}  --false  表类型比的是引用

3)逻辑操作符

and or not

Lua只认为 nil和false是假,其他都是真

4)连接操作符   ..     相当于 “+”

print('hello' .. ' '.. 'world' )   -- hello world

5)获取长度操作符 #

#'hello'   --5

6、条件判断

if 表达式 then

    语句块

elseif 表达式 then

    语句块

else

    语句块

end

6、循环

while:  如果条件成立就循环

    while 表达式 do

        语句块

   end

repeat:   循环,直到条件成立

    repeat

        语句块

    until 表达式

for

    for i=0, 100 [, 1] do

        语句块

    end

    或者

    for 变量1,变量2 ... in 迭代器 do

        语句块

    end

7、表类型

表是Lua中唯一的数据结构,可以当成关联数组,任何类型都可以作为索引

定义表:

a = {} --定义a为一个空表

a['field'] = 'value' -- 把a的field字段赋值value    索引为“field”

a.field    --value  a.field是a['field']的语法糖

user = {name='chen',age='28'}

user.name --chen

当索引为整数时表和数组一样    索引从1开始

a[1] = 'Bob'  a[2] = 'Jack'

等同于  a = {'Bob','Jack'}

遍历:

for index,value in ipairs(a) do

    print(index)

    print(value)

end

ipairs是Lua内置函数,实现类似迭代器功能

-- 1 Bob 2 Jack

或者

for i=1, #a do

    print(i)

    print(a[i])

end

Lua还提供一个迭代器 pairs,用来遍历非数组

for index ,value in pairs(user) do

    print(index)

    print(value)

end

name chen age 28

8、函数



function (参数)

    函数体

end

local add = function(a,b)

    return a+b

end

语法糖

local function add (a,b)

    return a + b

end

Lua调用redis命令

redis.call('set','name','chen')

local value = redis.call('get','name')

redis返回值Lua会自动转换成自己的类型

在redis中执行

EVAL script numkeys key [key ...] arg [arg ...]

java调用lua脚本:

String script ="local result={} " +

                " for i,v in ipairs(KEYS) do " +

                " result[i] = redis.call('get',v) " +

                " end " +

                " return result ";

Jedis jedis = new Jedis(ip,port);

jedis.eval(script,keyCount,String … params);

注意,不要再Lua脚本中出现死循环和耗时的运算,否则redis将不接受其他的命令,这个redis就挂了,只能script kill,如果有写入的话,只能shutdown nosave。


所以使用时要注意不能出现死循环、耗时的运算。redis是单进程、单线程执行脚本

redis使用Lua脚本的更多相关文章

  1. PHP中使用redis执行lua脚本示例

    摸索了一下在PHP中如何使用redis执行lua脚本,写了一个脚本如下,供以后参考 <?php $redis = new Redis(); #实例化redis类 $redis->conne ...

  2. Redis结合Lua脚本实现高并发原子性操作

    从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚 ...

  3. 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁

    spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...

  4. .Net Core使用分布式缓存Redis:Lua脚本

    一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...

  5. 要想用活Redis,Lua脚本是绕不过去的坎

    前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...

  6. 快速入门Redis调用Lua脚本及使用场景介绍

    Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...

  7. redis中lua脚本的简单使用

    一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...

  8. Redis执行Lua脚本的情况

    第一个测试: 往Redis里面存入1000个Hash,每个Hash里面有100个元素(Key 0-99,值是Key^2). PHP代码,执行33s左右 <?php $redis = new Re ...

  9. Redis执行Lua脚本示例

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...

  10. redis之lua脚本

    背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事 ...

随机推荐

  1. FIR数字滤波器的设计要点

    源:http://blog.sina.com.cn/s/blog_493520900101gt0a.html FIR数字滤波器的设计要点

  2. jQuery HighchartsTableHTML表格转Highcharts图表插件

    版权申明jQuery HighchartsTable 由 PMSIpilot 创建,中文使用文档由Highcharts中文网发布本文由Theo.红烧鸡翅膀.Mr.Zhang 翻译整理,版权归Highc ...

  3. bzoj 3879 虚树

    题目大意: 给一个字符串,多次询问k个后缀,求它们两两间LCP长度总和 分析: 转化为后缀树,用虚树求 注意: 后缀树中代表后缀的点都是叶子节点 题目中取模并没有卵用 #include <cst ...

  4. ActiveMQ讯息传送机制以及ACK机制

    http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...

  5. posix第二篇-----linux 锁机制

    1 简介 锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护. Pthreads提供了多种锁机制,常见的有: 1) Mutex ...

  6. eclipse创建android项目,无法正常预览布局文件

    http://jingyan.baidu.com/article/d621e8da0e0e052865913fae.html

  7. php学习-数组(一)

    数组函数可以对大量性质相同的数据进行存储,排序,插入及删除等操作. 学习任务: 声明数组,输出数组,遍历数组,查询数组中指定元素,获取数组中的最后一个元素. 删除数组中重复的元素.统计数组中元素的个数 ...

  8. iOS开发——获取本设备IP

    不说废话,直接上代码. #import <ifaddrs.h> #import <arpa/inet.h> - (NSString *)getIPAddress { NSStr ...

  9. jqGrid的搜索框下拉

    当需要在jqGrid的搜索框里配置搜索条件时,如下拉,日期等,代码如下: datePick = function(elem) { jQuery(elem). } colNames : [ " ...

  10. FZU 1058 粗心的物理学家

    这题有毒.要用long double定义,以及cout控制格式输出. #include<cstdio> #include<cstring> #include<cmath& ...