Redis Lua脚本
Redis Lua脚本
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。
1、减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先10次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
2、原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
3、替代redis的事务功能:redis自带的事务功能很鸡肋,而redis的lua脚本几乎实现了常规的事务功能,官方推荐如果要使用redis的事务功能可以用redis lua替代。
脚本进行求值。EVAL命令的格式如下:
1 EVAL script numkeys key [key …] arg [arg …]
script参数是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个Lua函数。numkeys参数用于指定键名参数的个数。键名参数 key [key …] 从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在 Lua中通过全局变量KEYS数组,用1为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。在命令的最后,那些不是键名参数的附加参数 arg [arg …] ,可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。例如:
127.0.0.1:6379> eval “return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}” 2 key1 key2 first second
2 1) “key1”
3 2) “key2”
4 3) “first”
5 4) “second”
其中 “return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}” 是被求值的Lua脚本,数字2指定了键名参数的数量, key1和key2是键名参数,分别使用 KEYS[1] 和 KEYS[2] 访问,而最后的 first 和 second 则是附加参数,可以通ARGV[1] 和 ARGV[2] 访问它们。在 Lua 脚本中,可以使用redis.call()函数来执行Redis命令
lua脚本示例:
1
2 jedis.set(“product_stock_10016”, “15”); //初始化商品10016的库存
3 String script = " local count = redis.call(‘get’, KEYS[1]) " +
4 " local a = tonumber(count) " +
5 " local b = tonumber(ARGV[1]) " +
6 " if a >= b then " +
7 " redis.call(‘set’, KEYS[1], a‐b) " +
// 模拟保存回滚 当执行到这一行是 由于 bb == 0 语法错误 脚本错误回滚 虽然上面已经执行了redis 设置库存量 为 16-10 等于5 但是lua脚本会对执行的命令进行回滚 所以库存还是16
8 " bb == 0"
8 " return 1 " +
9 " end " +
10 " return 0 ";
11 Object obj = jedis.eval(script, Arrays.asList(“product_stock_10016”), Arrays.asList(“10”));
12 System.out.println(obj);
<2上面脚本的含义是先往redis中放入商品库存 数量为16 。<3后面通过 redis.call 去获取商品库存 <4将获取的库存数量转成数字 <5将需要减去的库存数量10转为数字 <判断库存是否大于需要减去的商品数量 <7 如果大于 执行库存减去需要减去的商品数量 <执行成功返回1 否则返回0
注意,不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令, 所以使用
时要注意不能出现死循环、耗时的运算。redis是单进程、单线程执行脚本。管道不会阻塞redis。
Redis Lua脚本相关推荐
- Redis Lua脚本中学教程(下)
在中学教程的上半部分我们介绍了Redis Lua相关的命令,没有看过或者忘记的同学可以步行前往直接使用机票Redis Lua脚本中学教程(上).今天我们来简单学习一下Lua的语法. 在介绍Lua语法之 ...
- 高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
文章目录 导读 概述 实现步骤 注解方式配置 Redis lua脚本和异步持久化功能的开发 Service层添加Redis抢红包的逻辑 Controller层新增路由方法 构造模拟数据,测试 代码 总 ...
- Redis Lua脚本大学教程
前面我们已经把Redis Lua相关的基础都介绍过了,如果你可以编写一些简单的Lua脚本,恭喜你已经可以从Lua中学毕业了. 在大学课程中,我们主要学习Lua脚本调试和Redis中Lua执行原理两部分 ...
- 一网打尽Redis Lua脚本并发原子组合操作
1. 前言 Redis 是高性能的 KV 内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO 地理位置信息计算.Redis 提供了丰富的命令来供我们使用以实现一 ...
- Redis Lua脚本的详细介绍以及使用入门
Redis Lua脚本的详细介绍以及使用入门. 文章目录 Redis Lua脚本的引入 开源软件的可扩展性 Redis的扩展性脚本 Redis Lua脚本的基本使用 通过EVAL命令执行Lua脚本 通 ...
- Redis Lua 脚本常用操作总结及实现 CAS 操作
一.什么是 Lua ? Lua 是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由 R ...
- 深入分析 Redis Lua 脚本运行原理
Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执 ...
- Redis Lua脚本实现原子性操作
一.简介 redis操作时单线程的,平常如果想要redis原子性操作的话,可以使用incrBy()和decrBy()方法进行原子性的加减,但是对于事务性的逻辑操作,没有办法实现原子性,Redis 使用 ...
- Redis Lua脚本中学教程(上)
失踪人口回来啦! 有读者问我为什么这么久都没有出Redis Lua中学教程,表示村头厕所已经好久没有纸了.其实我早就要写这篇中学教程了,奈何最近太忙了,就一拖再拖,直到今天我终于又开始动笔了.忘记Lu ...
- 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本
对别人的意见要表示尊重.千万别说:"你错了."--卡耐基 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提 ...
最新文章
- 中级实训第一天的自学报告
- Window CMD快捷键
- java简述对象的组合_Java程序运行和对象创建过程简述
- SqlServer2014怎样还原数据库
- 指针,c语言关键字,作用域,生命周期,内存数据存储
- Qt工作笔记-在ListWidget中多线程检索数据
- Sql中partition by的使用
- 今晚直播丨手把手安装搭建GoldenDB
- shell grep cut 【整理】
- 4Python全站之路系列之正则表达式re模块
- Petrozavodsk Winter-2018. Carnegie Mellon U Contest
- 模板引擎-1-基础概念和是使用小案例
- 三菱PLC史上最全视频教程!(视频+数据+例程)
- APP推广工具(总结)
- 使用java编写中国象棋(内含源代码)
- .net性能最高的EF分页写法
- 照片后期-lightroom常用调色常见参数解
- 名片管理系统java_java毕业设计_springboot框架的名片管理系统
- BAT后台开发 两年工作经历总结
- python %f %e %g