2017-02-08 85 views
0

我是Redis的新手,我正在嘗試使用Redis事務,並且希望在以下方案中使用Redis事務。需要知道這樣做是否可行:Java Redis(jedis)事務和排序集

  1. 開始交易。
  2. 從排序集中讀取前10個元素。
  3. A'for循環'爲每個元素做某事。
  4. 執行。

我試過下面的代碼,但它不能正常工作,因爲我在執行事務之前正在執行<Response>.get()

final Transaction tx = jedis.multi(); 
final Response<Set<Tuple>> tuples = tx.zrangeByScoreWithScores("randomKey", 0d, 100, 0, 10); 
for (final Tuple tuple : tuples.get()) { 
    jedis.incr(tuple); 
} 
tx.exec(); //In a hope that get and sets happen in a single transaction. 

有沒有辦法解決這個問題?

+0

你看着做與reda站點與Lua和EXEC嗎? –

+0

是的,這是我現在正在嘗試的黑客攻擊。希望使用Pipelining和事務來獲得一些東西。 – face

+0

由於您需要數據才能夠遍歷它,所以您必須在客戶端的兩個階段執行此操作,或者使用Lua服務器端。 –

回答

0

您可以改爲使用Redisson。使用Lock對象而不是事務。示例爲您的情況:

RLock lock = redisson.getLock("myLock"); 
lock.lock(); 
try { 
    Collection<ScoredEntry<V>> entries = redisson.getScoredSortedSet("randomKey").entryRange(true, 0, true, 100, 0, 10); 
    for (final ScoredEntry<V> entry : entries) { 
     redisson.getAtomicLong(entry.getValue()).incrementAndGet(); 
    } 
} finally { 
    lock.unlock(); 
}