我需要处理队列中的多个记录.但是由于一些外部问题,这些物品可能会偶尔发生多次.我只需要处理一次项目
我计划使用的是PFADD到每个记录的redis(作为md5sum),然后看看是否返回成功.如果没有显示增量,则记录是重复的其他处理记录.
这看起来非常简单,但在使用PFADD时我得到的误报太多了
有一个更好的方法吗 ?
一般来说,在分布式系统中,您必须在处理项目之间进行选择:
只处理一次的东西会很方便,但这通常是不可能的。
话虽这么说,对于您的特定用例可能有可接受的解决方法,并且正如您建议的那样,存储已处理的项目可能是一个可接受的解决方案。
请注意,尽管PFADD使用 HyperLogLog,它速度快且可扩展,但对于项目的计数是近似的,因此在这种情况下,我认为这不是您想要的。但是,如果您愿意接受小概率的错误,那么这里最合适的数据结构将是布隆过滤器(如此处针对 Redis 的描述),它可以以非常节省内存的方式实现。
一个简单、高效且推荐的解决方案是使用一个简单的 Redis 键(例如哈希)来存储类似布尔值(“0”、“1”或“true”、“false”),例如使用HSET或使用 NX选项指令设置。如果您愿意,也可以将其放在命名空间下。它还具有使密钥过期的额外好处。
它将避免您使用一组(不是SET命令,而是SINTER、SUNION命令),如果您想扩展到多个节点,这不一定适用于Redis 集群。不过, SISMEMBER仍然很好(但缺少哈希的一些功能,例如生存时间)。
如果您使用哈希,我还建议您选择一个比 md5 冲突机会更少的哈希函数(冲突意味着两个不同的对象最终具有相同的哈希)。
哈希的另一种方法是在将每个项目放入队列时为其分配一个 uuid(如果您想获得一些时间信息,则为每个项目分配一个鱿鱼)。
| 归档时间: |
|
| 查看次数: |
826 次 |
| 最近记录: |