2017-01-22 如何用几十M,存储一亿用户的状态信息
如何用几十M,存储一亿用户的状态信息
用户状态由两个部分组成:
- 是否活跃,有两种取值
- 活跃
- 非活跃
- 用户类型:有5种取值
- 一般
- 等级一
- 等级二
- 等级三
- 等级四
- 等级五
举例:
用户A的状态是:活跃、等级二
用户B的状态是:非活跃、等级二
那么怎么用几十兆,存储1亿个这种数据呢?
一个字节分8位4位可以存储一个用户的信息,连续3位存储用户的类型,剩下一位存储是否活跃,一个字节可以存储2位用户的信息,47.68M就可以存储一亿用户的状态信息,问题在于,如何找到对应的用户数据存储位置,如果使用sequence可以根据sequence查找到对应的位置,如果是分布式ID的话,需要统一生成唯一的sequence
不用考虑扩展的话,活跃非活跃用1位(0,1)就可以了,用户类型需要3位(000,001,010,011,100),这样的话,理论上,1M可以存储2097152个用户,1亿用户也只是几十兆的问题。 但是如果活跃级别变多的话,这样设计不易扩展了,所以基本会考虑预留位来做扩充的。还需要考虑唯一属性来区分用户,用户也可能有其他属性,所以说基本上几十兆存储不了1亿用户信息。 期待大神们给出专业的设计。
mysql 位算,活跃、等级二 可以用 2 2的二进制是 10,typint 1个字节 ;104857600 需要100M 存储1个亿需要 90多M;如果在想的极端些,1个字节8位能够存储更多对应的信息就好了,不晓得了
北京---猪头哥哥
少量存储比较节省,只存储数据量少的,另外的状态默认。 基于霍夫曼树,编码,压缩存储
借鉴前面@asmburning @jeffrey-hua的思路,为了解决用户和用户状态为止匹配问题,这里采用二进制文件,利用将状态信息存入文件时,产生的一种自动的顺序,两条信息之间通过二进制0相隔,一条完整的存入文件的用户状态数据是五位,前四位表示状态信息,后一位表示间隔符(例如,两条数据是00010 10010)。这样只需在47.68M上再多出11.92M,这里又出现一个问题,那就是增删差改的速度问题。