我正在将现有的调度数据集移动到 redis。这些数据有时间表和用户。这是一个多对多的关系。
我将完整的时间表列表存储在评分 zset 中,其中分数是时间表日期的时间戳。我这样存储它,以便我可以轻松找到所有已过的时间表并按照这些时间表采取行动。
我还需要能够找到属于某个用户的所有日程安排,因此每个用户都有自己的包含重复信息的 zset。
所以数据可能如下所示:
s_1000: [ (100, "{..}"), (101, "{..}") ] # the schedules key
us_abc: [ (100, "{..}"), ] # a users schedules key
us_efg: [ (100, "{..}"), ] # another users schedules key
实际记录如下所示:
"{\"di\":10000,\"ci\":10000,\"si\":10000,\"p\":\"M14IB5A2830TE4KSSEGY0ZDX37V93FYX\",\"sse\":false}"
我已经缩短了密钥,甚至可以将它们与 json 格式一起删除,以获得真正最小的有效负载,但所有数据都需要在那里。
仅此字符串只有 85 个字符。因为每条记录都有一个副本,所以这条记录总共有 170 个字符。这样做的关键是us_M14IB5A2830TE4KSSEGY0ZDX37V93FYX_YYMMDD另外 42 个字符。总的来说,我看到存储这些数据只需要 255 个字节。
我已经按照我描述的方式插入了 100k 条记录。据我计算,这应该只需要 25mb,但我看到这需要超过 200mb 来存储。
该memory info有效负载为 344 字节 (x100k = 33mb)memory info调度密钥为 18,108,652 字节 (18mb)
计划内存使用看起来是正确的。
这里是memory stats:
memory stats
1) "peak.allocated"
2) (integer) 3343080744
3) "total.allocated"
4) (integer) 201656296
5) "startup.allocated"
6) (integer) 3668896
7) "replication.backlog"
8) (integer) 0
9) "clients.slaves"
10) (integer) 0
11) "clients.normal"
12) (integer) 1189794
13) "aof.buffer"
14) (integer) 0
15) "lua.caches"
16) (integer) 0
17) "db.0"
18) 1) "overhead.hashtable.main"
2) (integer) 5850304
3) "overhead.hashtable.expires"
4) (integer) 4249632
19) "overhead.total"
20) (integer) 14958626
21) "keys.count"
22) (integer) 100036
23) "keys.bytes-per-key"
24) (integer) 1979
25) "dataset.bytes"
26) (integer) 186697670
27) "dataset.percentage"
28) "94.297752380371094"
29) "peak.percentage"
30) "6.0320491790771484"
31) "allocator.allocated"
32) (integer) 202111512
33) "allocator.active"
34) (integer) 204464128
35) "allocator.resident"
36) (integer) 289804288
37) "allocator-fragmentation.ratio"
38) "1.011640191078186"
39) "allocator-fragmentation.bytes"
40) (integer) 2352616
41) "allocator-rss.ratio"
42) "1.4173845052719116"
43) "allocator-rss.bytes"
44) (integer) 85340160
45) "rss-overhead.ratio"
46) "0.98278516530990601"
47) "rss-overhead.bytes"
48) (integer) -4988928
49) "fragmentation"
50) "1.4126673936843872"
51) "fragmentation.bytes"
52) (integer) 83200072
看起来每个键的字节数高达 1977 个字节。
为什么每个键使用 344 字节?是否可以告诉 redis 每个字符只使用 1 个字节?为什么redis每个键使用这么多字节?
有没有一种方法可以更好地构建我的数据,这样我就不会在如此少量的数据上破坏 redis(我需要 100 毫米的记录)。