2017-02-08 4 views
0

Ich bin neu in Redis und ich experimentiere mit Redis-Transaktionen und ich möchte Redis-Transaktionen im folgenden Szenario verwenden. Sie müssen wissen, ob dies machbar ist:Java Redis (jedis) Transaktion und Sorted Set

  1. Starten Sie die Transaktion.
  2. Top 10 Elemente aus sortierten Satz lesen.
  3. Eine 'for-Schleife' für jedes der Elemente, um etwas zu tun.
  4. Ausführen.

Ich habe den folgenden Code versucht, aber es funktioniert nicht, wie ich eine <Response>.get() vor der Ausführung der Transaktion mache.

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. 

Gibt es eine Möglichkeit, dies zu umgehen?

+0

Haben Sie es bei redis-site mit Lua und EXEC gemacht? –

+0

Ja, das ist der Hack, den ich gerade versuche. Hoffte, etwas mit Pipelining und Transaktionen zu bekommen. – face

+0

Da Sie die Daten benötigen, um in der Lage zu sein, darüber zu iterieren, müssen Sie entweder in zwei Phasen Client-Seite tun, oder verwenden Sie Lua-Server-Seite. –

Antwort

0

Sie könnten stattdessen Redisson verwenden. Verwenden Sie Objekt sperren statt Transaktion. Beispiel für Ihren Fall:

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(); 
} 
Verwandte Themen