1、string
string是redis最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value。value不仅是string,也可以是数字。string类型是二进制安全的,意思是redis的string类型可以包含任何数据,比如jpg图片或者序列化的对象。string类型的值最大能存储512M。
//SDS的定义
struct sdshdr{
//记录buf数组中已使用字节的数量,等于sDs所保存字符串的长度
int len
//记录buf数组中未使用字节的数量
int free
//字节数组用于保存字符串
char buf[]
}
相比c的字符串优点:
1.常数复杂的获取字符串长度
2.杜绝缓冲区溢出
3.减少修改字符串带来的内存重新分配次数
2、list
list列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。实现方式:redis list的是实现是一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销。
3、hash
hash是一个键值(key-value)的集合。redis的hash是一个string的key和value的映射表,Hash特别适合存储对象。常用命令:hget,hset,hgetall等。
4、set
set是string类型的无序集合。集合是通过hashtable实现的。set中的元素是没有顺序的,而且是没有重复的。常用命令:sdd、spop、smembers、sunion等。应用场景:redis set对外提供的功能和list一样是一个列表,特殊之处在于set是自动去重的,而且set提供了判断某个成员是否在一个set集合中。
5、zset
zset和set一样是string类型元素的集合,且不允许重复的元素。常用命令:zadd、zrange、zrem、zcard等。实现方式:zset的内部使用HashMap和跳跃表(skipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
6.整数集合
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集的元素数量不多时, Redis就会使用整数集合作为集合键的底层实现。
typedef struct intset{
//编码方式
uint32_t encoding
//集合包含的元素数量
uint32_t length
//保存元素的数组
int8_t contents[]
}
7.压缩列表
压缩列表是列表键和哈希键的底层实现之一。当一列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么 redis就会使用压缩列表来做列表键的底层实现。