我想实现一个“rpushnx”功能:
目前,代码片段就像这样:
if (!redis.exists(db, key)) {
synchronized (MyClass.class) {
if (!redis.exists(db, key)) redisClient.rpush(db, key, list);
}
}
但我认为这有点微不足道。
有没有更好的方法来完成它?
非常感谢提前。
答案 0 :(得分:2)
是的,还有更好的方法。如果您有一个多线程应用程序服务器,则您的解决方案可能会起作用,但它不适用于具有多个应用程序服务器的分布式系统。另外,当密钥不存在时,它需要3次往返。
利用Lua脚本可以更好地为您服务。 Redis总是以原子方式执行Lua脚本。
例如:
eval "if redis.call( 'EXISTS', KEYS[1] ) == 0 then redis.call( 'RPUSH', KEYS[1], unpack(ARGV) ) end" 1 mykey val1 val2 val3 val4