2017-02-08 16 views
0

Я новичок в Redis, и я экспериментирую с транзакциями Redis, и я хочу использовать транзакции Redis в следующем сценарии. Необходимо знать, если это осуществимо для этого:Операция транзакции Java Redis (jedis) и отсортированный набор

  1. Start Transaction.
  2. Прочтите 10 лучших элементов из отсортированного набора.
  3. A 'for loop' для каждого из элементов, чтобы что-то сделать.
  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

Вы посмотрели, как сделать это redis-site с Lua и EXEC? –

+0

Да, это хак, который я сейчас пытаюсь сделать. Был надеется получить что-то, используя Pipelining and Transactions. – 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(); 
}