首页 > 数据库 >在java中使用lua脚本操作redis

在java中使用lua脚本操作redis

时间:2023-05-20 23:33:36浏览次数:48  
标签:return redis redisScript current lua key java DefaultRedisScript

前言

众所周知,redis可以执行lua脚本,至于为什么要用lua脚本来操作redis,自行百度咯

开始

Bean类

package cn.daenx.myadmin.common.config.redis;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.script.DefaultRedisScript;


/**
 * Redis LUA脚本
 *
 * @author DaenMax
 */
@Configuration
public class RedisScript {

    /**
     * 限流脚本
     *
     * @return
     */
    @Bean
    public DefaultRedisScript<Long> limitScript() {
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(limitScriptText());
        redisScript.setResultType(Long.class);
        return redisScript;
    }

    private String limitScriptText() {
        return "local key = KEYS[1]\n" +
                "local count = tonumber(ARGV[1])\n" +
                "local time = tonumber(ARGV[2])\n" +
                "local current = redis.call('get', key);\n" +
                "if current and tonumber(current) > count then\n" +
                "    return tonumber(current);\n" +
                "end\n" +
                "current = redis.call('incr', key)\n" +
                "if tonumber(current) == 1 then\n" +
                "    redis.call('expire', key, time)\n" +
                "end\n" +
                "return tonumber(current);";
    }

    /**
     * 邮箱轮询队列脚本
     *
     * @return
     */
    @Bean
    public DefaultRedisScript<String> nextEmailScript() {
        DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(nextEmailScriptText());
        redisScript.setResultType(String.class);
        return redisScript;
    }

    private String nextEmailScriptText() {
        return "local key = KEYS[1];\n" +
                "local email= redis.call('rpop',key);\n" +
                "redis.call('lpush',key,email);\n" +
                "return email;";
    }
}

使用

    @Resource
    private RedisTemplate redisTemplate;
    //限流脚本
    @Resource
    private RedisScript<Long> limitScript;
    //邮箱轮询队列脚本
    @Resource
    private RedisScript<String> nextEmailScript;

    /**
     * 测试
     *
     * @return
     */
    @GetMapping("/test")
    public void test() {
        //自己转换类型
        Object execute = redisTemplate.execute(nextEmailScript, CollUtil.newArrayList(SystemConstant.EMAIL_POLL_KEY), "");
        Object execute1 = redisTemplate.execute(limitScript, CollUtil.newArrayList("1"), 2, 3);
        
    }

标签:return,redis,redisScript,current,lua,key,java,DefaultRedisScript
From: https://www.cnblogs.com/daen/p/17418024.html

相关文章

  • Java-Day-23( 线程二:线程终止 + 常用方法 + 用户线程 + 守护线程 + 线程生命周期 + Syn
    Java-Day-23线程终止setLoop()基本说明当线程完成任务后,会自动退出还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式练习使用publicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Tt1=newT();......
  • Java 网络编程 —— 实现非阻塞式的客户端
    创建阻塞的EchoClient客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求publicclassEchoClient{privateSocketChannelsocketChannel=null;publicEchoClient()throwsIOException{socketChannel......
  • redis-cli 使用lua脚本笔记
    前言众所周知,redis可以执行lua脚本,至于为什么要用lua脚本来操作redis,自行百度咯先来讲一下最简单的方式,关于如何在javaspringboot里用lua脚本,请查看我另一篇文章:https://www.cnblogs.com/daen/p/17418024.html更为详细的资料请参考以下文章https://blog.csdn.net/jiayibingd......
  • 关于Java接口实现问题
    publicinterfaceInterfaceClass{/***jdk1.7只能有抽象方法,子类是**抽象类**时,方法就可以实现也可以不实现*/publicabstractvoidmethod();/***jdk1.8新增静态方法,默认方法**静态方法子类不能实现*/publicstaticvoidmethod1(){}/**......
  • golang操作redis
    首先,基于docker查看redis镜像dockerps-a然后执行dockerrun-p6379:6379-dredis:latestredis-server,将端口映射到本机最后执行dockerexec-ti13e638ea1036redis-cli-h0.0.0.0-p6379执行链接操作......
  • redis学习3linux--黑马
    持久化RDBsavebgsave工作原理bgsave->发送指令到redis,redis返回Backgroundsavingstarted给客户端,然后调用fork函数生成子进程,子进程创建rdb文件,成功后返回消息给redis,可通过日志文件查看bgsave命令时针对save阻塞问题的优化。Reids内部所有涉及到RDB操作都采用bgsave的方......
  • Redis笔记(六):Redis订阅发布
    CommandsSUBSCRIBEchannel[channel...]PUBLISHchannelmessageUNSUBSCRIBE[channel[channel...]]PSUBSCRIBEpattern[pattern...]正则订阅PUBSUBsubcommand[argument[argument...]]查看订阅与发布系统状态PUNSUBSCRIBE[pattern[pattern...]]退订所有给......
  • 【≅Redis】BitMap类型介绍
    BitMap(2.2版新增)Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计......
  • Java中的包
    Java中的包包就是文件夹,用来管理各种不同的java类,方便后期维护规则:公司域名反写+包的作用,全部英文小写全类名:包名+类名 注意:使用同一个包中的类时,不需要导包使用java.lang包中的类时,不需要导包其他情况都需要导包如果同时使用两个包中的同名类,需要全类名......
  • java 实现对象排序,实现java对象排序的三种方式
    1.自然排序:要排序的对象类实现Comparable<>接口,重写其compareTo()方法,方法体中实现对象的比较大小规则2.自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能,里面......