在Redis数据库中存储整数数组的最佳方法

在Redis数据库中存储整数数组的最佳方法,redis,Redis,我在redis数据库中存储了大约3亿个对象。目标包括: 身份证 约会 48个值的数组 我使用ID/date作为键,我正在寻找存储48个值的最佳方式(内存使用) 该值为整数,通常介于[1-1000]之间 我使用的第一种方法是在Java中构建对象,并使用一个自动序列化对象的框架(SpringDataRedis) 生成的格式类似于: {“@class\”:“com.mycompany.Points\”,“faceId\”:1234,“date\”:[“java.util.date\”,150966

我在redis数据库中存储了大约3亿个对象。目标包括:

  • 身份证
  • 约会
  • 48个值的数组
我使用ID/date作为键,我正在寻找存储48个值的最佳方式(内存使用)

该值为整数,通常介于[1-1000]之间

我使用的第一种方法是在Java中构建对象,并使用一个自动序列化对象的框架(SpringDataRedis)

生成的格式类似于:

{“@class\”:“com.mycompany.Points\”,“faceId\”:1234,“date\”:[“java.util.date\”,1509663600000],“Points\”:[5,5,10,10,60,60,60,60,60,60,60,60,40,40,40,30,30,80,80,20,20,10,10,10,10,10,10,5,5,5],]

然后,我使用此命令在redis中跟踪此对象的大小:

redis 127.0.0.1:6379> DEBUG OBJECT POINTS_215004#03-11-2017
Value at:0x7fce4b2b6ac0 refcount:1 encoding:raw serializedlength:206 lru:2074768 lru_seconds_idle:10
因此,如果我读对了,条目将在数据库中获取206(206 what?)

我尝试将其存储为列表:

redis 127.0.0.1:6379> lpush dummy 1 2 3 4 5 [...] 48
(integer) 48
实际上,大小几乎是一样的:

redis 127.0.0.1:6379> DEBUG OBJECT dummy
Value at:0x7fce467c2800 refcount:1 encoding:ziplist serializedlength:205 lru:2074809 lru_seconds_idle:10
可能类型
ziplist
更消耗内存

然后我尝试将其存储为普通字符串:

redis 127.0.0.1:6379> set dummy  [5,5,10,10,10,10,60,60,60,60,60,60,40,40,40,40,40,40,30,30,30,30,30,80,80,80,80,80,80,80,20,20,20,20,20,10,10,10,10,10,5,5,5,5,5,5,5,5]
大小减小到53

redis 127.0.0.1:6379> debug object dummy
Value at:0x7fce470b2dc0 refcount:1 encoding:raw serializedlength:53 lru:2074818 lru_seconds_idle:10
有没有更合适的方法来存储这个数组

有没有更合适的方法来存储这个数组

这取决于您的Redis版本,但从v3.2开始,如果您将其与无符号10位字段(最接近的幂为2到1000)一起使用,则会出现令人难以置信的情况

注意:
调试对象
的输出并不是衡量Redis中某个键的内存消耗的可靠方法,
serializedlength
字段以持久化对象所需的字节为单位,而不是内存中的实际占用空间,其中包括数据本身上的各种管理开销。从v4开始,我们有
内存使用量
命令,它做得更好-有关文档详细信息,请参阅

$ for i in {0..47}; do redis-cli BITFIELD dummy SET u10 \#$i $i; done
...
$ redis-cli
127.0.0.1:6379> strlen dummy
(integer) 60
127.0.0.1:6379> DEBUG OBJECT dummy
Value at:0x7f83e040e430 refcount:1 encoding:raw serializedlength:61 lru:16563203 lru_seconds_idle:27
127.0.0.1:6379> MEMORY USAGE dummy
(integer) 117
对于早期版本的Redis,您可以探索Lua脚本的使用,并编写相同逻辑的基于脚本的变体和/或尝试使用阵列的MessagePack编码