对象
Redis 是一个键值对(key-value pair)数据库,数据库中的每个键都有与之对应的值,并且这些键和值都是对象(object)
键总是一个字符串对象(String Object)。
而值则可以是字符串对象、列表对象(List Object)、散列对象(Hash Object)、集合对象(SetObject)或者有序集合对象(Sorted Set Object / Zset Object)中的任意一个,这五种对象分别对应我们在 Redis 数据库中操作的字符串键值对(SET、BITOP、PFADD)、列表键值对(RPUSH、LRANGE)、散列键值对(HADD、HLEN)、集合键值对(SADD、SMEMBERS)和有序集合键值对(ZADD、ZRANGE)
对象的实现
Redis 中的每种对象都有与之相对应的底层数据结构,并且为了让对象在各种不同的应用场景下都有优秀的性能表现,Redis 为每种对象都提供了两种类型的数据结构实现:
- 第一类是为了进行性能优化而特制的编码数据结构(encoded data structure),这些数据结构主要使用“以 CPU 换内存的方式”来节约内存。编码数据结构主要在对象包含的值数量比较少、或者值的体积比较小时使用:比如在字符串对象包含的字符串比较短时,集合只包含三五个小元素时,又或者列表只包含十来个项时,这些情况都可以使用编码数据结构。
- 另一类是普通数据结构,也即是我们在书上、论文上看见的数据结构,比如双向链表、字典、跳跃表等等。比起编码数据结构,这些普通的数据结构需要消耗更多内存,但是能 够提供更强大的功能,普通数据结构主要在对象包含的值比较多、或者值的体积比较大时使用。
在创建新对象时,Redis 会优先使用编码数据结构来表示对象,并在有需要时,自动将对象的表示方式转换为普通数据结构。
数据结构
编码数据结构(储存一个值对数据进行压缩,降低内存的使用,数据量小的数据会使用):
- 压缩列表(zip list)
- 整数集合(int set)
普通数据结构:
- 简单动态字符串(SDS, simple dynamic string)
- 双向链表
- 字典
- 跳跃表
对象使用的数据结构
- 字符串对象(string): SDS
- 列表对象(list): 双向列表 、压缩列表
- 散列表对象(hash): 字典 、压缩列表
- 有序集合对象(set): 跳跃表 、压缩列表
- 集合对象(zset): 字典 、整数集合