格局打开-简单聊聊Redis数据结构及其使用场景(也不简单)

62 阅读3分钟

image.png

字符串string

字符串类型的内部编码有3种,Redis会根据当前值的类型和长度决定使用哪种内部编码实现

  • int:8个字节的长整型。
  • embstr:小于等于39个字节的字符串。
  • raw:大于39个字节的字符串。

使用场景

  • 计数(incr)
  • 限速(incr)
  • 共享session

字典hash

哈希类型的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist--entries配置(默认512个)、同时所有值都小于hash-max-ziplist--valuei配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
  • hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

使用场景

  • 记录关系型数据(如用户信息)

列表list

列表类型的内部编码有两种。

  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entriesi配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist--value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

使用场景

  • 消息队列(lpush+brpop)
  • 栈(lpush+lpop)
  • 有限集合(lpsh+ltrim)
  • 队列(lpush+rpop)

集合set

集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素;一个集合最多可以存储2 32 -1个元 素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。

集合类型的内部编码有两种:

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

使用场景

  • 标签系统:给用户添加标签,在标签下添加用户,用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成的数据不一致。

有序集合zset

有序集合类型的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认l28个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
  • skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。

使用场景

  • 排行榜:通过设置对应key的score