最近在看《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. 关于源码编译每次提示有错误 要make update-api

    最近编译newline的版本的时候..同事修改了andoid默认输入法为百度.这是系统自动提供的API,所以每次编译会提示 此时在编译源码生成SDK的过程中会出现这个问题:************** ...

  2. ural1316 Electronic Auction

    Electronic Auction Time limit: 0.5 secondMemory limit: 64 MB There is a deficit in cast-iron pigs in ...

  3. 用java.util.Observable实现Observer模式

    http://blog.csdn.net/dada360778512/article/details/6977758 http://blog.csdn.net/luoweifu/article/det ...

  4. 从客户端检测到有潜在危险的 Reque

    web.config里面加上<httpRuntime requestValidationMode="2.0" />如下<system.web><htt ...

  5. Lua学习系列(五)

    calling C functions from Lua 5.2 这篇文章也不错: http://blog.csdn.net/x356982611/article/details/26688287 h ...

  6. Ubuntu安装PHP时候出错--xml2-config not found

    在Ubuntu下接着安装php时候,在configure后,又出现错误提示:error: xml2-config not found. Please check your libxml2 instal ...

  7. heritrix1.14.4配置-没有add和change按钮的问题

    今天搞了下heritrix1.14.4在eclipse下的配置,根据http://www.360doc.com/content/10/0913/18/2793979_53385587.shtml教程, ...

  8. CSU 1515 Sequence

    莫队算法+map #include<cstdio> #include<cstring> #include<cmath> #include<map> #i ...

  9. JVM线程安全

    一.线程的调度方式 线程调度分为两种方式: 协同式调度和抢占式调度.协同式调度:线程的执行时间由线程本身控制,线程将工作执行完之后,通知操作系统切换到其他线程上.缺点:时间不可控,就算出问题,也不会通 ...

  10. LPC1768的USB-相关结构体定义

    #ifndef __USB_H__ #define __USB_H__ //usb传输数据的宏定义描述 #include "sys.h" typedef __packed unio ...