Java Redis(jedis)事务和排序集

Java Redis(jedis)事务和排序集,java,transactions,redis,jedis,Java,Transactions,Redis,Jedis,我是Redis新手,正在尝试Redis事务,我想在下面的场景中使用Redis事务。需要知道这样做是否可行: 启动事务 读取排序集中的前10个元素 每个元素执行某项操作的“for循环” 执行 我尝试了以下代码,但在执行事务之前执行.get()时,它不起作用 final Transaction tx = jedis.multi(); final Response<Set<Tuple>> tuples = tx.zrangeByScoreWithScores("randomKe

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

  • 启动事务
  • 读取排序集中的前10个元素
  • 每个元素执行某项操作的“for循环”
  • 执行
  • 我尝试了以下代码,但在执行事务之前执行
    .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.
    
    final Transaction tx=jedis.multi();
    最终响应元组=tx.zrangebyscorewithcores(“随机键”,0d,100,0,10);
    for(最终元组Tuple:tuples.get()){
    绝地武士:增量(元组);
    }
    tx.exec()//希望get和SET在单个事务中发生。
    
    有办法解决这个问题吗?

    你可以用它来代替。使用锁对象而不是事务。您的案例示例:

    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();
    }
    
    RLock lock=redisson.getLock(“myLock”);
    lock.lock();
    试一试{
    集合条目=redisson.getScoredSortedSet(“randomKey”).entryRange(true,0,true,100,0,10);
    对于(最终计分条目:条目){
    redisson.getAtomicLong(entry.getValue()).incrementAndGet();
    }
    }最后{
    lock.unlock();
    }
    
    你看过用Lua和EXEC在redis网站上做这件事吗?是的,这就是我现在正在尝试的方法。我们希望通过管道和事务来获得一些东西。因为您需要数据来对其进行迭代,所以您必须在客户端分两个阶段进行,或者使用Lua服务器端。