数据库|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 , 然后各自发送命令至 Redis 服务器 , 最后服务端处理这些请求返回结果 。

应对大量的请求 , Redis 中使用 I/O 多路复用程序同时监听多个套接字 , 并将这些事件推送到一个队列里 , 然后逐个被执行 。 最终将结果返回给客户端 。

2、避免上下文切换
你一定听说过 , Redis 是单线程的 。 那么单线程的 Redis 为什么会快呢?
因为多线程在执行过程中需要进行 CPU 的上下文切换 , 这个操作比较耗时 。 Redis 又是基于内存实现的 , 对于内存来说 , 没有上下文切换效率就是最高的 。 多次读写都在一个CPU 上 , 对于内存来说就是最佳方案 。
3、单线程模型
顺便提一下 , 为什么 Redis 是单线程的 。
Redis 中使用了 Reactor 单线程模型 , 你可能对它并不熟悉 。 没关系 , 只需要大概了解一下即可 。
这张图里 , 接收到用户的请求后 , 全部推送到一个队列里 , 然后交给文件事件分派器 , 而它是单线程的工作方式 。 Redis 又是基于它工作的 , 所以说 Redis 是单线程的 。
总结
基于内存实现
  • 数据都存储在内存里 , 减少了一些不必要的 I/O 操作 , 操作速率很快 。
高效的数据结构
  • 底层多种数据结构支持不同的数据类型 , 支持 Redis 存储不同的数据;
  • 不同数据结构的设计 , 使得数据存储时间复杂度降到最低 。
合理的数据编码
  • 根据字符串的长度及元素的个数适配不同的编码格式 。
合适的线程模型
  • I/O 多路复用模型同时监听客户端连接;
  • 单线程在执行过程中不需要进行上下文切换 , 减少了耗时 。
几句唠叨
如果觉得文章对你有一点点帮助 , 欢迎分享给你的朋友 , 也给小编点个 赞, 这是小编坚持下去的动力 , 谢谢大家 , 我们下次见!
看完几件事??
如果你觉得这篇内容对你还蛮有帮助 , 我想邀请你帮我个小忙:
点赞 , 转发 , 有你们的 『点赞和评论』 , 才是我创造的动力 。
同时可以期待后续文章ing\uD83D\uDE80


推荐阅读