先列举:java
五大类型:String、List、Hash、Set、Sorted Set、redis
其它: pubsub(应该算独立功能吧?)、HyperLogLog(2.8.9+)、Geo(3.2+)、Stream(redis5+)数据库
redis中实现了不少自定义数据结构,但redis并无直接使用这些结构来构建k-v系统,而是使用这些结构建立了一个对象系统;这个对象系统包含了上面咱们列举的字符串对象、列表对象、哈希对象、集合对象等等;服务器
注:本文假定阅读者对于redis底层数据结构及实现有必定了解数据结构
注:底层数据结构包括: 简单动态字符串SDS、链表linkedlist、跳跃表skiplist、压缩列表ziplist、整数集合等等函数
使用对象的优势:性能
redisObject:学习
说明: redis是一个键值对系统,它的键老是字符串对象,值为上述类型中声明的对象类型(新版本有扩充),使用type
命令可查看数据库键的类型,实际就是数据库键对应的值的类型;优化
-------- 快乐的分割线-------下面介绍五大类型 ----------------ui
redisObject的type为REDIS_STRING,用type命令查询,显示string,编码表示底层数据结构:
注1:embstr是一种专门保存短字符串的优化编码,与raw同样使用redisObject+sdshdr结构,区别是,raw调用两次内存分配函数来分别建立redisObject结构和sdshdr结构,而embstr则调用一次内存分配函数来分配一块连续的内存空间,该空间依次包含这两种结构
注2:浮点型数据,在redis也是作为字符串对象保存的,保存或者计算时会有一个类型转换的过程
能够用ziplist
或linkedlist
表示,后来用quicklist
(3.2+)
ziplist
组成的双端列表,链表的每个节点都是一个ziplist,貌似3.2以后,list只用quicklist结构实现list-max-ziplist-size:每一个ziplist(即quicklist的节点)大小,默认-2,此值可正可负,其中正数表示每一个压缩列表中存放的最大元素个数,若是是负数,表示按字节数来限定元素个数:
编码为ziplist
或hashtable
集合对象的编码能够是intset
或者hashtable
set-max-intset-entries
)intset
时,使用hashtable
作为底层实现,使用hashtable
时,只使用键,值为Null,相似于java的HashSet有序集合的编码能够是ziplist
或skiplist
ziplist
实现时,每一个有序集合元素使用挨在一块儿的两个ziplistNode
表示,第一个表示元素成员member,第二个表示分值score;ziplist
中的集合元素按分值从小到大排列,小的靠近表头方向,大的靠近表尾方向;知足以下条件时使用:
zset-max-ziplist-entries
)zset-max-ziplist-value
)zset
结构作为底层实现,每一个zset
同时包含一个字典dict和一个跳跃表skiplist:
注:编码为skiplist
时,跳跃表和字典会共享成员及分值,内存中只占一分,由于不存在内存浪费;
----- 快乐的分割线 -------- 下面其它类型,还没好好研究完---------
发布/订阅彷佛是一项独立功能,不能算一种数据类型,不过从使用上差很少,估且也算在这儿吧;
redis的发布/订阅功能分为两类:频道的发布/订阅及模式的发布/订阅;redis的服务器在redis内部用redisServer
结构表示,而发布订阅的实现,依赖于redisServer
中的两个属性:
pubsub_channels
字典,字典的键表示被订阅的频道,而值是一个链表,存储了全部订阅该频道的客户端;
pubsub_patterns
链表,每一个节点都包含一个pubsubPattern
结构,该结构中存储了订阅模式的客户端和订阅的模式;
pubsubPattern
结构,添加到pubsub_patterns
链表尾pubsub_patterns
,找到含要退订的模式和客户端的节点,删除pubsub_patterns
,向模式匹配的客户发消息注:订阅将阻塞线程,应该在独立线程独立客户端中使用;
使用type查询一个HyperLogLog类型的值,是string,彷佛,是基于string结构实现的HyperLogLog功能?待探究
还没有研究,且目前5.0版本中,做者不建议在生产环境中使用stream,因此学习后再补充
-------- 快乐的分割线------- 知识扩展 ----------------