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:单线程的架构避免了线程切换的资源消耗。
如果觉得对你有所帮助。记得收藏和关注呦!(每日更新各种大数据框架)
如需转载请注明出处(创作不易请见谅)
和巨婴程序猿一起成长。让自己变得更优秀
想了解更多精彩内容,快来关注跟着巨婴去逆袭
我最近一直在思考(大数据通俗讲解)的问题,你的看法是什么呢?关注我快说出来一起交流一下吧~
领取专属 10元无门槛券
私享最新 技术干货