- redis各种数据类型的工作原理
- string
- list
- hash
- set(集合)
- zset(有序集合)
- (思考1):为什么redis使用跳跃表而不是红黑树?
- (思考2): 都可以范围取值,为什么mysql使用b+树不用跳跃表,为什么redis使用跳跃表不用b+树?
- 之前的redis只实现了基本数据string类型的操作,那能不能实现多种数据类型的操作呢?
- 当然是可以的,但是在此之前我们需要了解redis各种数据类型个工作原理
仓库地址: https://github.com/dengjiayue/my-redis-v2.0-RESP-.git
redis各种数据类型的工作原理
string
- 应用场景: 做数据缓存
- 就是普通的字符串键值储存
- 那么我们是直接使用map[string]string去实现就行了
list
- 应用场景: 消息队列
- 列表,是一个链表的形式,他的lpush与rpop实现的是队列的功能,
- 那么我们可以做一个简单的队列去实现list的功能
hash
- 应用场景: 缓存对象数据
- hash主要用于储存对象的数据,底层也是一个哈希表
- 我们可以使用一个单独的map[string]map[string]string去实现哈希的功能
set(集合)
- 应用场景: 储存标签什么的(集合的成员是唯一的)
- 集合的底层实际上是使用字典实现的,
- 我们只需要保证每个成员的唯一性,可以使用一个map来保证每个成员的唯一性,val可以选择bool类型
zset(有序集合)
-
有序集合在集合的基础上面增加了排序的特性,每一个成员都有自己的分数,通过分数进行排序的,底层使用的跳跃表的数据形式,上层的节点有指向下层节点对应位置的指针,思路就是利用二分查找的方式提高查询效率,有点像红黑树.
-
我们需要在原来的集合的基础上再加上一个跳跃表来实现有序集合的功能
(思考1):为什么redis使用跳跃表而不是红黑树?
:因为跳跃表是连续的,方便进行范围取值,红黑树范围取值不方便.
(思考2): 都可以范围取值,为什么mysql使用b+树不用跳跃表,为什么redis使用跳跃表不用b+树?
:redis是专注于高性能的内存数据库,B+树的插入与删除涉及到b+树分支到分裂合并等复杂的操作逻辑,而跳跃表的插入删除对比起来就显得十分简单,性能更高
: mysql是磁盘数据库,他的性能瓶颈并不是数据操作的速度,而是磁盘io,他需要的是更少的磁盘io才能有更高的性能,跳跃表与红黑树类似,当数据太多的时候,跳跃表的层数会更多,需要磁盘io的次数也会更多,速度反而会更慢;而使用B+树的格式,树层数会很少,磁盘io会很少,性能会更高.
- 除此之外 ,你还需要封装他们各自的请求数据的解码与响应数据的编码,以便于能够顺利的处理发送过来的请求.
仓库地址: https://github.com/dengjiayue/my-redis-v2.0-RESP-.git