2017-02-08 2 views
0

저는 Redis를 처음 사용하고 있으며 Redis 트랜잭션을 실험 중이므로 다음 시나리오에서 Redis 트랜잭션을 사용하려고합니다. 다음을 수행하는 것이 가능한지 알아야합니다.Java Redis (jedis) 트랜잭션 및 정렬 된 집합

  1. 거래 시작.
  2. 정렬 된 집합에서 상위 10 개 요소를 읽습니다.
  3. 각 요소에 대해 '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

루아와 EXEC로 redis-site를 보았습니까? –

+0

예, 지금 해보기입니다. 파이프 라인 및 트랜잭션을 사용하여 무언가를 얻으려고했다. – face

+0

데이터를 반복 할 수 있으려면 클라이언트 측에서 2 단계로 수행하거나 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(); 
}