首页 > 数据库 >redisson对单个json的单个字段进行数值操作 - lua脚本

redisson对单个json的单个字段进行数值操作 - lua脚本

时间:2023-06-30 14:33:07浏览次数:60  
标签:redisson String ARGV lua json limit 单个 tonumber local

    @Override
    public String updateJson(String key, String field, long num, long limit) {
        String script = "local t = redis.call('get', KEYS[1]);\n" +
                "local j;\n" +
                "if t then j = cjson.decode(t); else j = cjson.decode(\"{}\"); end;\n" +
                "local n;\n" +
                "if j[ARGV[3]] then n = tonumber(j[ARGV[3]]); else n = 0 end;\n" +
                "local r = n + tonumber(ARGV[1]);\n" +
                "local limit = tonumber(ARGV[2]);\n" +
                "if r >= 0 and (limit < 0 or r <= limit) then j[ARGV[3]] = r; " +
                "redis.call('set', KEYS[1], cjson.encode(j)); end;\n" +
                "j[ARGV[3]] = r;" +
                "return cjson.encode(j);";
        RScript rscript = redissonClient.getScript();
        return rscript.eval(RScript.Mode.READ_WRITE, script, RScript.ReturnType.VALUE,
                Collections.singletonList(key), num, limit, field);
    }

    @Override
    public String hUpdateJson(String key, String uid, String field, long num, long limit) {
        String script = "local t = redis.call('hget', KEYS[1], ARGV[4]);\n" +
                "local j;\n" +
                "if t then j = cjson.decode(t); else j = cjson.decode(\"{}\"); end;\n" +
                "local n;\n" +
                "if j[ARGV[3]] then n = tonumber(j[ARGV[3]]); else n = 0 end;\n" +
                "local r = n + tonumber(ARGV[1]);\n" +
                "local limit = tonumber(ARGV[2]);\n" +
                "if r >= 0 and (limit < 0 or r <= limit) then j[ARGV[3]] = r; " +
                "redis.call('hset', KEYS[1], ARGV[4], cjson.encode(j)); end;\n" +
                "j[ARGV[3]] = r;" +
                "return cjson.encode(j);";
        RScript rscript = redissonClient.getScript();
        return rscript.eval(RScript.Mode.READ_WRITE, script, RScript.ReturnType.VALUE,
                Collections.singletonList(key), num, limit, field, uid);
    }

返回值:整个json数据,(注意:即使更新失败也会返回失败后的值,用于对当前情况的判断)

标签:redisson,String,ARGV,lua,json,limit,单个,tonumber,local
From: https://www.cnblogs.com/math-and-it/p/17516729.html

相关文章

  • 基于SpringBoot整合Redisson的延迟队列
    一、需求:     1.订单下单超过30分钟以后,如果还未支付,则自动转为取消支付状态 2.订单收货超过七天以后,如果还未评价,则自动转为好评 3.等类似需求二、实现步骤:    1. 引入redisson依赖<dependency><groupId>org.rediss......
  • Lua 中最重要的数据结构:表(Table)
    楔子本次来介绍一下Lua中的表(Table),表是Lua语言中最主要(事实上也是唯一)的数据结构,表既可以当做数组来用,也可以当成哈希表来用。这个和Python中的字典非常类似,比如我们之前用查看变量类型的math.type,本质上就是以字符串"type"来检索表math。而在Python中,比如调用math.......
  • 【五期邹昱夫】CCF-B(IEEE Access'19)Badnets: Evaluating backdooring attacks on deep
    "Gu,Tianyu,etal."Badnets:Evaluatingbackdooringattacksondeepneuralnetworks."IEEEAccess7(2019):47230-47244."  本文提出了外包机器学习时选择值得信赖的提供商的重要性,以及确保神经网络模型安全地托管和从在线存储库下载的重要性。并展示了迁移学习场......
  • 聊一聊 Lua 的基础数据类型:数值、布尔、字符串
    楔子任何一门语言都提供了不同类型的数据结构,那么Lua中都有哪些数据结构呢?nil:空boolean:布尔类型,分别是true和falsenumber:数值类型,整型和浮点型都属于numberstring:字符串table:表function:函数userdata:用户数据thread:线程Lua总共提供了以上8种数据类型,目前只需要......
  • Lua 是怎么执行代码的?初识 Lua
    楔子下面我们来一起学习一下Lua语言,相信很多人都听说过它,Lua是一种可嵌入、轻量、快速、功能强大的脚本语言,使用较为广泛,主要用在游戏领域。另外,基于Nginx的OpenResty也是使用Lua来编写脚本的,很多存储框架(如Redis)也支持使用Lua来编写脚本。作为一门诞生已经超过20......
  • nvim copilot.lua
    超简单配置AI加持的VIM,Nvim+Copilot_哔哩哔哩_bilibili》:Copilotauth   ......
  • Automatic quality of generated text Evaluation for Large Language Models,针对大模
    一、LLM生成结果自动化评测的技术挑战和研发背景LargeLanguageModels(LLMs)haverecentlygrownrapidlyandtheyhavethepotentialtoleadtheAItransformation.ItiscriticaltoevaluateLLMsaccuratelybecause: Highqualityrequirementsforgenerativere......
  • govaluate - 规则引擎
    packagemainimport( "fmt" "github.com/Knetic/govaluate")//github//https://github.com/Knetic/govaluate//双引号内为规则算式//单引号表示字符串//无引号表示变量,变量必须在传入的参数中存在//判断相等或不等:==!=//"foo=='bar'"-->变量foo......
  • Lua 数据库访问
    Lua数据库访问本文主要为大家介绍Lua数据库的操作库:LuaSQL。他是开源的,支持的数据库有:ODBC,ADO,Oracle,MySQL,SQLite和PostgreSQL。本文为大家介绍MySQL的数据库连接。LuaSQL可以使用LuaRocks来安装可以根据需要安装你需要的数据库驱动。LuaRocks安装方法:$wget......
  • Lua 错误处理
    Lua错误处理程序运行中错误处理是必要的,在我们进行文件操作,数据转移及webservice调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况。任何程序语言中,都需要错误处理。错误类型有:语法错误运行错误语法错误语法错误通常......