cassandra - 如何存储唯一的 "Likes"或 "Views"或按比例设置?

标签 cassandra redis set hyperloglog

我想深入了解各种公司如何解决计算/增加“喜欢”/“观看”/“转推”或类似规模的数量的问题。

在超过 5000 万月活跃用户的用户群中,我看到 Redis 和 Cassandra 都用于存储用户 ID 集以快速检索设置的基数(例如,观众人数)。这些解决方案有一些缺点,但效果很好,可以而且正在被扩展。不过,我很好奇其他商店在这种情况下使用什么。

具体解决办法:

  • 使用集合或其他数据结构,还是只是简单的键值对?
  • 准确或近似计数,?
  • 仅在内存中还是混合?
  • 开源解决方案,还是自行开发?
  • 是否有人构建了一个轻量级的仅集合存储系统,并在其之上进行了 hyperloglog 估计?

最佳答案

Use sets, or other data structures, or just plain key-value?

HyperLogLog 是一种强大的算法,可以为您提供具有微小存储空间的唯一用户/ View 的数量,提供一些近似值。

Exact or approximate counts,?

对于这个比例,精确计数是无用的,没有意义。毕竟,当您拥有 5000 万用户时,知道您有 134 万独立访问者访问一个具有 2% 误差率的项目就足够了。

In-memory only, or hybrid?

这取决于您对延迟的要求。在内存中授予非常快速的访问权限,但存在数据丢失的风险。您可以在具有持久存储支持的内存中使用

Open source solution, or home grown?

不要重新发明轮子。使用经过充分验证和战场验证的工具

Has anybody built a lightweight set-only storage system with hyperloglog estimation on top of it?

据我所知,Redis 提供了 HyperLogLog 作为数据结构,因此您可以直接使用它。使用磁盘持久化将 hyperloglog 数据结构频繁检查点到磁盘,以避免在节点宕机时丢失它

否则,您也可以在 Cassandra 中实现 HyperLogLog 算法,因为 Cassandra 使用 max(timestamp) 作为解析规则,因此只需欺骗数据库并将 HyperLogLog 存储桶值存储为时间戳。

但这意味着您需要自己执行 impl,可能会出现错误。

关于cassandra - 如何存储唯一的 "Likes"或 "Views"或按比例设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507717/

相关文章:

spring-boot - 如何连接到不同dc中的多个Cassandra

memory-management - 为什么 Redis 内存碎片小于 1

iterator - 在 Java 中加入(联合)集合内部的集合

node.js - 如何使用node.js检查cassandra的状态?

sql - cassandra:单行可变列数

java - 有没有一种检查 Datastax Session.executeAsync() 是否抛出异常的好方法?

spring-mvc - Redis使用keys查询keys,CPU跑高20%以上,我只用单台redis

c++ - Redis客户端命令错误

java - 在泛型类中使用 ArrayList 实现集合

php - 如何按嵌套集中的类别名称获取产品列表