redis腳本執行,讓原子操做更簡單

redis支持腳本lua執行,因爲redis單線程特性,全部腳本中的全部操做能作到原子操做。java

相對於事務,腳本支持條件判斷執行操做。好比 if  else。在分佈式的環境了能夠省掉不少加分佈式鎖的麻煩。redis

如下是在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);
    }
相關文章
相關標籤/搜索