如果将两个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只能存储一次基础值,那么我是否值得重组我是如何做到这一点的。
答案 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快得多,而且几乎所有其他东西都用于打包和解包文字。