redis的五大数据类型底层数据结构

  • string
  • List
  • set
  • hash
  • zset
  • 总结


string

string的底层实现可以是int、raw、embstr。int 编码是用来保存整数值,raw编码是用来保存长字符串,而embstr是用来保存短字符串。

  1. int,存储 8 个字节的长整型(long,2^63-1)。
  2. raw,存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)
  3. embstr, 代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串),存储小于 44 个字节的字符串。

当 int 编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw。对于 embstr 编码,由于 Redis 没有对其编写任何的修改程序(embstr 是只读的),在对embstr对象进行修改时,都会先转化为raw再进行修改,因此,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。

List

list底层的数据结构可以是 ziplist(压缩列表) 和 linkedlist(双端链表)
当同时满足下面两个条件时,使用ziplist(压缩列表):

  1. 列表对象保存的所有字符串元素的长度都小于64字节
  2. 列表保存的元素少于512个

不能满足这两个条件的时候使用 linkedlist(双端链表)

set

set的底层是 intset(整数数组) 或者 hashtable(哈希表)。
当set同时满足以下两个条件时,使用 intset(整数数组):

  1. 集合对象保存的所有对象都是整数值
  2. 集合对象保存的元素数量小于512个

不能满足这两个条件的就使用 hashtable(哈希表)

hash

hash的底层是 ziplist(压缩列表) 或者 hashtable(哈希表)
当同时满足下面两个条件时,使用ziplist(压缩列表):

  1. 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
  2. 哈希对象保存的键值对的数量小于512个

不能满足这两个条件的时候使用 hashtable 哈希表)

zset

zset的底层是 ziplist(压缩列表)或者skiplist(跳表)
当zset同时满足以下两个条件时,对象使用 ziplist 编码:

  1. 有序集合的所有元素长度都小于64字节
  2. 有序集合的元素数量小于128个

不能满足上面两个条件的使用 skiplist 编码。

总结

redis能存结构体吗 redis可以存int类型吗_数据结构