iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis为何速度这么快
  • 811
分享到

Redis为何速度这么快

2024-04-02 19:04:59 811人浏览 八月长安
摘要

小编给大家分享一下Redis为何速度这么快,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 我们都知道

小编给大家分享一下Redis为何速度这么快,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

我们都知道Redis很快,它QPS可达10万(每秒请求数)。那Redis为什么这么快呢

Redis为何速度这么快

基于内存实现

我们都知道内存读写是比磁盘读写快很多的。Redis是基于内存存储实现的数据库,相对于数据存在磁盘的数据库,就省去磁盘磁盘I/O的消耗。Mysql等磁盘数据库,需要建立索引来加快查询效率,而Redis数据存放在内存,直接操作内存,所以就很快。

Redis为何速度这么快

高效的数据结构

我们知道,mysql索引为了提高效率,选择了B+树的数据结构。其实合理的数据结构,就是可以让你的应用/程序更快。先看下Redis的数据结构&内部编码图:

Redis为何速度这么快

SDS简单动态字符串

Redis为何速度这么快

struct sdshdr { //SDS简单动态字符串
    int len;    //记录buf中已使用的空间
    int free;   // buf中空闲空间长度
    char buf[]; //存储的实际内容
}
字符串长度处理

C语言中,要获取捡田螺的小男孩这个字符串的长度,需要从头开始遍历,复杂度为O(n); 在Redis中, 已经有一个len字段记录当前字符串的长度啦,直接获取即可,时间复杂度为O(1)。

减少内存重新分配的次数

在C语言中,修改一个字符串,需要重新分配内存,修改越频繁,内存分配就越频繁,而分配内存是会消耗性能的。而在Redis中,SDS提供了两种优化策略:空间预分配和惰性空间释放。

空间预分配

当SDS简单动态字符串修改和空间扩充时,除了分配必需的内存空间,还会额外分配未使用的空间。分配规则是酱紫的:

  • SDS修改后,len的长度小于1M,那么将额外分配与len相同长度的未使用空间。比如len=100,重新分配后,buf 的实际长度会变为100(已使用空间)+100(额外空间)+1(空字符)=201。

  • SDS修改后, len长度大于1M,那么程序将分配1M的未使用空间。

惰性空间释放

当SDS缩短时,不是回收多余的内存空间,而是用free记录下多余的空间。后续再有修改操作,直接使用free中的空间,减少内存分配。

哈希

Redis 作为一个K-V的内存数据库,它使用用一张全局的哈希来保存所有的键值对。这张哈希表,有多个哈希桶组成,哈希桶中的entry元素保存了*key*value指针,其中*key指向了实际的键,*value指向了实际的值。

Redis为何速度这么快

哈希表查找速率很快的,有点类似于Java中的HashMap,它让我们在O(1) 的时间复杂度快速找到键值对。首先通过key计算哈希值,找到对应的哈希桶位置,然后定位到entry,在entry找到对应的数据。

有些小伙伴可能会有疑问:你往哈希表中写入大量数据时,不是会遇到哈希冲突问题嘛,那效率就会降下来啦。

哈希冲突: 通过不同的key,计算出一样的哈希值,导致落在同一个哈希桶中。

Redis为了解决哈希冲突,采用了链式哈希。链式哈希是指同一个哈希桶中,多个元素用一个链表来保存,它们之间依次用指针连接。

Redis为何速度这么快

有些小伙伴可能还会有疑问:哈希冲突链上的元素只能通过指针逐一查找再操作。当往哈希表插入数据很多,冲突也会越多,冲突链表就会越长,那查询效率就会降低了。

为了保持高效,Redis 会对哈希表做rehash操作,也就是增加哈希桶,减少冲突。为了rehash更高效,Redis还默认使用了两个全局哈希表,一个用于当前使用,称为主哈希表,一个用于扩容,称为备用哈希表。

跳跃表

跳跃表是Redis特有的数据结构,它其实就是在链表的基础上,增加多级索引,以提高查找效率。跳跃表的简单原理图如下:

Redis为何速度这么快

  • 每一层都有一条有序的链表,最底层的链表包含了所有的元素。

  • 跳跃表支持平均 O(logN),最坏 O(N)复杂度的节点查找,还可以通过顺序性操作批量处理节点。

压缩列表ziplist

