深入剖析Redis的数据结构为什么这么快?一文深入了解Redis!

type命令实际返回的是当前键的数据结构类型,它们分别为: string (string)、 hash (hash)、 list (list)、 set (set)、 zset (se部数据结构,如图所示。

事实上,每一种数据结构都有其自身底层的内部编码实现,并且是多种实现,以便 Redis可以在适当的场景中选择适当的内部编码,如下图所示。

可见,每个数据结构都有两种以上的内部编码实现,例如, list数据结构包含 linkedlist和 ziplist两种内部编码。还有一些内部编码,比如 ziplist,是许多外部数据结构的内部实现,可以通过object  encoding命令进行

内部编码:

node01:6379> object encoding hello

"embstr"

node01:6379> object encoding mylist

"quicklist"

你会发现,键 hello的对应值内部编码为 embstr,键 mylist的对应值内部编码为 ziplist。这种设计有两个优点:首先,内部编码可以改进,而外部数据结构和命令不会产生任何影响,这样,一旦开发了更好的内部编码,就不需要修改外部数据结构和命令,例如, Redis3.2提供了 quicklist,它结合了 ziplist和 linkedlist的优点,从而为列表类型提供了更好的内部编码实现,而外部用户基本上不会感觉到这一点。其次,多个内部编码实现可以在不同的场景中发挥各自的优势,比如 ziplist比较节省内存,但当列表元素较多时,性能下降。 Redis就会根据配置选项将列表类型的内部实现转换为 linkedlist。

单线程架构

Redis使用了单线程架构和 I/O多路模式来实现高性能内存数据库服务

将 Redis客户端和 服务器端模型简化为下面的图表,每个客户端调用都要经过发送命令,执行命令,返回结果三个过程。

步骤2主要关注于此,因为 Redis是单线程来处理命令的,因此不会立即执行从客户端到服务端的命令,所有命令都进入一个队列,然后逐个执行。因此,上述3个客户机命令的执行次序不确定(如下图)

但可确定的是,不会有两个命令同时执行(如下图)

因此,不管如何执行两个 incr命令,最终结果都是2,并且不会产生并发问题,这是 Redis单线程的基本模型。

为何单线程仍然可以如此快速

一般情况下,单线程比多线程处理能力差,比如100个人,每辆车每次承载20个人,那么要承载5次才能完成任务,但如果有20辆车,只要安排好,只需一次就能完成任务。所以,为什么 Redis使用单线程模型来实现万分之一秒的处理能力?它可分为三个方面:

1、首先,纯内存访问, Redis把所有数据都放在内存中,响应时间大约是100纳秒,这是每 Redis实现万级访问/秒的重要基础。

2、其次是非阻塞 I/O, Redis使用 epoll来实现 I/O多路复用技术,加上 Redis自己的事件处理模型,在 epoll中将连接、读写、关闭都转换成事件,这样就/O上浪费太多时间。

3、最后,单线程避免了线程切换和竞态消耗。

总结:

1:纯内存存储

2:非阻塞io,io多路复用技术

3:单线程的架构避免了线程切换的资源消耗。

如果觉得对你有所帮助。记得收藏和关注呦!(每日更新各种大数据框架)

如需转载请注明出处(创作不易请见谅)

和巨婴程序猿一起成长。让自己变得更优秀

想了解更多精彩内容,快来关注跟着巨婴去逆袭

我最近一直在思考(大数据通俗讲解)的问题,你的看法是什么呢?关注我快说出来一起交流一下吧~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200709A0I13100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券