我试图为每个页面或其他事件(如点击等)计算不同客户端的独特访问者.我打算做的是为GUID分配一个唯一的基于cookie的GUID,然后为每个事件调用SADD.redis键将是SET_ [EVENTID]
如果我只想要用户数量,我可能会使用PFADD,但我的应用程序还需要知道谁是唯一用户
但问题是如果有太多的EVENT或太多的用户,那么SADD将在内存中结束大量的用户ID我们期望每小时1000k +用户事件,所有客户端,事件数量也将超过100+
我想要一个意见是redis正确的存储选择.由于请求数量庞大,任何传统的RDBMS方法都不起作用
我不确定是否有任何其他存储可以帮助像Aerospike
在RTB中,Aerospike被大量使用,频率上限是需求侧平台(DSP)的常见用例.根据用户查看特定广告或特定广告系列的广告的次数设置上限.同时,跟踪总展示次数以及剩余预算.这些计数器通常具有短TTL.
解
您可以使用复合键
作为特定用户是否访问过该页面的标志,使用24小时TTL.这将存在于page-visit
内存中的数据索引命名空间中.
如果没有这样的密钥:
使用此键在集合中创建一个新记录,page-visit
初始值为1.
list-将用户ID 附加到
集合中的键page-users
.此set(page-users
)可以存在于将其数据存储在SSD上的命名空间中.
如果此密钥存在:
增加此键的记录数.这将为每个页面提供即时唯一访问者计数.
在一天结束时:
获取每个页面的计数,以及访问该页面的唯一用户列表.
使用
该组中的键读取记录page-users
根据此用户标识列表对集合进行批量读取users
.
好处
检查page-visit
标志的延迟非常低.它使用非常少的内存,因为索引中的数据库命名空间不会占用Aerospike成本中每个对象的64B元数据之外的额外空间.例如,10M用户*64B*复制因子2 = 1.2GB的DRAM.
每页唯一用户列表存储在SSD上,每GB的成本比只有内存的数据库(如Redis)低得多.您只需为内存中的主索引中的元数据条目支付每个对象64B .list-append操作非常有效,因为您只发送要附加到page-users
记录的最新用户ID .只有在页面上出现新的唯一用户时才会使用此操作(由page-visit
标志保护).
所有这些记录都有24小时TTL,所以你可以让它们过期.
Aerospike是一个分布式键值数据库,可以垂直扩展以使用服务器上的所有核心,并且在新节点加入时不需要应用程序就需要进行分片.该数据分布是由服务器自动处理,没有您的应用程序需要改变客户端跟踪.