增量redis计数器仅在键唯一时用作值

qni6mghb  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(676)

我必须使用redis计算事务流中的唯一条目。至少会有1k个作业试图同时检查事务是否唯一,如果是,则将事务类型作为键,值是递增的计数器。此计数器再次由所有线程共享。如果所有线程
检查密钥是否存在。 exists(transactionType) 增加计数器。 val count = incr(counter) 设置新值。 setnx(transactionType, count) 这就产生了两个问题。
不必要地递增计数器,因为计数可以由一个线程更新。
必须执行exists、increment和insert(3操作)如果值不存在,是否有更好的方法进行计数器的增量和更新。

private void checkAndIncrement(String transactionType, Jedis redisHandle) {
    if(transactionType != null) {
        if(redisHandle.exists(transactionType) ^ Boolean.TRUE) {
            long count = redisHandle.incr("t_counter");
            redisHandle.setnx(transactionType, "" + count);
        }
    }
}

编辑:
一旦创建了一个值,比如t1=100,事务也应该用数字100来标识。我必须存储另一个以counter作为键、以transaction type作为值的Map。

k4emjkb1

k4emjkb11#

两种选择:
使用散列, HSETNX 要向散列添加键(只需将值设置为 1 或者 "" 或者别的什么),以及 HLEN 获取散列中的键数。你可以从头再来 HDEL . 你也可以用 HINCRBY 而不是 HSETNX 以进一步了解每个键出现的次数。
使用超日志。使用 PFADD 插入元素和 PFCOUNT 检索计数。hyperloglog是一种概率算法;hll的内存使用量不会像散列那样随着唯一项的数量而增加,但是返回的计数只是近似值(通常在真值的1%以内)。

相关问题