返回顶部
首页 > 资讯 > 精选 >Redis为什么快
  • 659
分享到

Redis为什么快

2023-06-16 10:06:02 659人浏览 独家记忆
摘要

本篇内容介绍了“Redis为什么快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis是C语言开发的,C语言自己就有字符类型,但是Red

本篇内容介绍了“Redis为什么快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

RedisC语言开发的,C语言自己就有字符类型,但是Redis却没直接采用C语言的字符串类型,而是自己构建了动态字符串(SDS)的抽象类型。

Redis为什么快

就好比这样的一个命令,其实我是在Redis创建了两个SDS,一个是名为aobing的Key SDS,另一个是名为cool的Value SDS,就算是字符类型的List,也是由很多的SDS构成的Key和Value罢了。

SDS在Redis中除了用作字符串,还用作缓冲区(buffer),那到这里大家都还是有点疑惑的,C语言的字符串不好么为啥用SDS?SDS长啥样?有什么优点呢?

为此我去找到了Redis的源码,可以看到SDS值的结果大概是这样的,源码的在GitHub上是开源的大家一搜就有了。

struct sdshdr{      int len;      int free;      char buf[];  }

Redis为什么快

回到最初的问题,为什么Redis用了自己新开发的SDS,而不用C语言的字符串?那好我们去看看他们的区别。

SDS与C字符串的区别

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 计数方式不同

C语言对字符串长度的统计,就完全来自遍历,从头遍历到末尾,直到发现空字符就停止,以此统计出字符串的长度,这样获取长度的时间复杂度来说是0(n),大概就像下面这样:

Redis为什么快

但是这样的计数方式会留下隐患,所以Redis没有采用C的字符串,我后面会提到。

而Redis我在上面已经给大家看过结构了,他自己本身就保存了长度的信息,所以我们获取长度的时间复杂度为0(1),是不是发现了Redis快的一点小细节了?还没完,不止这些。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 杜绝缓冲区溢出

字符串拼接是我们经常做的操作,在C和Redis中一样,也是很常见的操作,但是问题就来了,C是不记录字符串长度的,一旦我们调用了拼接的函数,如果没有提前计算好内存,是会产生缓存区溢出的。

比如本来字符串长这样:

Redis为什么快

你现在需要在后面拼接 ,但是你没计算好内存,结果就可能这样了:

Redis为什么快

这是你要的结果么?很显然,不是,你的结果意外的被修改了,这要是放在线上的系统,这不是完了?那Redis是怎么避免这样的情况的?

我们都知道,他结构存储了当前长度,还有free未使用的长度,那简单呀,你现在做了拼接操作,我去判断一些是否可以放得下,如果长度够就直接执行,如果不够,那我就进行扩容。

这些大家在Redis源码里面都是可以看到对应的api的,后面我就不一一贴源码了,有兴趣的可以自己去看一波,需要一点C语言的基础。

Redis为什么快

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  减少修改字符串时带来的内存重分配次数

C语言字符串底层也是一个数组,每次创建的时候就创建一个N+1长度的字符,多的那个1,就是为了保存空字符的,这个空字符也是个坑,但是不是这个环节探讨的内容。

Redis是个高速缓存数据库,如果我们需要对字符串进行频繁的拼接和截断操作,如果我们写代码忘记了重新分配内存,就可能造成缓冲区溢出,以及内存泄露。

内存分配算法很耗时,且不说你会不会忘记重新分配内存,就算你全部记得,对于一个高速缓存数据库来说,这样的开销也是我们应该要避免的。

Redis为了避免C字符串这样的缺陷,就分别采用了两种解决方案,去达到性能最大化,空间利用最大化:

  •  空间预分配:当我们对SDS进行扩展操作的时候,Redis会为SDS分配好内存,并且根据特定的公式,分配多余的free空间,还有多余的1byte空间(这1byte也是为了存空字符),这样就可以避免我们连续执行字符串添加所带来的内存分配消耗。

比如现在有这样的一个字符:

Redis为什么快

我们调用了拼接函数,字符串边长了,Redis还会根据算法计算出一个free值给他备用:

Redis为什么快

我们再继续拼接,你会发现,备用的free用上了,省去了这次的内存重分配:

Redis为什么快

  •  惰性空间释放:刚才提到了会预分配多余的空间,很多小伙伴会担心带来内存的泄露或者浪费,别担心,Redis大佬一样帮我们想到了,当我们执行完一个字符串缩减的操作,redis并不会马上收回我们的空间,因为可以预防你继续添加的操作,这样可以减少分配空间带来的消耗,但是当你再次操作还是没用到多余空间的时候,Redis也还是会收回对于的空间,防止内存的浪费的。

还是一样的字符串:

Redis为什么快

当我们调用了删减的函数,并不会马上释放掉free空间:

Redis为什么快

如果我们需要继续添加这个空间就能用上了,减少了内存的重分配,如果空间不需要了,调用函数删掉就好了:

Redis为什么快

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 二进制安全

