Redis会自动"记忆"或者"识别重复项"?

时间:2018-02-02 16:40:35

标签: redis

如果将两个k,v对推入具有相同值的Redis,即

set(k1, v)
set(k2, v)

Redis smarlty会在幕后存储v并执行以下操作:

set(somereference, v)
set(k1, #somereference)
set(k2, #somereference)

但仍然会回归(k1, v), (k2, v)

我问,因为现在,从Python开始,我正在将值推向形式的红色:

pickle({"some sequence number" : xxx, "image-bytes" : some long bytestring})

我想知道,如果其中两个dicts实际上包含相同的图像字节串并且redis只能存储一次基础值,那么我是否值得重组我是如何做到这一点的。

1 个答案:

答案 0 :(得分:2)

不,redis不会自行进行重复数据删除:

redis$ du -h dump.rdb
4.0K    dump.rdb
redis$ ipython3

In [1]: %paste
import os
from redis import StrictRedis

data = os.urandom(1024)
redis = StrictRedis()

for i in range(1000000):
    redis.set(f'key{i}', data)
## -- End pasted text --

In [2]:
Do you really want to exit ([y]/n)?
redis$ du -h dump.rdb
633M    dump.rdb

数据库转储使用LZW压缩,因此它比预期的大小略小。

顺便说一句,我发现msgpack要比pickle快得多,而且几乎所有其他东西都用于打包和解包文字。