luw2007
2017-05-02 13:30:41 +08:00
存储思路:
使用 hash 存储,将 16 位 md5 分割成 2 部分,一部分做 hash 的 key,一部分总 hash 的 field。
由此可以节省大量内存
伪代码:
keys = [md5(str(i)).digest() for i in range(100000000)]
for i, key in enumerate(keys):
r.hset(key[:3], key[3:], i)
结果:
hash 存储 1 亿 md5 占用 3.43G,4 亿 预计不到 14G
127.0.0.1:6379>info
used_memory:3680560224
used_memory_human:3.43G
...
db0:keys=16733694,expires=0,avg_ttl=0
127.0.0.1:6379> hgetall "\xcd\x05b"
1) "\x0e\x1e\xef\xde\x93\xa7\xbd\x19\x1bd=\xcb\xd8"
2) "7098931"
3) "\xd2\xb6B^\xebs\xba\xdcb\x17\xa6\xe0\xec"
4) "9063155"
5) "R\xd0\xb1R\xe2\t\x0f}\x8b^\xfb\x82C"
6) "47193476"
7) "\xf4\xcb\xd1_/\x89\xb9\xc4\xc2\xe0mF\xf5"
8) "70502533"
9) "Wd4\xee\xf0\xbc\xec\xa6\xfb\x01\rD5"
10) "83701386"
缺陷:
hash 做 key 选取的长度一旦固定,无法控制 hash 的 field 个数。