zoukankan      html  css  js  c++  java
  • Java架构笔记-SpringBoot使用Lua脚本操作Redis

    本文介绍SpringBoot如果通过Lua脚本去执行Redis,介绍简单用法例子,如对Lua脚本还不了解的可以先参考我这边文章Lua脚本快速入门更深层次的用法请参考Redis官网

    1. 添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    2. 编写Lua脚本

    ---
    --- Created by Gjing.
    --- DateTime: 2019/6/21 10:49
    ---
    --- 获取key
    local key = KEYS[1]
    --- 获取value
    local val = KEYS[2]
    --- 获取一个参数
    local expire = ARGV[1]
    --- 如果redis找不到这个key就去插入
    if redis.call("get", key) == false then
        --- 如果插入成功,就去设置过期值
        if redis.call("set", key, val) then
            --- 由于lua脚本接收到参数都会转为String,所以要转成数字类型才能比较
            if tonumber(expire) > 0 then
                --- 设置过期时间
                redis.call("expire", key, expire)
            end
            return true
        end
        return false
    else
        return false
    end

    3. 编写配置

    /**
     * @author Gjing
     **/
    @Configuration
    public class LuaConfiguration {
        @Bean
        public DefaultRedisScript<Boolean> redisScript() {
            DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
            redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/Test.lua")));
            redisScript.setResultType(Boolean.class);
            return redisScript;
        }
    }

    4. 调用测试

    /**
     * @author Gjing
     **/
    @RestController
    public class LockController {
        @Resource
        private DefaultRedisScript<Boolean> redisScript;
        @Resource
        private StringRedisTemplate stringRedisTemplate;
    
        @GetMapping("/lua")
        public ResponseEntity lua() {
            List<String> keys = Arrays.asList("testLua", "hello lua");
            Boolean execute = stringRedisTemplate.execute(redisScript, keys, "100");
            assert execute != null;
            return ResponseEntity.ok(execute);
        }
    }

    5. 返回结果

    • 执行成功控制台输出

    • 执行失败控制台输出

     

    • Redis中内容

    6. Redis使用Lua的好处

    1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
    2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
    3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

    7. Redis使用Lua的注意点

    1.Lua脚本的bug特别可怕,由于Redis的单线程特点,一旦Lua脚本出现不会返回(不是返回值)得问题,那么这个脚本就会阻塞整个redis实例。
    2.Lua脚本应该尽量短小实现关键步骤即可。(原因同上)
    3.Lua脚本中不应该出现常量Key,这样会导致每次执行时都会在脚本字典中新建一个条目,应该使用全局变量数组KEYS和ARGV, KEYS和ARGV的索引都从1开始
    4.传递给lua脚本的的键和参数:传递给lua脚本的键列表应该包括可能会读取或者写入的所有键。传入全部的键使得在使用各种分片或者集群技术时,其他软件可以在应用层检查所有的数据是不是都在同一个分片里面。另外集群版redis也会对将要访问的key进行检查,如果不在同一个服务器里面,那么redis将会返回一个错误。(决定使用集群版之前应该考虑业务拆分),参数列表无所谓。。
    5.lua脚本跟单个redis命令和事务段一样都是原子的已经进行了数据写入的lua脚本将无法中断,只能使用SHUTDOWN NOSAVE杀死Redis服务器,所以lua脚本一定要测试好。

     

  • 相关阅读:
    吴裕雄--天生自然JAVA开发JSP-SERVLET学习笔记:解决启动TOMCAT服务器乱码问题
    吴裕雄--天生自然JAVA开发JSP-SERVLET学习笔记:配置TOMCAT服务器
    吴裕雄--天生自然JAVA开发JSP-SERVLET学习笔记:修改服务器端口
    吴裕雄--天生自然JAVA开发JSP-SERVLET学习笔记:解决服务端口8080被占用的问题
    css 背景色渐变---和背景色透明
    nodePPT 这可能是迄今为止最好的网页版PPT
    正则表达式匹配
    WdatePicker.js 日历点击时,触发自定义方法 ,可以调用自己的函数。
    html 实时监控发送数据
    [转]使用onclick跳转到其他页面/跳转到指定url
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/15014417.html
Copyright © 2011-2022 走看看