我必须从使用 Redis 的事务流中计算唯一条目。将至少有 1K 个作业尝试同时检查事务是否唯一,如果是,则将事务类型作为键,值是递增的计数器。该计数器再次由所有线程共享。如果所有线程都这样做
exists(transactionType)
val count = incr(counter)
setnx(transactionType, count)
这会造成两个问题。
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 来识别。我必须存储另一个映射,将计数器作为键,交易类型作为值。
两种选择:
使用散列,HSETNX
将键添加到散列(只需将值设置为1
or""
或任何值),并HLEN
获取散列中键的计数。你总是可以重新开始HDEL
。您还可以使用HINCRBY
代替HSETNX
来另外找出每个键出现的次数。
使用超级日志。使用PFADD
插入元素和PFCOUNT
检索计数。HyperLogLog 是一种概率算法;HLL 的内存使用量不会像散列那样随着唯一项的数量增加,但返回的计数只是近似值(通常在真实值的 1% 以内)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句