数据库|15张图解Redis为什么这么快( 三 )
String:存储数字的话 , 采用int类型的编码 , 如果是非数字的话 , 采用 raw 编码;
List:字符串长度及元素个数小于一定范围使用 ziplist 编码 , 任意条件不满足 , 则转化为 linkedlist 编码;
Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;
Set:保存元素为整数及元素个数小于一定范围使用 intset 编码 , 任意条件不满足 , 则使用 hashtable 编码;
Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码 , 任意条件不满足 , 则使用 skiplist 编码 。
合适的线程模型
Redis 快的原因还有一个是因为使用了合适的线程模型:
1、I/O多路复用模型
- I/O :网络 I/O
- 多路:多个 TCP 连接
- 复用:共用一个线程或进程
应对大量的请求 , Redis 中使用 I/O 多路复用程序同时监听多个套接字 , 并将这些事件推送到一个队列里 , 然后逐个被执行 。 最终将结果返回给客户端 。
2、避免上下文切换
你一定听说过 , Redis 是单线程的 。 那么单线程的 Redis 为什么会快呢?
因为多线程在执行过程中需要进行 CPU 的上下文切换 , 这个操作比较耗时 。 Redis 又是基于内存实现的 , 对于内存来说 , 没有上下文切换效率就是最高的 。 多次读写都在一个CPU 上 , 对于内存来说就是最佳方案 。
3、单线程模型
顺便提一下 , 为什么 Redis 是单线程的 。
Redis 中使用了 Reactor 单线程模型 , 你可能对它并不熟悉 。 没关系 , 只需要大概了解一下即可 。
这张图里 , 接收到用户的请求后 , 全部推送到一个队列里 , 然后交给文件事件分派器 , 而它是单线程的工作方式 。 Redis 又是基于它工作的 , 所以说 Redis 是单线程的 。
总结
基于内存实现
- 数据都存储在内存里 , 减少了一些不必要的 I/O 操作 , 操作速率很快 。
- 底层多种数据结构支持不同的数据类型 , 支持 Redis 存储不同的数据;
- 不同数据结构的设计 , 使得数据存储时间复杂度降到最低 。
- 根据字符串的长度及元素的个数适配不同的编码格式 。
- I/O 多路复用模型同时监听客户端连接;
- 单线程在执行过程中不需要进行上下文切换 , 减少了耗时 。
如果觉得文章对你有一点点帮助 , 欢迎分享给你的朋友 , 也给小编点个 赞, 这是小编坚持下去的动力 , 谢谢大家 , 我们下次见!
看完几件事??
如果你觉得这篇内容对你还蛮有帮助 , 我想邀请你帮我个小忙:
点赞 , 转发 , 有你们的 『点赞和评论』 , 才是我创造的动力 。
同时可以期待后续文章ing\uD83D\uDE80
推荐阅读
- DataPipeline亮相2020数据库技术大会,揽获「技术卓越奖」
- WPC数据库中发现华为Mate 40E新型号 搭载麒麟990E芯片
- MySQL数据库数据归档回收工具使用场景分享-爱可生
- FLASK数据库模型
- 当数据库遇上"自动驾驶",阿里云 DAS 在自治诊断的突破
- 电脑重装系统教程来了,Win10 20H2正式版安装图解
- GPT家族又壮大了!OpenAI首次推出数学定理推理模型GPT-f,23个推导结果被专业数据库收录
- 图解|他们是山东科技最强“内核”,致敬齐鲁最美科技工作者
- 十分钟了解Mongodb数据库
- GitHub上两本图解网络/算法书火了,完整版开放下载