Redis lua脚本应用

  高并发情况下对缓存进行读取-修改操作时,需要原子性操作,Redis本身提供一个一些命令,例如incrby、hincrby自增(减)命令,但是这些命令在有些业务中不适用,这种情况下就可以使用lua脚本来实现多命令的执行(读、写);

  以下lua脚本,通常lua脚本只需要加载一次,然后使用redis返回的hash值进行操作;

local local = redis.call(‘exists‘, KEYS[1])
if tonumber(local) == 0 then
    return false
end
if tonumber(redis.call(‘get‘, KEYS[1])) <= 0 then
    return false
end
if tonumber(ARGV[1]) > 0 then
    redis.call(‘incrby‘, KEYS[1], ARGV[1])
    return true
else
    if tonumber(redis.call(‘get‘, KEYS[1])) >= tonumber(ARGV[1]) then
        redis.call(‘incrby‘, KEYS[1], ARGV[1])
        return true
    else
        return
false
end end

该脚本实现了对库存的读取和修改,该脚本可以在resources文件夹进行统一管理;

在java代码中:

  

        try {
        DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("/limit.lua")));
        redisScript.setResultType(Boolean.class);

        return redisTemplate.execute(redisScript, Collections.singletonList(key), String.valueOf(mlitimes), String.valueOf(maxCount));

        } catch (IOException e) {
            e.printStackTrace();
        }

重点:在集群模式下,如果只在某个节点上传了脚本,在其他节点中会找不到,因此需要判断脚本是否存在,如果不存在,重新上传lua脚本。

原文地址:https://www.cnblogs.com/use-D/p/11746280.html

时间: 2024-07-30 18:39:22

Redis lua脚本应用的相关文章

Redis Lua 脚本使用

Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 Lua 的示例,里面注释部分会讲解相关的作用: -- -- -- 拿客 -- 网站:www.coderknock.com -- QQ群:213732117 -- 三产 创建于 2017年06月15日 12:04:54. -- 描述: -- -- local strings website = "coderknock.com" print(we

Redis进阶应用:Redis+Lua脚本实现复合操作

一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Redis已成为当前架构设计中的首选key-value存储系统. 虽然Redis官网上提供了200多个命令,但做程序设计时还是避免不了为了实现一小步业务逻辑而多次调用Redis的情况. 以compare and set场景为例.如果使用Redis原生命令,需要从Redis中获取这个key,然后提取其中的

像调试java一样来调试Redis lua

高并发的系统中,redis的使用是非常频繁的,而lua脚本则更是锦上添花.因为lua脚本本身执行的时候是一个事务性的操作,不会掺杂其他外部的命令,所以很多关键的系统节点都会用redis+lua来实现一致性的操作请求.但是在实际开发过程中,由于redis lua脚本调试难的问题,导致大量的时间耗费在了这上面.如果有什么方案能够让我们像利用IDEA调试java一样简便去调试redis lua脚本,那该是很幸福的事儿了. 通过不断的寻找,终于也找到了这种方式,下面就总体的来介绍一下. 1. 下载Zer

redis限速器设计(不使用lua脚本及事物)

公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器. 首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例 FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+":"+ts current = GET(keyname) IF current != N

Redis源码学习-Lua脚本

Redis源码学习-Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开发环境搭建>. 要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会

《Redis设计与实现》学习笔记-Lua脚本

Redis从2.6开始支持Lua脚本,和事务的功能类似,可以通过Lua脚本原子的执行多个Redis命令.Redis提供了EVAL和EVALSHA命令执行lua脚本. 创建并修改Lua坏境 Redis在服务器内嵌了一个Lua坏境,并进行了一系列的修改,从而确保这个Lua坏境可以满足Redis服务器的需要,通过下列步骤创建并修改Lua坏境: 创建一个基础Lua坏境,通过调用Lua的C API函数lua_open. 载入多个函数库到Lua坏境中,让Lua脚本可以使用这些函数来进行数据操作.包括Lua核

Redis 的 Lua 脚本支持

Redis 2.6.0 内置的Lua Script支持,可以在Redis的Server端一次运行大量逻辑. 整个Script默认是在一个事务里的. Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key. EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值.然后用EVALHASH执行. 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串. 参考:http://www.searchdata

Redis集成Lua脚本实现

作者:zhanhailiang 日期:2014-12-02 相关依赖 1. 环境部署 Redis安装配置教程及phpredis扩展安装测试 Redis安装以及php扩展 Windows下安装phpredis模块(当前Window环境下的php_redis.dll基本还是2.1.3,而Linux下的redis.so版本已经到了2.2.5,这可能导致部分指令集的支持程度不同) 2. Redis指令手册 php-redis中文帮助手册.chm(这份手册相对较旧,请参照Redis Commands) R

Php+Redis 实现Redis提供的lua脚本功能

<?php require_once "predis-0.8/autoload.php"; $config['schema'] = 'tcp'; $config['host']= "192.168.1.7"; $config['port'] = 6379; $redis = new Predis\Client($config); class wode extends Predis\Command\ScriptedCommand { public functio