文章目录
- 字符串类型
- 基本用法
- 使用场景
- 哈希类型
- 基本用法
- 使用场景
- 列表类型
- 基本用法
- 使用场景
- 集合类型
- 基本用法
- 使用场景
- 有序集合类型
- 基本用法
- 使用场景
字符串类型
字符串类型(SDS)即简单动态字符串,它是以键值对key-value的形式进行存储的,根据 key 来存储和获取value值
依据不同情况,字符串在底层会使用 int 、 raw 或者 embstr 三种不同的编码格式
- 如果数据为可以使用long类型来保存的整数,则使用int
- 如果数据为可以使用long double类型来保存的浮点数,则使用embstr或者raw
- 如果数据为字符串,或者长度过大没办法用long来表示的整数,以及长度过大无法用long double表示的浮点数,则使用embstr或者raw。当数据小于39字节时,使用embstr,当大于39字节时使用raw
基本用法
127.0.0.1:6379> set hello world //设置key-value
OK
127.0.0.1:6379> get hello //根据key获取value
"world"
127.0.0.1:6379> strlen hello //计算value长度
(integer) 5
使用场景
- 存放用户(登录)信息;
- 存放文章详情和列表信息;
- 存放和累计网页的统计信息。
哈希类型
字典类型 (Hash) 又被成为散列类型或者是哈希表类型,它是将⼀个键值 (key) 和⼀个特殊的“哈希表”关联起来。
哈希类型的底层数据结构可以是压缩列表(ZipList)或者字典(Dict)
- 当哈希对象的所有键值对的键和值的字符串长度都小于64字节,并且保存的键值对数量小于512个时,使用压缩列表
- 如果不满足上述条件中的任意一个,都会使用字典
基本用法
127.0.0.1:6379> hset hash1 name lee age 20 //设置key-value的映射
(integer) 2
127.0.0.1:6379> hget hash1 name //获取key为name的value
"lee"
127.0.0.1:6379> hget hash1 age //获取key为age的value
"20"
使用场景
- 存储用户信息或者某个物品的信息,无需序列化,直接建立映射
列表类型
列表类型 (List) 是⼀个使用线性结构存储的结构,它的元素插入会按照先后顺序存储到链表结构中。
列表类型的底层数据结构可以是压缩列表(ZipList)或者链表(LinkedList)
- 当列表对象的所有字符串元素长度都小于64字节,并且保存的元素数量小于512个时,使用压缩列表
- 如果不满足上述条件中的任意一个,都会使用链表
基本用法
127.0.0.1:6379> lpush list1 1 2 3 4 5 //依次头插1 2 3 4 5,此时数据为5 4 3 2 1
(integer) 5
127.0.0.1:6379> rpop list1 //尾删
"1"
127.0.0.1:6379> lpop list1 //头删
"5"
使用场景
- 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第⼀个元素,所以列表类型可以用来实现消息队列;
- 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样不仅可以完美的实现分页功能,而且加速了程序的响应速度。
集合类型
集合类型 (Set) 是⼀个无序并唯⼀的键值集合。
集合类型的底层数据结构可以是整数集合(IntSet)或者字典(Dict)
- 当集合对象的所有元素都是整数值,并且保存的元素数量小于512个时,使用整数集合
- 如果不满足上述条件中的任意一个,都会使用字典
基本用法
127.0.0.1:6379> sadd testSet v1 v2 v3 v4 v2 v4 v1
(integer) 4
127.0.0.1:6379> smembers testSet //去重且无序
1) "v2"
2) "v1"
3) "v4"
4) "v3"
使用场景
- 微博关注我的人和我关注的人都适合用集合存储,可以保证人员不会重复;
- 中奖人信息也适合用集合类型存储,这样可以保证⼀个人不会重复中奖。
有序集合类型
有序集合类型 (SortedSet) 相比于集合类型多了⼀个排序属性 score(分值),所以对于有序集合ZSet 来说,每个存储元素相当于有两个值组成的,⼀个是有序结合的元素值,⼀个是分值。有序集合的存储元素值也是不能重复的,但分值是可以重复的。
有序集合类型的底层数据结构可以是压缩列表(ZipList)或者跳表(SkipList )
- 当有序集合对象的所有元素成员的长度都小于64字节,并且保存的元素数量小于128个时,使用压缩列表
- 如果不满足上述条件中的任意一个,都会使用跳表(这里的跳表是结合字典的)
这里不是直接使用跳表,而是搭配字典一起使用
之所以这样设置是因为考虑到如果直接使用跳跃表,如果需要查找成员的分值时只能通过遍历来进行查找,而这样的效率是O(logN)
而字典虽然建立映射后可以O(1)的查找到分值,但是哈希只能通过key值进行查找,并不支持范围查询。
所以将两者进行结合,使用字典建立起元素与分值的映射,使用字典来进行成员分数的查找,而使用跳跃表来进行范围型操作,这样就很好的解决了这个问题。
typedef struct zset {
zskiplist *zsl;
dict *dict;
} zset;
基本用法
127.0.0.1:6379> zadd zset1 3 v1 8 v2 2 v3 6 v4 #插入时以分值-值的形式插入
(integer) 4
127.0.0.1:6379> zrange zset1 0 -1 #查找结果按照升序排序
1) "v3"
2) "v1"
3) "v4"
4) "v2"
使用场景
- 学生成绩排名;
- 粉丝列表,根据关注的先后时间排序。