我正在研究存储可能大量数据的策略,并且我想找到最好的存储技术。我愿意接受任何建议,MySQL、NoSQL、平面文件等等。
我在做什么:
- 我将在一组用户中分发所有 4 字节整数。
- 数字为 0 到 4,294,967,295,无符号 4 字节整数范围。
- 用户可以拥有数千个这样的号码。
- 预计有数千名用户,但可能性很小。
- 数字将在一段时间内分发,而不是一次性分发
- 使用 AWS、一些服务器和 EBS 卷
我主要关心的是存储空间。我需要以便宜的方式完成此操作,并且在 AWS 上需要花费一些钱来进行大批量操作。
我对以数学方式表示数字分配进行了一些研究,但我发现了太多问题。
要求
- 对于分析和实时数据显示的检索效率较高。不一定要快如闪电,但要合理。
- 我需要在用户 ID -> 号码和号码 -> 用户 ID 两个方向上进行查找
- 存储空间尽可能小。
- 内存使用量合理(小于 8 GB)。
- 必须准确,号码丢失和号码分配错误都不能发生。
这是我迄今为止发现的内容:
存储与 2 字节用户 ID 关联的所有 4 字节数字的下限为 ((4+2) * 2^32/1024/1024/1024) = 24 GB。
Cassandra 是一个键/值对数据库。基于此http://www.datastax.com/docs/0.8/cluster_architecture/cluster_planning我计算出,如果我使用每个 4 字节数字作为键,并使用 2 字节用户 ID 作为值,我需要大约 260GB 的存储空间(没有复制)。
Redis 位于内存中。我认为这会消除这种可能性,因为这么多内存在 AWS 上会非常昂贵。
我目前正在寻找有关 MySQL 和 Mongo 的类似信息。
这是我的问题。是否有任何引用资料可供我用来确定最佳解决方案,或者是否有我没有想到的替代解决方案。
谢谢大家。
更新 - 我添加了一个额外的要求,我需要根据用户 ID 查找号码,并根据号码查找用户 ID。此外,Redis 位于内存中,因此直接实现会使 Redis 比基于磁盘的解决方案更昂贵。
最佳答案
实际上,你只需要存储有用户的号码即可;如果您正在查找未存储的号码,您将得到一个空结果,因此您知道该号码尚未分配。
对于 MySQL:
CREATE TABLE mashup
(
id bigint primary key,
user_id int,
index (user_id);
);
主键将确保“id”有索引;此外,bigint 有更多空间,因此您不会遇到整数溢出等令人讨厌的问题。然后,对于每个用户,插入一条记录,如下所示:
INSERT into mashup VALUES (181870388, 90128);
想知道某个号码是否有用户?
SELECT user_id FROM mashup where id=xxxxx;
或者
SELECT COUNT(*) FROM mashup where id=xxxxx;
想知道用户有哪些号码?
SELECT id FROM mashup WHERE user_id=yyyyy;
美妙之处在于,您不必浪费空间来存储所有 40 亿个数字,而只需存储用户条目的数量。
关于mysql - 关于存储分配给用户的约 40 亿 (2^32) 个号码的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307502/