【问题标题】:Java Redis (jedis) transaction and Sorted SetJava Redis (jedis) 事务和排序集
【发布时间】:2017-03-29 15:58:01
【问题描述】:

我是 Redis 新手,我正在试验 Redis 事务,我想在以下场景中使用 Redis 事务。需要知道这样做是否可行:

  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.

有没有办法解决这个问题?

【问题讨论】:

  • 你有没有考虑过用 Lua 和 EXEC 做 redis-site ?
  • 是的,这就是我现在正在尝试的 hack。希望使用流水线和事务获得一些东西。
  • 由于您需要能够对其进行迭代的数据,您要么必须在客户端分两个阶段进行,要么使用 Lua 服务器端。

标签: java transactions redis jedis


【解决方案1】:

您可以改用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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 2013-02-06
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2019-01-01
    • 2022-10-01
    相关资源
    最近更新 更多