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