压缩列表ziplist是列表键和字典键的的底层实现之一。它是由一系列特殊编码的内存块构成的列表, 一个ziplist可以包含多个entry, 每个entry可以保存一个长度受限的字符数组或者整数,如下:

Redis为何速度这么快

  • zlbytes :记录整个压缩列表占用的内存字节数

  • zltail: 尾节点至起始节点的偏移量

  • zllen : 记录整个压缩列表包含的节点数量

  • entryX: 压缩列表包含的各个节点

  • zlend : 特殊值0xFF(十进制255),用于标记压缩列表末端

由于内存是连续分配的,所以遍历速度很快。。

合理的数据编码

Redis支持多种数据基本类型,每种基本类型对应不同的数据结构,每种数据结构对应不一样的编码。为了提高性能,Redis设计者总结出,数据结构最适合的编码搭配。

Redis是使用对象(redisObject)来表示数据库中的键值,当我们在 Redis 中创建一个键值对时,至少创建两个对象,一个对象是用做键值对的键对象,另一个是键值对的值对象。

//关注公众号:捡田螺的小男孩
typedef struct redisObject{
    //类型
   unsigned type:4;
   //编码
   unsigned encoding:4;
   //指向底层数据结构的指针
   void *ptr;
    //...
 }robj;

redisObject中,type 对应的是对象类型,包含String对象、List对象、Hash对象、Set对象、zset对象。encoding 对应的是编码。

  • String:如果存储数字的话,是用int类型的编码;如果存储非数字,小于等于39字节的字符串,是embstr;大于39个字节,则是raw编码。

  • List:如果列表的元素个数小于512个,列表每个元素的值都小于64字节(默认),使用ziplist编码,否则使用linkedlist编码

  • Hash:哈希类型元素个数小于512个,所有值小于64字节的话,使用ziplist编码,否则使用hashtable编码。

  • Set:如果集合中的元素都是整数且元素个数小于512个,使用intset编码,否则使用hashtable编码。

  • Zset:当有序集合的元素个数小于128个,每个元素的值小于64字节时,使用ziplist编码,否则使用skiplist(跳跃表)编码

合理的线程模型

单线程模型:避免了上下文切换

Redis是单线程的,其实是指Redis的网络IO和键值对读写是由一个线程来完成的。但Redis的其他功能,比如持久化、异步删除、集群数据同步等等,实际是由额外的线程执行的。

Redis的单线程模型,避免了CPU不必要的上下文切换竞争锁的消耗。也正因为是单线程,如果某个命令执行过长(如hgetall命令),会造成阻塞。Redis是面向快速执行场景的内存数据库,所以要慎用如lrange和smembers、hgetall等命令。

什么是上下文切换?举个粟子:

  • 比如你在看一本英文小说,你看到某一页,发现有个单词不会读,你加了个书签,然后去查字典。查完字典后,你回来从书签那里继续开始读,这个流程就很舒畅。

  • 如果你一个人读这本书,肯定没啥问题。但是如果你去查字典的时候,别的小伙伴翻了一下你的书,然后溜了。你再回来看的时候,发现书不是你看的那一页了,你得花时间找到你的那一页。

  • 一本书,你一个人怎么看怎么打标签都没事,但是人多了翻来翻去,这本书各种标记就很乱了。可能这个解释很粗糙,但是道理应该是一样的。

Redis为何速度这么快

I/O 多路复用

什么是I/O多路复用?

  • I/O :网络 I/O

  • 多路 :多个网络连接

  • 复用:复用同一个线程。

  • io多路复用其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。

Redis为何速度这么快

多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。

虚拟内存机制

Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

Redis的虚拟内存机制是啥呢?

虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。

以上是“Redis为何速度这么快”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Redis为何速度这么快

