Redis 数据类型

Posted by icoding168 on 2020-04-07 15:29:17

分类: Redis  

Redis 主要有以下几种数据类型:

  • string
  • hash
  • list
  • set
  • sorted set

string

string 就是字符串,是 Redis 最基础的类型,可以保存无格式的普通字符串,也可以保存像 JSON、XML 等有格式的字符串,也可以保存二进制数据如音乐、视频等,不过单个 string 最大只能保存 512 MB 的数据。

hash

hash 类型的键值是一种字典结构,其存储了 key 和 value 的映射,但 value 只能是 string 类型,不支持其他数据类型,也就是说 hash 不能嵌套其他的数据类型,hash 类型适合存储结构化的数据。

hash 的内部实现运用了两种数据结构,一种是 ziplist(压缩列表),另一种是 hashtable(哈希表)。

当 hash 的元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)并且所有值都小于 hash-max-ziplist-values 配置(默认 64 字节)时,Redis 会使用 ziplist 作为 hash 的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,在节省内存方面比 hashtable 更强。

当 hash 的元素无法满足使用 ziplist 的条件时,Redis 会使用 hashtable 作为内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。

list

list 类型是一种存储 string 类型数据的有序列表, 按照插入顺序排序。

list 的内部实现运用了两种数据结构,一种是 ziplist(压缩列表),另一种是 linkedlist(链表)。

当 list 的元素个数小于 list-max-ziplist-entries 配置(默认 512 个)并且所有值都小于 list-max-ziplist-values 配置(默认 64 字节)时,Redis 会使用 ziplist 作为 list 的内部实现,因为 ziplist 比 linkedlist 更省内存。当 list 的元素无法满足使用 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。

list 适合存储一些列表型的数据结构,例如粉丝列表、文章评论列表等。

通过 list 的 lrange 命令读取某个闭区间内的元素,可以实现高性能的分页查询。通过结合使用 list 的 lpush 命令和 rpop 命令,可以把 list 当作一个队列来使用。

list 的使用场景还有很多,在选择时可以参考以下口诀:

  • lpush + lpop = Stack(栈)
  • lpush + rpop = Queue(队列)
  • lpush + ltrim = Capped Collection(有限集合)
  • lpush + brpop = Message Queue(消息队列)

set

set 是一种存储 string 类型数据的无序集合, set 有自动去重的功能,也有对两个 set 求交集、并集、差集的功能,比如对两个人的粉丝列表求交集可以知道两个人的共同好友是谁。

set 的内部实现运用了两种数据结构,一种是 intset(整数集合),另一种是 hashtable。

当 set 中的元素都是整数并且元素个数小于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。当集合的元素无法满足 intset 的使用条件时,Redis 会使用 hashtable 作为 set 的内部实现。

sorted set

sorted set 是一种存储 string 类型数据的有序集合,sorted set 除了有自动去重的功能,还有根据 score 自动排序的功能。当需要一个不重复的且有序的集合列表就可以选择 sorted set,比如各种排行榜。

sorted set 的内部实现运用了两种数据结构,一种是 ziplist,另一种是 skiplist(跳跃表)。

当 sorted set 的元素个数小于 zset-max-ziplist-entries 配置(默认 128 个)并且每个元素的值都小于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为 sorted set 的内部实现,当 sorted set 的元素无法满足使用 ziplist 的条件时,Redis 会使用 skiplist 作为内部实现,因为此时 ziplist 的读写效率会下降。