Redis的五种数据结构和底层实现

一、什么是Redis?

redis是一个开源,高级的键值存储和一个使用的

Redis的优点:

异常快:Redis是一个缓存数据库,数据存放在缓存中。

支持丰富的数据类型:支持开发人员常用的大多数数据类型,这使得Redis很容易被用来解决问题,因为我们知道哪些问题可以用哪些数据类型来很好的解决。

操作具有原子性:所有Redis操作都是一个原子操作,这确保如果两个客户端并发访问,Redis服务器能接收到更新的值

多实用工具:可以用于多种实例。

二、Redis和其他数据库的区别

1、Redis和MySQL的区别:

MySQL:关系型数据库,主要用于存放持久化数据,数据存放于磁盘中,读取速度较慢。

Redis:非关系型数据库,也是缓存数据库,也就是将数据存放于缓存中,缓存的读取速度快,能够大大的提高运行速率,但是保存时间是有限的。

2、Redis和Memchache的区别:

前者出现的较晚,弥补了后者很多的不足,但是两者目前都有自己的优势:

RedisMemchache
数据存储介质数据存放在内存和磁盘中,能够达到持久化存储(RDB和AOF)

都存放在内存中,一旦失效数据就丢失,无法恢复

数据存储方式键值对,但支持set,hash,list,zet等数据结构的存储键值对,只支持字符
架构层次Master-Slave(主从)模式分布式
存储数据大小单个Value存储的数据最大为1G存储的最大为1MB
支持只支持单核支持多核

三、Redis的5种数据结构和底层实现

string(字符串)list(列表)hash(字典)set(集合) 和 zset(有序集合)

1、string 字符串

是一种动态字符串,使用者可以修改。Redis为了对内存做到极致的优化,不同长度的字符串使用不同的结构体来表示。

为什么不采用C语言的字符串呢?获取字符串长度为O(N)级别的操作;不能很好的杜绝缓冲区溢出/内容泄露;只能保存文本数据(ASCII)

2、List 列表

插入和删除速度快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。

本图和部分内容来源:Redis——5种数据结构底层实现原理_Slayer_Zhao的博客-优快云博客_redis数据底层结构

3.hash 字典 

“数组+链表”的连地址法来解决部分哈希冲突。hashmap

4.Set 集合

键值对是无序的,唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。hashset

5、Zset 有序列表

一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以为每个 value 赋予一个 score 值,用来代表排序的权重。

ziplist(当数据数量小于128,每个数据的大小都小于64字节),skiplist

图片来源:redis zset底层实现原理 - YF-海纳百川 - 博客园 

skiplist: 跳跃表(skipList)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。

  • 每个节点上都保存了一个用于指向其后节点的指针数组(即前文所述);
  • 设置一个指向前一个节点的指针(方便逆向获取数据,如zrevrankzrevrange);
  • 创建了一个length和一个level属性用于快速查询跳表的节点数目和指针数组的最大长度;
  • 节点中还会保存前向指针跳过的节点数span,可以用于分页。
  • 最大32层指针,是因为生成指针的期望是1/4,所以2^32个节点中,才会有一个32层指针的节点,32层完全够用。

跳表内容来源:Redis-zskiplist(跳表)这种数据结构的思考 - 知乎

### Redis 的基础数据结构及其底层实现 #### 字符串 (String) 字符串是最简单的键值对存储形式,在 Redis 中,字符串可以保存任何形式的二进制安全字符串[^1]。对于较小的对象,Redis 使用简单动态字符串(SDS, Simple Dynamic String),它是一个封装后的 C 字符串,提供了额外的功能并解决了传统 C 字符串的一些缺陷。 优点在于操作简便快速;缺点则是当数值较大时执行某些命令可能会阻塞服务器进程。适用于缓存少量数据或者计数器场景。 ```python SET key value GET key INCR key DECR key ``` #### 列表 (List) 列表由链表实现,支持两端高效插入删除节点的操作,但是随机访问效率较低。适合用于消息队列、最新N条记录等功能需求。 优点是可以轻松地向头部或尾部添加元素而不影响其他部分;缺点是在获取中间位置元素时性能较差。典型应用场景包括聊天室的消息推送以及社交网络中的时间线更新等。 ```python LPUSH mylist "world" RPUSH mylist "hello" LRANGE mylist 0 -1 ``` #### 集合 (Set) 集合基于哈希表构建而成,能够保证成员唯一性的同时提供高效的查找速度。可用于去重统计、好友关系维护等方面的工作。 优势体现在能迅速判断某个元素是否存在集合之中;劣势则是因为内部采用散列表来表示所以占用空间相对较多一些。常见用途有标签系统管理、权限控制下的资源分配策略制定等等。 ```python SADD myset "member1" SMEMBERS myset SCARD myset ``` #### 有序集合 (Sorted Set) 有序集合同样依赖于字典树加跳跃表的数据模型组合起来完成排序功能。除了具备常规 set 类型的特点外还能按照分数顺序排列各个项目。 长处在于既保留了无序版本的优点又增加了按需检索的能力;短处就是每次修改都会引起整个索引重建从而带来一定开销。实际应用广泛存在于排行榜展示、优先级任务调度等领域之内。 ```python ZADD mystoredset 1 "one" ZADD mystoredset 2 "two" ZRANGE mystoredset 0 -1 WITHSCORES ``` #### 哈希表 (Hash) 哈希表用来储存对象字段属性之间的映射关系。通过这种方式可以在一次请求里批量处理多个子项的信息读写事务。 好处是简化了复杂实体建模过程并且提高了并发度;坏处可能造成内存碎片化加剧进而降低整体吞吐量表现。一般会出现在商品详情页加载或是用户资料编辑页面当中。 ```python HSET user:1 name "Alice" HGETALL user:1 HEXISTS user:1 age ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值