tips icon indicating copy to clipboard operation
tips copied to clipboard

2017-01-22 如何用几十M,存储一亿用户的状态信息

Open teaey opened this issue 9 years ago • 5 comments

如何用几十M,存储一亿用户的状态信息

用户状态由两个部分组成:

  • 是否活跃,有两种取值
    • 活跃
    • 非活跃
  • 用户类型:有5种取值
    • 一般
    • 等级一
    • 等级二
    • 等级三
    • 等级四
    • 等级五

举例:

用户A的状态是:活跃、等级二

用户B的状态是:非活跃、等级二

那么怎么用几十兆,存储1亿个这种数据呢?

teaey avatar Jan 22 '17 04:01 teaey

一个字节分8位4位可以存储一个用户的信息,连续3位存储用户的类型,剩下一位存储是否活跃,一个字节可以存储2位用户的信息,47.68M就可以存储一亿用户的状态信息,问题在于,如何找到对应的用户数据存储位置,如果使用sequence可以根据sequence查找到对应的位置,如果是分布式ID的话,需要统一生成唯一的sequence

asmburning avatar Jan 22 '17 05:01 asmburning

不用考虑扩展的话,活跃非活跃用1位(0,1)就可以了,用户类型需要3位(000,001,010,011,100),这样的话,理论上,1M可以存储2097152个用户,1亿用户也只是几十兆的问题。 但是如果活跃级别变多的话,这样设计不易扩展了,所以基本会考虑预留位来做扩充的。还需要考虑唯一属性来区分用户,用户也可能有其他属性,所以说基本上几十兆存储不了1亿用户信息。 期待大神们给出专业的设计。

jeffrey-hua avatar Jan 22 '17 06:01 jeffrey-hua

mysql 位算,活跃、等级二 可以用 2 2的二进制是 10,typint 1个字节 ;104857600 需要100M 存储1个亿需要 90多M;如果在想的极端些,1个字节8位能够存储更多对应的信息就好了,不晓得了

北京---猪头哥哥

Shuangxiding avatar Jan 22 '17 06:01 Shuangxiding

少量存储比较节省,只存储数据量少的,另外的状态默认。 基于霍夫曼树,编码,压缩存储

SpringSummer avatar Jan 22 '17 07:01 SpringSummer

借鉴前面@asmburning @jeffrey-hua的思路,为了解决用户和用户状态为止匹配问题,这里采用二进制文件,利用将状态信息存入文件时,产生的一种自动的顺序,两条信息之间通过二进制0相隔,一条完整的存入文件的用户状态数据是五位,前四位表示状态信息,后一位表示间隔符(例如,两条数据是00010 10010)。这样只需在47.68M上再多出11.92M,这里又出现一个问题,那就是增删差改的速度问题。

mouseDH avatar Feb 15 '17 02:02 mouseDH