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脚本相关推荐

  1. Redis Lua脚本中学教程(下)

    在中学教程的上半部分我们介绍了Redis Lua相关的命令,没有看过或者忘记的同学可以步行前往直接使用机票Redis Lua脚本中学教程(上).今天我们来简单学习一下Lua的语法. 在介绍Lua语法之 ...

  2. 高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库

    文章目录 导读 概述 实现步骤 注解方式配置 Redis lua脚本和异步持久化功能的开发 Service层添加Redis抢红包的逻辑 Controller层新增路由方法 构造模拟数据,测试 代码 总 ...

  3. Redis Lua脚本大学教程

    前面我们已经把Redis Lua相关的基础都介绍过了,如果你可以编写一些简单的Lua脚本,恭喜你已经可以从Lua中学毕业了. 在大学课程中,我们主要学习Lua脚本调试和Redis中Lua执行原理两部分 ...

  4. 一网打尽Redis Lua脚本并发原子组合操作

    1. 前言 Redis 是高性能的 KV 内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO 地理位置信息计算.Redis 提供了丰富的命令来供我们使用以实现一 ...

  5. Redis Lua脚本的详细介绍以及使用入门

    Redis Lua脚本的详细介绍以及使用入门. 文章目录 Redis Lua脚本的引入 开源软件的可扩展性 Redis的扩展性脚本 Redis Lua脚本的基本使用 通过EVAL命令执行Lua脚本 通 ...

  6. Redis Lua 脚本常用操作总结及实现 CAS 操作

    一.什么是 Lua ?   Lua 是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由 R ...

  7. 深入分析 Redis Lua 脚本运行原理

    Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执 ...

  8. Redis Lua脚本实现原子性操作

    一.简介 redis操作时单线程的,平常如果想要redis原子性操作的话,可以使用incrBy()和decrBy()方法进行原子性的加减,但是对于事务性的逻辑操作,没有办法实现原子性,Redis 使用 ...

  9. Redis Lua脚本中学教程(上)

    失踪人口回来啦! 有读者问我为什么这么久都没有出Redis Lua中学教程,表示村头厕所已经好久没有纸了.其实我早就要写这篇中学教程了,奈何最近太忙了,就一拖再拖,直到今天我终于又开始动笔了.忘记Lu ...

  10. 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本

    对别人的意见要表示尊重.千万别说:"你错了."--卡耐基 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提 ...

最新文章

  1. 中级实训第一天的自学报告
  2. Window CMD快捷键
  3. java简述对象的组合_Java程序运行和对象创建过程简述
  4. SqlServer2014怎样还原数据库
  5. 指针,c语言关键字,作用域,生命周期,内存数据存储
  6. Qt工作笔记-在ListWidget中多线程检索数据
  7. Sql中partition by的使用
  8. 今晚直播丨手把手安装搭建GoldenDB
  9. shell grep cut 【整理】
  10. 4Python全站之路系列之正则表达式re模块
  11. Petrozavodsk Winter-2018. Carnegie Mellon U Contest
  12. 模板引擎-1-基础概念和是使用小案例
  13. 三菱PLC史上最全视频教程!(视频+数据+例程)
  14. APP推广工具(总结)
  15. 使用java编写中国象棋(内含源代码)
  16. .net性能最高的EF分页写法
  17. 照片后期-lightroom常用调色常见参数解
  18. 名片管理系统java_java毕业设计_springboot框架的名片管理系统
  19. BAT后台开发 两年工作经历总结
  20. python %f %e %g

热门文章

  1. mathtype 转换 matlab,MathType和Mathematica之间如何相互转换
  2. photoshop 插件_Photoshop的线性光
  3. 2021编辑器Eclipse汉化中文教程
  4. 腾讯微博开放平台API相关经验--部署到服务器返回值为乱码问题
  5. 如何在校外下载期刊全文
  6. 中国移动彩信业务资料集合
  7. 7. namp工具的基础了解
  8. 10位Swift和iOS开发大师
  9. 计算机快捷键屏幕保护是什么,电脑屏保快捷键.pptx
  10. 10 GridView 样式属性