仅当键唯一时才将 Redis 计数器用作值

我必须从使用 Redis 的事务流中计算唯一条目。将至少有 1K 个作业尝试同时检查事务是否唯一,如果是,则将事务类型作为键,值是递增的计数器。该计数器再次由所有线程共享。如果所有线程都这样做

  • 检查密钥是否存在。 exists(transactionType)
  • 增加计数器。 val count = incr(counter)
  • 设置新值。 setnx(transactionType, count)

这会造成两个问题。

  • 不必要地增加计数器,因为计数可以由线程之一更新。
  • 必须执行一个存在,增加然后插入。(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 来识别。我必须存储另一个映射,将计数器作为键,交易类型作为值。

霍布斯

两种选择:

  1. 使用散列,HSETNX将键添加到散列(只需将值设置为1or""或任何),并HLEN获取散列中键的计数。你总是可以重新开始HDEL您还可以使用HINCRBY代替HSETNX来另外找出每个键出现的次数。

  2. 使用超级日志。使用PFADD插入元素和PFCOUNT检索计数。HyperLogLog 是一种概率算法;HLL 的内存使用量不会像散列那样随着唯一项的数量增加,但返回的计数只是近似值(通常在真实值的 1% 以内)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL:仅当另一列中的值唯一时才设置值

从Redis中的一组计数器中获取最高的计数器值

将Redis用作DB的某些值

在AES计数器模式下是否可以将消息ID用作起始值

当值是列表且项目不唯一时,交换字典键和值

SQL 选择所有行,但仅当列值唯一时

SQL:将时间戳与仅时间参数匹配以对多天的唯一时间进行分组和计数

角度-仅当唯一时才推送到数组

仅当姓氏不唯一时,才显示名字

仅当使用 knex 唯一时才插入

Redis多个键集计数

Redis HINCRBY哈希字段-1计数器,仅递减至0或非负值

Redis列表/集中的唯一值

将POJO用作Spring Redis缓存的键时,如何获取所有键?

仅当其他列具有条件时,才对列中的唯一值进行计数

redis:每天重置计数器

检查并增加Redis中的计数器

仅当两个值都存在时才唯一

仅当匹配多个条件时,才计算部分列中的唯一值

Redis /从带前缀的Redis获取所有键和值

给定一个整数数组arr,当且仅当该数组中每个值的出现次数唯一时,编写一个返回true的函数

将标志寄存器用作布尔返回值是否被认为是不好的做法?

Redis 设置密钥,仅当 val 与前一个匹配时才设置 val 以实现并发

按时间分组,然后仅当列表中存在唯一条目时才对唯一条目进行计数

使用redis的'keys'命令时如何获取键和值

无效地将类型字段或数组元素用作循环计数器

Redis,如何将集合存储为哈希键的值

将字典键和值添加到Redis列表

使用lodash我如何保持一个以后可以用作参数的计数器?