1. 程式人生 > >redis指令碼執行,讓原子操作更簡單

redis指令碼執行,讓原子操作更簡單

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<String> 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);
    }