redis

lua脚本实现redis当当前值等于期望值时删除key

2021-07-13  本文已影响0人  爱的旋转体

1、lua脚本cad.lua

local current = redis.call('get', KEYS[1]);
if current == false then
    return nil;
end
if current == ARGV[1] then
    return redis.call('del', KEYS[1]);
else
    return 0;
end

2、RedisLuaUtil.java
1)直接在代码中写lua脚本字符串

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * redis lua工具类
 * @author xuzhipeng
 * @date 2021/01/31
 */
@Component
public class RedisLuaUtil {

    private static final Logger log = LoggerFactory.getLogger(RedisLuaUtil.class);

    private static final String LUA_SCRIPT_CAD = "local current = redis.call('get', KEYS[1]);" +
            "if current == false then " +
            "    return nil;" +
            "end " +
            "if current == ARGV[1] then " +
            "    return redis.call('del', KEYS[1]);" +
            "else " +
            "    return 0;" +
            "end";

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 比较并删除
     * @param key
     * @param expect
     * @return 当key不存在时返回null;key存在,当前值=期望值时,删除key;key存在,当前值!=期望值时,返回0;
     */
    public Long cad(String key,String expect){
        List<String> keyList = new ArrayList<>();
        keyList.add(key);
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(LUA_SCRIPT_CAD,Long.class);
        Long result = null;
        try {
            result = stringRedisTemplate.execute(redisScript,keyList,expect);
        } catch (Exception e) {
            log.error("cad异常",e);
        }
        return result;
    }
}

2)引用lua脚本文件

    /**
     * 比较并删除
     * @param key
     * @param expect
     * @return 当key不存在时返回null;key存在,当前值=期望值时,删除key;key存在,当前值!=期望值时,返回0;
     */
    public Long cad(String key,String expect){
        List<String> keyList = new ArrayList<>();
        keyList.add(key);
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/cad.lua")));
        redisScript.setResultType(Long.class);
        Long result = null;
        try {
            result = stringRedisTemplate.execute(redisScript,keyList,expect);
        } catch (Exception e) {
            log.error("cad异常",e);
        }
        return result;
    }
上一篇下一篇

猜你喜欢

热点阅读