redis使用Lua脚本
最近在看《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"
end3、注释
单行注释 --
多行注释 –[[ ]]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 world5)获取长度操作符 #
#'hello' --56、条件判断
if 表达式 then
语句块
elseif 表达式 then
语句块
else
语句块
end6、循环
while: 如果条件成立就循环
while 表达式 do
语句块
endrepeat: 循环,直到条件成立
repeat
语句块
until 表达式for
for i=0, 100 [, 1] do
语句块
end
或者
for 变量1,变量2 ... in 迭代器 do
语句块
end7、表类型
表是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])
endLua还提供一个迭代器 pairs,用来遍历非数组
for index ,value in pairs(user) do
print(index)
print(value)
end
name chen age 288、函数
function (参数)
函数体
endlocal 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脚本的更多相关文章
- PHP中使用redis执行lua脚本示例
摸索了一下在PHP中如何使用redis执行lua脚本,写了一个脚本如下,供以后参考 <?php $redis = new Redis(); #实例化redis类 $redis->conne ...
- Redis结合Lua脚本实现高并发原子性操作
从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚 ...
- 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁
spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...
- .Net Core使用分布式缓存Redis:Lua脚本
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...
- 要想用活Redis,Lua脚本是绕不过去的坎
前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...
- 快速入门Redis调用Lua脚本及使用场景介绍
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...
- redis中lua脚本的简单使用
一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...
- Redis执行Lua脚本的情况
第一个测试: 往Redis里面存入1000个Hash,每个Hash里面有100个元素(Key 0-99,值是Key^2). PHP代码,执行33s左右 <?php $redis = new Re ...
- Redis执行Lua脚本示例
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...
- redis之lua脚本
背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事 ...
随机推荐
- STM8单片机启动流程彻底探究--基于IAR开发环境
初学STM8会发现,STM8官方的固件库并没有提供一个.s文件的启动代码,那么她是如何启动然后跳转到main函数执行的呢 首先,我们根据ARM的只是可以推测,STM8也是通过复位向量来启动的,假设流程 ...
- MAC OSX 10.10 下安装PHP环境
Apache和PHP已经在系统里面预装好了,只要你开启即可使用.这篇文章给大家介绍如何开启并设置好PHP开发环境. 1.开启默认Apache服务 打开终端命令行,输入如下命令就会开启Apache了.然 ...
- Python核心编程第二版(中文).pdf 目录整理
python核心编程目录 Chapter1:欢迎来到python世界!-页码:7 1.1什么是python 1.2起源 :罗萨姆1989底创建python 1.3特点 1.3.1高级 1.3.2面向 ...
- [iOS Animation]-CALayer 专用图层
专用图层 复杂的组织都是专门化的 Catharine R. Stimpson 到目前为止,我们已经探讨过CALayer类了,同时我们也了解到了一些非常有用的绘图和动画功能.但是Core Animati ...
- Apache的Directory配置指南
使用<Directory>… </Directory>设置指定目录的访问权限,其中可包含:Options.Allow.Override.Order.Allow.Deny.Req ...
- 《算法导论》习题2.3-7 查找集合S中是否有两个元素和为X---Java实现
代码如下: public class MergeSort { public static void sort(int [] A,int p, int r) { if(p<r) { int q = ...
- JRPC 轻量级RPC框架
JRPC是一个轻量级的java RPC框架.它支持服务注册和发现. 目前它开源了,地址为:https://github.com/dinstone/jrpc. Quick Start step 1: g ...
- IOS9中联系人对象的使用及增删改查操作的函数封装
之前克服重重困难把IOS9中新的类联系人搞明白了,现在把增删改查封装成了函数,如下: // // ViewController.m // IOS9中联系人CNContact的使用 // // Crea ...
- GP项目总结(一)
1.使用activity渲染不同的View时,两种方法: (1.)自定义两个不同的View,然后在mainActivity里根据不同的数据使用不同的View,通过addView()来Activity里 ...
- github 创建新项目
二.GitHub简介 GitHub 可以托管各种Git版本库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进 ...