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