使用Redis或Aerospike计算唯一身份访问者

时间:2017-01-12 14:49:17

标签: redis aerospike

我正在尝试为不同的客户计算每页的独特访问者或其他事件(如点击等)等。我打算做的是为GUID分配一个唯一的基于cookie的GUID,然后为每个事件调用SADD。 redis键将为SET_ [EVENTID]

如果我只想要用户数量,我可能会使用PFADD,但我的应用还需要知道谁是唯一用户

但问题是,如果有太多的EVENT或太多的用户,那么SADD将在内存中结束大量的用户ID 我们期望每小时在所有客户中发送1000k +用户事件,事件数量也将达到100+

我想要一个意见是redis正确的存储选择。由于请求数量太多,任何传统的RDBMS方法都不起作用

我不确定是否有任何其他存储可以帮助像Aerospike

3 个答案:

答案 0 :(得分:5)

RTB中,大量使用Aerospike,frequency capping是需求侧平台(DSP)的常见用例。根据用户查看特定广告或特定广告系列的广告的次数设置上限。同时,跟踪总展示次数以及剩余预算。这些计数器的TTL通常很短。

<强>解决方案

您可以使用复合键<page ID : user ID : yyyymmdd>作为特定用户是否访问过该页面的标志,并使用24小时TTL。这将存在于内存中的数据集page-visit namespace中。

如果没有这样的钥匙:

  • 在集合page-visit中使用此键创建一个新记录,初始值为1.
  • list-append用户ID为集合<page ID : yyyymmdd>中的密钥page-users。此集(page-users)可以存在于stores其SSD上的数据的命名空间中。

如果此密钥存在:

  • 增加此键的记录数。这将为每个页面提供即时唯一访客数量。

当天结束时:

  • 获取每个页面的计数,以及访问该页面的唯一身份用户列表。
  • 使用<page ID : yyyymmdd>
  • 集中的密钥page-users阅读记录
  • 根据此用户ID列表,对users集合汇总batch-read

<强>优点

  • 检查page-visit标志的延迟非常低。它使用的内存非常少,因为data-in-index命名空间不会占用Aerospike成本中每个对象的64B元数据之外的额外空间。例如,10M用户* 64B *复制因子2 = 1.2GB的DRAM。
  • 每页唯一身份用户列表存储在SSD上,每GB的成本比只有内存的数据库(如Redis)低得多。您只需为内存中primary index的元数据条目支付每个对象64B。 list-append操作非常有效,因为您只发送要附加到page-users记录的最新用户ID。您只在页面上出现新的唯一用户时使用此操作(由page-visit标志保护)。
  • 所有这些记录都有24小时TTL,所以你可以让它们过期。
  • Aerospike是一个分布式键值数据库,可以垂直扩展以使用服务器上的所有核心,并且在新节点加入时,您的应用程序不需要分片。 data distribution由服务器自动处理并由客户端跟踪,而您的应用程序无需更改。

答案 1 :(得分:2)

超级博客&amp; Redis的

听起来你可能想要的是HyperLogLog。它是一种概率数据结构,允许您在有利于恒定大小的数据结构时权衡准确性。好消息是,数据结构的大小是有限的,并且是由数据结构大小决定的。使用1.5kB内存可以在正确答案的2%左右获得一个独特的计数。每个计数器使用更多数据,获得更高的准确性

此外,此功能内置于Redis中。

Hyperloglog Wiki页面: https://en.wikipedia.org/wiki/HyperLogLog

相关Redis博文: http://antirez.com/news/75

HyperLogLog&amp; VoltDB

如果您对比Redis更好的HA支持更传统的RDBMS模型感兴趣,请查看VoltDB。它支持盒子上的极高吞吐量,也支持本机群集。此外,它还具有丰富的SQL支持,可以完成Redis所做的许多事情(以及更多)。它还内置了SQL中的hyperloglog支持。它还有一个例子,可以计算出与你正在做的非常相似的独特ID。

http://voltdb.com

计算唯一ID的示例: https://github.com/VoltDB/voltdb/tree/master/examples/uniquedevices

答案 2 :(得分:0)

在Redis中对此进行建模的另一种方法是使用Bitmaps,而不是使用Sets。在您的情况下,维护GUID与表示位数组中的索引的整数之间的映射。您可能需要考虑为每个事件使用存储桶,以避免因稀疏度量而浪费。

多个Redis支持的分析库正在使用此方法,例如,请参阅Minutemanbitmapist