redis脚本执行,让原子操作更简单

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

redis支持脚本lua执行,由于redis单线程特性,所有脚本中的所有操作能做到原子操作。

相对于事务,脚本支持条件判断执行操作。比如 if  else。在分布式的环境了可以省掉很多加分布式锁的麻烦。

以下是在reidsTemplate通过脚本实现zaddNX方法的一个简单例子。 jedis实现方法类似主要在于lua脚本编写,具体语法可以百度

/**
     * 如果currentMemeber不存在才添加targetMember,反之忽略
     * @param key
     * @param currentMember
     * @param targetMember
     * @param score
     * @return
     */
    public int zaddNX(String key,String currentMember,String targetMember,double score){
        String str = "local times = redis.call('zscore',KEYS[1],KEYS[2]) if times then return '0' else redis.call('zadd',KEYS[1], ARGV[3], KEYS[3]) return '1' end";
        DefaultRedisScript script = new DefaultRedisScript(str);
        script.setResultType(String.class);
        List keys = new ArrayList();
        keys.add(key);
        keys.add(currentMember);
        keys.add(targetMember);
        String rs = redisTemplate.execute(script,new StringRedisSerializer(),new StringRedisSerializer(),keys,"0","",String.valueOf(score));
        return Integer.valueOf(rs);
    }

 

 

转载于:https://my.oschina.net/u/3783256/blog/3057264

你可能感兴趣的:(redis脚本执行,让原子操作更简单)