Redis Highlights (1) Redis中的类型和数据结构
Redis中的类型和数据结构
redis对外有5中基本类型,分别是string
, list 1
t_string.c
, hash 1
t_list.c
, set 1
t_hash.c
和 zset (ordered set) 1
t_set.c
.
这5种类型是“接口”而不是“实现”,因此redis得以根据不同的情形自由选择不同数据结构的实现,这也是redis在设计上的高明之处。1
t_zset.c
5种基本类型对应了int
, embstr 1
object.c
, raw 1
object.c
, linkedlist 1
sds.c
, ziplist 1
adlist.c
, skiplist 1
ziplist.c
, ht 1
t_zset.c
, intset 1
dict.c
这8种数据结构的实现。1
intset.c
类型与数据结构实现的对应关系如图。
实用
可以查看某个key对应的类型,而1
type KEYNAME
可以查看该key内部的实现。1
object encoding KEYNAME
string
string 有三种实现方式,分别是
, 1
int
和1
embstr
.
长度比较短的整数会使用1
raw
实现。长度比较短的字符串会使用1
int
, 更长的会使用1
embstr
。
1
raw
和1
embstr
的区别在于,1
raw
吧1
embstr
和1
redisObject
放在一块连续空间里面,这样申请内存和释放内存都只需要一次调用。带来的坏处是,1
sds
是只读的,如果调用1
embstr
等操作则自动升级为1
append
。1
raw
对于
实现的string,如果调用1
int
和1
strlen
等会产生额外开销。如果需要强制使用1
gettrange
来实现, 可以用1
raw
。1
setrange
zset
zset在元素较少时,使用
实现。
在元素较多时,使用1
intset
和1
skiplist
一起实现。其中1
dict
用于提供顺序相关的操作,而1
skiplist
用于快速查询score.1
dict
关于skiplist: 这是一种用多级链表加快查询速度的数据结构。Insert, delete, search的复杂度均为o(logn), 还可以进行高效的range query, 功能与性能与红黑树,B树相当,但实现更简单。CLRS里有详细的解释。