Redis数据类型

字符串(string)类型 

Redis使用了三种不同的编码方式来存储字符串对象,并会根据每个字符串值自动决定所使用的编码方式:

  • int:用于能够使用64位有符号整数表示的字符串;
  • embstr:用于长度小于等于44字节(在Redis3.x版本中是39字节)的字符串;
  • raw:用于长度大于44字节的字符串。 

可以采用OBJECT ENCODING来查看编码。

列表(list)类型

Redis中的列表与双向链表类似

LPUSH左端插入,RPUSH右端插入,LINSERT某键之前或之后插入。

向一个不存在的键中插入元素,Redis会先创建一个空列表并将其与键关联;

也不需要删除值为空列表的键,Redis会自动回收这种键。

LINDEX获取指定索引处的元素,LRANGE获取一个范围内的元素。

列表的索引从左到右指定为0~N-1;从右到左指定为-1~-N。

因此,获取整个列表就是0~~1(例:LRANGE key 0 -1 就是获取键为key的整个列表)。

LSET设置列表中指定索引位置处元素的值。

LPOP从列表左端移除第一个元素,RPOP从列表右端移除第一个元素。对不存在的键使用此命令时,返回nil

对应的阻塞版本为:BLPOP和BRPOP。当列表为空时,会将客户端阻塞。

可以设置一个以秒为单位的超时时间,超时时间为0时,表示永久等待。(此特性在任务调度中非常有用)

Redis在内部使用quicklist存储列表对象,下列配置选项可以调整列表对象的存储逻辑:

  • list-max-ziplist-size:一个列表条目中一个内部节点的最大大小。
  • list-compress-depth:列表压缩策略(列表两端不被压缩的节点个数,当列表很长且最可能被访问的元素在两端,用此参数精确地进行调优可以实现在压缩比和其它因素之间的平衡)。

哈希(hash)类型

哈希表示字段和值之间的映射关系,与某些语言中字典类型类似。

与列表(list)类型类似,添加字段前无需先初始化一个空的哈希,变为空时Redis会自动将其删除。

HDEL从哈希中删除字段。

HGETALL获取一个哈希中的所有字段和值,不建议对数量巨大的哈希使用此命令。(一个哈希最多能够容纳2^{32}-1字段,如果一个哈希字段非常多,执行HGETALL时很可能会阻塞Redis服务器,这种情况下通常使用HSCAN来增量地获取所有字段和值)

Redis内部使用两种编码来存储哈希对象:

  • ziplist:对于那些长度小于配置中hash-max-ziplist-entries选项配置的值(默认为512),且所有元素大小都小于配置中hash-max-ziplist-value选项配置的值(默认为64字节)的哈希,采用此编码。(ziplist对于较小的哈希而言可以节省占用空间)
  • hashtable:当ziplist不适用时采用的默认编码。

集合(set)类型

由唯一、无序对象组成的集合(collection)。

它经常用于测试某个成员是否在集合中、重复项删除和集合运算(求并、交、差集)。

SISMEMBER测试一个元素是否位于集合中,SREM中集合中删除元素,SCARD获取集合中成员的数量。

一个集合中最多可以容纳2^{23}-1个成员。

SMEMBERS获取集合中所有元素,成员很多情况下使用可能会阻塞服务器,此时应该使用SSCAN。

Redis内部两种编码方式来存储集合对象:

  • intset:对于那些元素都是整数且元素个数小于配置中set-max-intset-entries选项设置的值(默认12)的集合,对于较小的集合可以节省占用空间。
  • hashtable:intset不适用时的默认编码。

有序集合(sorted set)类型

集合中每个元素都有一个可以用于排序的权重,并且可以按照顺序从集合中获取元素。

唯一计数(HyperLogLog)类型

采用集合来进行唯一计数时,当数据量达到上千万就需要考虑内存消耗和性能下降的问题了。

如果不需要获取数据集的内容,而只是想得到不同值的个数,这时候就使用HyperLogLog类型最好了。

PFCOUNT获取数量

优势在于能够使用固定数量的内存(每个键只需占用12KB就可以计算最多2^64个不同元素的基数)和时间复杂度(每个键O(1))进行唯一计数。不过由于HLL算法返回的基数可能不准确(标准差小于1%),因此在决定是否使用HLL时需要进行权衡。

地理位置(Geo)类型

GEORADIUS获取指定坐标指定距离内的地点成员;

GEODIST获取两点之间的距离;

GEORADIUSBYMEMBER获取指定成员指定距离内的其他成员

Geo集合实际上被存储为一个有序集合,因此有序集合支持的命令都可以用于Geo数据类型。