redis指令碼執行,讓原子操作更簡單
阿新 • • 發佈:2019-06-02
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); }