Redis PFADD用于检查存在的查询

Ram*_*Ram 7 redis

我需要处理队列中的多个记录.但是由于一些外部问题,这些物品可能会偶尔发生多次.我只需要处理一次项目

我计划使用的是PFADD到每个记录的redis(作为md5sum),然后看看是否返回成功.如果没有显示增量,则记录是重复的其他处理记录.

这看起来非常简单,但在使用PFADD时我得到的误报太多了

有一个更好的方法吗 ?

nha*_*nha 2

一般来说,在分布式系统中,您必须在处理项目之间进行选择:

  • 最多一次
  • 至少一次

只处理一次的东西会很方便,但这通常是不可能的。

话虽这么说,对于您的特定用例可能有可接受的解决方法,并且正如您建议的那样,存储已处理的项目可能是一个可接受的解决方案。

请注意,尽管PFADD使用 HyperLogLog,它速度快且可扩展,但对于项目的计数是近似的,因此在这种情况下,我认为这不是您想要的。但是,如果您愿意接受小概率的错误,那么这里最合适的数据结构将是布隆过滤器(如此处针对 Redis 的描述),它可以以非常节省内存的方式实现。

一个简单、高效且推荐的解决方案是使用一个简单的 Redis 键(例如哈希)来存储类似布尔值(“0”、“1”或“true”、“false”),例如使用HSET使用 NX选项指令设置。如果您愿意,也可以将其放在命名空间下。它还具有使密钥过期的额外好处。

它将避免您使用一组(不是SET命令,而是SINTERSUNION命令),如果您想扩展到多个节点,这不一定适用于Redis 集群。不过, SISMEMBER仍然很好(但缺少哈希的一些功能,例如生存时间)。

如果您使用哈希,我还建议您选择一个比 md5 冲突机会更少的哈希函数(冲突意味着两个不同的对象最终具有相同的哈希)。

哈希的另一种方法是在将每个项目放入队列时为其分配一个 uuid(如果您想获得一些时间信息,则为每个项目分配一个鱿鱼)。