仔细看的仔肯定看到上面我不止一次提到了空字符也就是’0‘,C语言是判断空字符去判断一个字符的长度的,但是有很多数据结构经常会穿插空字符在中间,比如图片,音频,视频,压缩文件的二进制数据,就比如下面这个单词,他只能识别前面的 不能识别后面的字符,那对于我们开发者而言,这样的结果显然不是我们想要的对不对。

Redis为什么快

Redis就不存在这个问题了,他不是保存了字符串的长度嘛,他不判断空字符,他就判断长度对不对就好了,所以redis也经常被我们拿来保存各种二进制数据,我反正是用的很high,经常用来保存小文件的二进制。

Redis为什么快

“Redis为什么快”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Redis为什么快

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

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

猜你喜欢
  • Redis为什么快
    本篇内容介绍了“Redis为什么快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis是C语言开发的,C语言自己就有字符类型,但是Red...
    99+
    2023-06-16
  • Redis速度为什么快
    这篇文章给大家分享的是有关Redis速度为什么快的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Va...
    99+
    2024-04-02
  • mongodb为什么比redis快
    MongoDB比Redis快的原因有以下几点:1. 数据存储方式不同:Redis是基于内存的数据库,数据存储在内存中,而MongoD...
    99+
    2023-08-31
    mongodb redis
  • Redis为什么选择单线程?Redis为什么这么快?
    今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。 一、Re...
    99+
    2023-03-21
    redis为什么选择单线程和双线程 为什么redis是单线程的 redis单线程为什么能支持并发
  • Redis是单线程为什么这么快
    这篇文章给大家分享的是有关Redis是单线程为什么这么快的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.Redis简介Redis是一个开源的内存中的数据结构存储系统,它可以用作...
    99+
    2024-04-02
  • 为什么redis的运行速度很快
    为什么redis的运行速度很快?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Redis是纯内存数据库,一般都是简单的存取操作,...
    99+
    2024-04-02
  • 为什么说单线程的Redis比较快
    这篇文章主要为大家展示了“为什么说单线程的Redis比较快”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“为什么说单线程的Redis比较快”这篇文章吧。单线程的 ...
    99+
    2024-04-02
  • 浅谈为什么单线程的redis那么快
    目录redis单机QPS为什么这么快内存型数据库简单的数据结构单线程IO多路复用总结redis单机QPS ./redis-benchmark -t set,lpush -n 1...
    99+
    2024-04-02
  • Redis使用单线程为什么还这么快
    这篇文章将为大家详细讲解有关Redis使用单线程为什么还这么快,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis为什么用单线程?多线程的开销通常情况下,在采用多线程后,如果没有良好的系统设计,其实是...
    99+
    2023-06-29
  • Redis为何速度这么快
    小编给大家分享一下Redis为何速度这么快,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 我们都知道...
    99+
    2024-04-02
  • Redis的快照为什么不会阻塞其他请求
    今天就跟大家聊聊有关Redis的快照为什么不会阻塞其他请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为什么这么设计(Why's THE ...
    99+
    2024-04-02
  • Nginx 为什么这么快?
    来源:rrd.me/ggFBdNginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 N...
    99+
    2023-06-04
  • cdn分发为什么快
    cdn是内容分发网络。其原理是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,从而使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,cdn系统能够实时地根据网络流量和各节点...
    99+
    2024-04-02
  • golang为什么编译快
    go 具备快速编译的优势,得益于以下因素:并行编译、增量编译、简单语法、高效数据结构、预编译头文件、垃圾回收和其他优化措施。 Go 编译速度快的优势 Go 以其快速的编译速度而著称,在...
    99+
    2024-04-21
    golang 垃圾回收器 标准库
  • Redis快速部署为Docker容器的实现方法是什么
    Redis快速部署为Docker容器的实现方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis是一种内存键值存储,可以保存高性能的抽象数据结构。开源软件通常用...
    99+
    2023-06-22
  • 为什么要使用redis
    这篇文章给大家分享的是有关为什么要使用redis的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。为什么要使用redis?redis数据库是将数据存储在内存中的,并且读写内存的速度要...
    99+
    2024-04-02
  • mysql索引为什么会快
    mysql索引快速的原因有:1、减少数据扫描量,将数据按照特定的规则进行排序;2、加速排序和分组操作,当查询包含排序、分组或聚合函数时,索引可以大大减少排序和分组操作的时间复杂度;3、避免重复数据读取,将相同的数据存储在一起,减少了重复记录...
    99+
    2023-07-28
  • golang为什么可以这么快
    golang可以这么快的原因:1、并发编程模型,提供了一个轻量级的Goroutine机制,能以非常低的成本启动和管理成千上万个并发执行的Goroutine;2、垃圾回收机制,能自动检测和清理不再使用的内存,减轻开发人员的负担;3、高效的编译...
    99+
    2023-07-17
  • redis为什么用单线程
    本篇内容主要讲解“redis为什么用单线程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis为什么用单线程”吧!1.基本概念什么是redis的单线程(核心...
    99+
    2024-04-02
  • redis订阅为什么阻塞
    redis订阅阻塞的原因: redis采用单线程处理请求。 reactor模型是同步IO,需要等待命令执行完成,才会返回结果,进入下一次执行过程。 一旦某个客户端的某个命令执行时间很长,就会阻塞其他客户端。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作