2017-04-14 82 views
1

我想實現一個「rpushnx」功能:有沒有更好的方法來實現redis「rpushnx」函數?

  1. 如果該鍵存在,什麼也不做。否則
  2. rpush字符串到列表中。
  3. 它是一個多線程環境。

目前,該代碼片段就像這樣:

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

但我認爲這是一個有點微不足道。

有沒有更好的方法來完成它?

非常感謝提前。

回答

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 
+0

最後我用 「zset」,而不是 「名單」,這解決了我的問題。還有什麼,我不熟悉Lua。 。無論如何感謝@Didier。 –

相關問題