有没有更好的方法来实现redis“rpushnx”功能?

时间:2017-04-14 07:16:07

标签: redis

我想实现一个“rpushnx”功能:

  1. 如果密钥存在,则不执行任何操作。其他
  2. 将字符串转到列表中。
  3. 这是一个多线程环境。
  4. 目前,代码片段就像这样:

        if (!redis.exists(db, key)) {
            synchronized (MyClass.class) {
                if (!redis.exists(db, key)) redisClient.rpush(db, key, list);    
            }
        }
    

    但我认为这有点微不足道。

    有没有更好的方法来完成它?

    非常感谢提前。

1 个答案:

答案 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