• Redis中lua脚本的配合使用


    1.说明

    KEYS[1] 用来表示在redis 中用作键值的参数占位,主要用來传递在redis 中用作keyz值的参数。

    ARGV[1] 用来表示在redis 中用作参数的占位,主要用来传递在redis中用做 value值的参数。

    2.代码范例

    2.1 释放redis锁

    public boolean releaseDistributedLock(String lockKey, String requestId) {
            try(Jedis resource = jedisPool.getResource()) {
                String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
                Object result = resource.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
                return RELEASE_SUCCESS.equals(result);
            }
        }
    

    其中KEYS[1]指的是Collections.singletonList(lockKey)这个列表里面的第一个数据
    其中ARGV[1]指的是Collections.singletonList(requestId)这个列表里面的第一个数据

    2.2 redisson调用lua脚本实现封装的数据结构RSetMultimapCache<String, String>的putAll方法

    @Override
        public RFuture<Boolean> putAllAsync(K key, Iterable<? extends V> values) {
            List<Object> params = new ArrayList<Object>();
            ByteBuf keyState = encodeMapKey(key);
            params.add(keyState);
            String keyHash = hash(keyState);
            params.add(keyHash);
            for (Object value : values) {
                ByteBuf valueState = encodeMapValue(value);
                params.add(valueState);
            }
    
            String setName = getValuesName(keyHash);
            return commandExecutor.evalWriteAsync(getRawName(), codec, RedisCommands.EVAL_BOOLEAN_AMOUNT,
                    "redis.call('hset', KEYS[1], ARGV[1], ARGV[2]); " +
                    "return redis.call('sadd', KEYS[2], unpack(ARGV, 3, #ARGV)); ",
                Arrays.<Object>asList(getRawName(), setName), params.toArray());
        }
    
  • 相关阅读:
    jquery学会的
    oracle技巧-持续更新
    c语言技巧--长期更新
    2019暑假集训 最大子树和
    2019暑假集训 细胞分裂
    2019暑假集训 金明的预算方案
    2019暑假集训 能量项链
    2019暑假集训 神经网络
    0023-特殊的方程
    0022-并联电阻
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/16180073.html
Copyright © 2020-2023  润新知