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