数据库|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
- 更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇
- openGauss魔改PG?它能兼容Oracle的数据库表吗?
- 分布式数据库Hbase入门介绍
- 屏幕数据简报〡realme Q2
- 图解|什么是高并发利器NoSQL
- 分布式SQL数据库新的演变方向
- 带你了解MySQL数据库小技巧
- 图解|零拷贝Zero-Copy技术大揭秘
- 关系型数据库管理系统openGauss 1.0.1版本发布
- 组态王与SQL数据库通讯--①定义ODBC数据源