luttuce(RedisTempate)实现hash expire lua脚本

话不多说先放脚本:

local argv = ARGV
local length = #argv
if length > 0 then  local unpackArgs = {}
for i = 1, length - 1 do
 table.insert(unpackArgs, argv[i])
end
if redis.call('exists', KEYS[1]) == 1 then
	redis.call('del', KEYS[1])
	redis.call('hset', KEYS[1], unpack(unpackArgs))
	redis.call('expire', KEYS[1], argv[length])
	return 1
else
	redis.call('hset', KEYS[1], unpack(unpackArgs))
	redis.call('expire', KEYS[1], ARGV[#ARGV])
	return 2
end
end

2.直接String 执行LUA脚本

  /**
     *  lua 脚本 实现物料key 的赋值
     * @param hashKey 物料key
     * @param fieldsAndValues lua 脚本参数
     * @return
     */
    public Long insertIntoHashWithExpireTime(String hashKey, Object... fieldsAndValues) {
        Long result = null;
        // unpack(ARGV)在Lua中是用来将数组解包成一系列单独的参数。
        // ARGV[#ARGV]获取的是传递给脚本的最后一个参数(在 Lua 中,# 操作符用于获取表中的元素数量。因此,ARGV[#ARGV] 将返回 ARGV 表中的最后一个元素。)
        // 请求案例:insertIntoHashWithExpireTimeIfKeyExists("myHash", "field1", "value1", "field2", "value2", 60);
        String luaScript =
                            "\nlocal argv = ARGV \n" +
                            "local length = #argv \n"+
                            // 将1 - n-1 的入参写入新的数组
                            "if length > 0 then  local unpackArgs = {} \n"  +
                                    "for i = 1, length - 1 do  \n" +
                                    " table.insert(unpackArgs, argv[i]) \n" +
                            "end\n" +
                            "if redis.call('exists', KEYS[1]) == 1 then \n" +
                                "\tredis.call('del', KEYS[1]) \n" +
                                "\tredis.call('hset', KEYS[1], unpack(unpackArgs)) \n" +
                                "\tredis.call('expire', KEYS[1], argv[length]) \n" +
                                "\treturn 1  \n" +
                            "else \n" +
                                "\tredis.call('hset', KEYS[1], unpack(unpackArgs)) \n" +
                                "\tredis.call('expire', KEYS[1], argv[length]) \n" +
                                "\treturn 2\n" +
                            "end \n" +
                            "end ";
        log.info("luaScript:{}", luaScript);
        try {
            DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
            redisScript.setResultType(Long.class);//返回类型是Long
            redisScript.setScriptText(luaScript);
            result = redisTemplate.execute(redisScript, Arrays.asList(hashKey), fieldsAndValues);
            log.debug("redisEVALLuaScript result :{}", result);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("e:", e);
        }
        return result;
    }
    @Test
    public void testLua(){
        String hashKey = "testHash";
        String field1 = "test3";
        String value1 = "vv1";
        String field2 = "test4";
        String value2 = "vv2";
        int expireTime = 10000;

        // 插入数据并设置过期时间
        redisUtils.insertIntoHashWithExpireTime(hashKey, field1, value1, field2, value2,expireTime);
    }

最终结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/246807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端自定义icon的方法(Vue项目)

第一步&#xff1a;进入在线的编辑器进行设计 好用&#xff1a;百度字体编辑器 比如先导入有个ttf文件 添加新字体 双击每个模块进入编辑区域 更改相应的信息&#xff0c;比如name 编辑完了进行导出文件(各种格式就行了)就行了 第二步&#xff1a;在项目中asset文件储存这些文…

十指波教育怎么样,课程是最新的吗

我们所有的课程内容&#xff0c;每年都会更新。 可以看一下我们的B站&#xff1a; 但是说到底&#xff0c;我们做私教服务 和那些传统的培训还是有很大区别。 传统培训机构不管线上还是线下主要是在卖一套课程的课程&#xff0c;可能是直播或者面授&#xff0c;你花钱买到的…

亚马逊云科技助力泡泡玛特快速部署全球弹性资源,打造国潮出海文化

企业全球化的终极目标就是品牌出海。1978年伴随着改革开放&#xff0c;中国企业开始放眼望世界输出中国产品&#xff0c;经过多年锤炼后&#xff0c;中国企业如TCL、泡泡玛特在不同的行业重塑版图&#xff0c;对外输出中国品牌&#xff0c;赢得了全球市场&#xff0c;中国企业实…

代码随想录算法训练营第52天| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

JAVA代码编写 300.最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1…

Talk | 上海交通大学魏思哲: CoBEVFlow-解决车-车/路协同感知的时序异步问题

本期为TechBeat人工智能社区第556期线上Talk。 北京时间12月14日(周四)20:00&#xff0c;上海交通大学硕士生—魏思哲的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “CoBEVFlow-解决车-车/路协同感知的时序异步问题”&#xff0c;介绍了他的团队…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年&#xff0c;Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识&#xff0c;而这些知识对旨在对用自然语言表达的高级、时…

初探栈溢出(上)

0x01 HEVD介绍 HEVD全称为HackSys Ex treme Vulnerable Drive&#xff0c;是一个项目&#xff0c;故意设计包含多种漏洞的驱动程序&#xff0c;旨在帮助安全爱好者来提升他们在内核层面的漏洞利用能力。 说白了&#xff0c;是一个内核漏洞的靶场。 项目地址&#xff1a;htt…

做数据分析为何要学统计学(10)——什么是回归分析

​回归分析&#xff08;regression analysis)是量化两种或两种以上因素/变量间相互依赖关系的统计分析方法。回归分析根据因素的数量&#xff0c;分为一元回归和多元回归分析&#xff1b;按因素之间依赖关系的复杂程度&#xff0c;可分为线性回归分析和非线性回归分析。我们通过…

没有数据线,在手机上查看电脑备忘录怎么操作

在工作中&#xff0c;电脑和手机是我最常用的工具。我经常需要在电脑上记录一些重要的工作事项&#xff0c;然后又需要在手机上查看这些记录&#xff0c;以便随时了解工作进展。但是&#xff0c;每次都需要通过数据线来传输数据&#xff0c;实在是太麻烦了。 有一次&#xff0…

探秘AI赋能的未来世界:CyberAI深度学习技术助力变革

CyberAI平台概述 随着AI技术的极速发展&#xff0c;AI能力正在助力产业加速场景化落地。CyberAI是数新网络面向开发者和企业的一站式AI数据科学平台&#xff0c;提供交互式和可视化建模服务&#xff0c;算法模型全生命周期管理。平台可帮助开发者快速开发AI应用&#xff0c;解…

全都没有问题(一)

字符指针与字符数组的区别与关系 EOF使用指北&#xff0c;南辕北辙&#xff01; #include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct LNode{char name[20];struct LNode *next; }LNode,*LinkList;int main() {char str1[20];char* …

基于若依搭建微服务nacos版本(ruoyi-Cloud)

说明&#xff1a;本文介绍基于Ruoyi-Cloud前后端分离nacos版本的微服务从0到1的搭建过程&#xff0c;是基于官方文档的补充说明&#xff0c;需要结合Ruoyi-Cloud的官方文档 https://doc.ruoyi.vip/ruoyi-cloud/ 如果直接查看官方文档便可成功部署&#xff0c;推荐直接看官方文档…

JS实现日历表

有需要的可以用一下&#xff0c;这是一个简单的demo. HTML&#xff1a; <table><thead><tr><th colspan"2"><span class"left"></span></th><th colspan"3"><span class"time"&g…

typedef的使用

在C语言中&#xff0c;有一个关键字叫做typedef&#xff0c;有些人对此感到很疑惑。不熟悉此知识的同学都会对编程失去细心&#xff0c;直接劝退&#xff08;因为之前我就是这样&#xff09;。、 因为好不容易认识了C语言中所有的关键字&#xff08;就是类型吧&#xff0c;像啥…

c语言:指针与数组

目录 使用指针访问数组 使用第一个元素获取数组首地址 使用数组名获取数组首地址 使用指针访问数组等价于下标访问 使用指针访问数组 指针类型的加减运算可以使指针内保存的首地址移动。指针类型加n后。首地址向后移动 n * 步长 字节。 指针类型减n后。首地址向前移动 n *…

Notion开源平替知识库软件AFFiNE本地部署与公网访问远程协作

文章目录 前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE5. 结语 前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署&#xff0c;并实现公网远程访问。AFFiNE 是一个全新的开源项目&#xff0c;旨…

LeetCode Hot100 148.排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head null)retur…

Linux NAPI ------------- epoll边缘触发模式

Linux处理网络数据包的一般流程 分组到达内核的时间是不可预测的。所有现代的设备驱动程序都使用中断来通知内核有分组到达。 网络驱动程序对特定于设备的中断设置了一个处理例程&#xff0c;因此每当该中断被引发时&#xff08;即分组到达&#xff09;&#xff0c;内核都调用…

【Sprin Aop基于注解简单案例之所有通知以及实现 快速复习Aop】

通知类型包括&#xff1a; ● 前置通知&#xff1a;Before 目标方法执行之前的通知 ● 后置通知&#xff1a;AfterReturning 目标方法执行之后的通知 ● 环绕通知&#xff1a;Around 目标方法之前添加通知&#xff0c;同时目标方法执行之后添加通知。 ● 异常通知&#xff1a;A…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…