本文链接: https://www.lsjlt.com/news/60876.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis为何速度这么快
    小编给大家分享一下Redis为何速度这么快,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 我们都知道...
    99+
    2024-04-02
  • Redis速度为什么快
    这篇文章给大家分享的是有关Redis速度为什么快的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Va...
    99+
    2024-04-02
  • redis单线程执行速度这么快的原因
    这篇文章主要介绍了redis单线程执行速度这么快的原因,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。Redis之所以执行速度很快,主要依赖于以下...
    99+
    2024-04-02
  • 如何从数据存储角度分析Redis为何这么快
    如何从数据存储角度分析Redis为何这么快,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、简介和应用Redis是一个由ANS...
    99+
    2024-04-02
  • Redis为什么选择单线程?Redis为什么这么快?
    今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。 一、Re...
    99+
    2023-03-21
    redis为什么选择单线程和双线程 为什么redis是单线程的 redis单线程为什么能支持并发
  • 美国服务器机房访问速度为什么这么快
    美国服务器机房访问速度快的原因可能有以下几点: 网络基础设施完善:美国拥有世界领先的网络基础设施,包括高速光纤网络覆盖率高、网络...
    99+
    2024-04-09
    美国服务器 服务器
  • Redis是单线程为什么这么快
    这篇文章给大家分享的是有关Redis是单线程为什么这么快的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.Redis简介Redis是一个开源的内存中的数据结构存储系统,它可以用作...
    99+
    2024-04-02
  • 云服务器速度比个人电脑快吗为什么这么慢
    另外,云服务器的使用也可以使得数据更加安全和可靠。因为云服务器可以提供高可用性和高安全性的服务,当用户的数据出现问题时,云服务器可以快速地为用户提供数据备份和恢复的服务,保证用户数据的安全性。 此外,云服务器的高可扩展性也可以为用户提供更...
    99+
    2023-10-27
    个人电脑 速度 服务器
  • Redis使用单线程为什么还这么快
    这篇文章将为大家详细讲解有关Redis使用单线程为什么还这么快,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis为什么用单线程?多线程的开销通常情况下,在采用多线程后,如果没有良好的系统设计,其实是...
    99+
    2023-06-29
  • mongodb和redis哪个读取速度快
    redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用...
    99+
    2024-04-02
  • redis单线程速度快的原因
    小编给大家分享一下redis单线程速度快的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Redis之所以执行速度很快,主要依赖于以下几个原因:(一)纯内存操作,避免大量访问数据库,减少直接...
    99+
    2024-04-02
  • 美国服务器速度为什么快
    美国服务器速度快的原因:1.美国服务器都会提供SSD升级选项,用于存储您的站点数据,可以确保服务器快速加载;2.美国服务器可以提供高性能的CPU和大容量的RAM,一台服务器往往可以运行多个网站;3.美国网络带宽充足,一般都是以100M为基本...
    99+
    2024-04-02
  • Nginx 为什么这么快?
    来源:rrd.me/ggFBdNginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 N...
    99+
    2023-06-04
  • Redis为什么快
    本篇内容介绍了“Redis为什么快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis是C语言开发的,C语言自己就有字符类型,但是Red...
    99+
    2023-06-16
  • 速度快的vps价格为什么不同
    速度快vps价格不同的原因有:1、vps的品牌,品牌知名度越高,价格越高;2、vps的配置,配置越高,价格越高;3、vps的节点,就近节点比较便宜;4、vps购买时间的长短,时间越长,价格越高;5、vps的优惠活动,活动优惠折扣大,租用vp...
    99+
    2024-04-02
  • 为什么香港服务器的速度快
    香港服务器速度快的原因有:1、香港服务器带宽资源充足,并且分为香港本地带宽和国际带宽两种,使用专线直连情况下ping值可以低到50ms左右;2、香港处于全球网络枢纽位置,香港服务器的线路不存在国内电信跟网通互联不互通的问题,因此所有访问者速...
    99+
    2024-04-02
  • 如何快速了解Redis
    本篇内容介绍了“如何快速了解Redis”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Redis是现在很...
    99+
    2024-04-02
  • golang为什么可以这么快
    golang可以这么快的原因:1、并发编程模型,提供了一个轻量级的Goroutine机制,能以非常低的成本启动和管理成千上万个并发执行的Goroutine;2、垃圾回收机制,能自动检测和清理不再使用的内存,减轻开发人员的负担;3、高效的编译...
    99+
    2023-07-17
  • 为什么香港云主机托管的速度快
    香港云主机托管速度快的要素:1. 香港云主机部署在顶尖主机房,基本设施完善,硬件齐全,保证网络的路线通畅,降低设备故障率。2. 香港云主机采用双线网络,迅速连接内地和国外,实现全球互访无压力。具体内容如下:一、高級硬件配置主机房配备决策服务...
    99+
    2024-04-02
  • mongodb为什么比redis快
    MongoDB比Redis快的原因有以下几点:1. 数据存储方式不同:Redis是基于内存的数据库,数据存储在内存中,而MongoD...
    99+
    2023-08-31
    mongodb redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作