点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

来源:http://1t.click/jnt

>>阿里云8月最新优惠,点击查看<<

前言

Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数据结构和算法组成。Redis还提供了键过期,发布订阅,事务,Lua脚本,哨兵,Cluster等功能。Redis执行命令的速度非常快,根据官方给的性能可以达到10w+qps。那么本文主要介绍到底Redis快在哪里,主要有以下几点:

一. 开发语言

现在我们都用高级语言来编程,比如Java、python等。也许你会觉得C语言很古老,但是它真的很有用,毕竟unix系统就是用C实现的,所以C语言是非常贴近操作系统的语言。Redis就是用C语言开发的,所以执行会比较快。

另外多说一句,大学生们好好学C,会让你更好的理解计算机操作系统。别觉得学了高级语言就可以不用关注底层,欠的债总归要还的。此处推荐一本比较难啃的书《深入理解计算系统》。

二. 纯内存访问

Redis将所有数据放在内存中,非数据同步正常工作中,是不需要从磁盘读取数据的,0次IO。内存响应时间大约为100纳秒,这是Redis速度快的重要基础。先看看CPU的速度:


拿我的电脑来说,主频是3.1G,也就是说每秒可以执行3.1*10^9个指令。所以说CPU看世界是非常非常慢的,内存比它慢百倍,磁盘比他慢百万倍,你说快不快?

借了一张《深入理解计算机系统》的图,展示了一个典型的存储器层次结构,在L0层,CPU可以在一个时钟周期访问到,基于SRAM的高速缓存春续期,可以在几个CPU时钟周期访问到,然后是基于DRAM的主存,可以在几十到几百个时钟周期访问到他们。


三. 单线程

第一,单线程简化算法的实现,并发的数据结构实现不但困难且测试也麻烦。第二,单线程避免了线程切换以及加锁释放锁带来的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。当然了,单线程也会有它的缺点,也是Redis的噩梦:阻塞。如果执行一个命令过长,那么会造成其他命令的阻塞,对于Redis是十分致命的,所以Redis是面向快速执行场景的数据库。

除了Redis之外,Node.js也是单线程,Nginx也是单线程,但他们都是服务器高性能的典范。

四. 非阻塞多路I/O复用机制

在这之前先要说一下传统的阻塞I/O是如何工作的:当使用read或者write对某一文件描述符(File Descriptor FD)进行读写的时候,如果数据没有收到,那么该线程会被挂起,直到收到数据。阻塞模型虽然易于理解,但是在需要处理多个客户端任务的时候,不会使用阻塞模型。


I/O多路复用实际上是指多个连接的**管理可以在同一进程。**多路是指网络连接,复用只是同一个线程。在网络服务中,I/O多路复用起的作用是一次性把多个连接的事件通知业务代码处理,处理的方式由业务代码来决定。在I/O多路复用模型中,最重要的函数调用就是I/O 多路复用函数,该方法能同时监控多个文件描述符(fd)的读写情况,当其中的某些fd可读/写时,该方法就会返回可读/写的fd个数。


Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll的read、write、close等都转换成事件,不在网络I/O上浪费过多的时间。实现对多个FD读写的监控,提高性能。


举个形象的例子吧。比如一个tcp服务器处理20个客户端socket。A方案:顺序处理,如果第一个socket因为网卡读数据处理慢了,一阻塞后面都玩蛋去。B方案:每个socket请求都创建一个分身子进程来处理,不说每个进程消耗大量系统资源,光是进程切换就够操作系统累的了。C方案**(I/O复用模型,epoll)将用户socket对应的fd注册进epoll(实际上服务器和操作系统之间传递的不是socket的fd而是fd_set的数据结构),然后epoll只告诉哪些需要读/写的socket,只需要处理那些活跃的、有变化的socket fd的就好了。这样,整个过程只在调用epoll的时候才会阻塞,收发客户消息是不会阻塞的。

OpenWrite最受欢迎的技术类内容平台票选

留言交流不过瘾?添加微信:zyc_enjoy

根据指引加入各种主题讨论群

每日一问

今日问题:医生给了小明3颗药丸,每半小时吃一粒,吃完需要多长时间?

(留言说说你的答案吧,明日推文公布答案)

昨日答案:怎么跳都跳不出来...

(昨日问题可在昨日推文的文末查看)

推荐阅读

  • Apache的架构师们遵循的30条设计原则

  • 程序员干私活搞副业?个税问题搞清楚没?

  • Spring Boot + Redis 实现接口幂等性

  • 百万年薪挖了个P8程序员,难道是“水货”?

  • 你必须收藏的Github技巧

签到计划

活动介绍:自律到极致-人生才精致:第12期

活动奖励:《Java微服务测试》* 10

扫描下放二维码,签到参与

来星球聊聊技术人的斜杠生活

点一点“阅读原文”小惊喜在等你

四个大点,搞懂 Redis 到底快在哪里?相关推荐

  1. 【redis 四】一文搞懂redis持久化之RDB

    前言: redis持久化分为RDB和AOF,此篇博文着重讲解RDB方式的持久化.演示系统 centos7. 1.官网说明 地址:https://redis.io/topics/persistence ...

  2. 一文快速搞懂Kudu到底是什么

    文章目录 引言 文章传送门: Kudu 介绍 背景介绍 新的硬件设备 Kudu 是什么 Kudu 应用场景 Kudu 架构 数据模型 分区策略 列式存储 整体架构 Kudu Client 交互 Kud ...

  3. 带你搞懂 Redis 中的两个策略

    面试的时候问到候选人 Redis 相关问题时,发现一个现象:一部分候选人分不清 Redis 的「键过期策略」和「内存淘汰策略」.今天就来说一说这老哥俩. 简单来说,过期策略就是当 key 到了指定的过 ...

  4. 面试还搞不懂Redis,快看看这40道面试题!| 博文精选

    作者| 程序员追风 责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 近年来,微服务变得越来越热门,越来越多的应用部署在分布式环境中.常用的分布式实现方式之一就有 Redis ...

  5. 五大点,搞懂单线程的Redis到底快在哪里

    目录 前言 一.开发语言 二.纯内存访问 三.数据结构简单 四.单线程 五.非阻塞多路I/O复用机制 前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可 ...

  6. 一文搞懂 Redis

    一 什么是NoSQL? Nosql = not only sql(不仅仅是SQL) 关系型数据库:列+行,同一个表下数据的结构是一样的. 非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展. ...

  7. 12 个问题搞懂 Redis

    都说学习需要带着问题,带着思考进行学习,下面就以问题的形式来学习下 Redis . 1.什么是 Redis ? Redis 是一个高性能的 key-value 数据库: 作者来自意大利西西里岛的 Sa ...

  8. 怎么实现注解_通透!一口气搞懂注解到底怎么用

    日志脱敏场景简介 在日志里我们的日志一般打印的是 model 的 Json string,比如有以下 model 类 public class Request { /** * 用户姓名 */ priv ...

  9. 【1万字搞懂】到底什么是CRM系统以及怎么选

    目录 1. 什么是CRM CRM的定义 CRM为什么如此重要 CRM软件类型 2. CRM如何发挥作用 CRM如何帮助企业营销获客 CRM是怎么帮助销售提升业绩 CRM如何帮助提高客户满意度 3. 如 ...

最新文章

  1. 【哈渡谱】带你玩转Hadoop之《主机映射、镜像挂载与SSH免密篇》
  2. python线程池模块_python并发编程之进程池,线程池,协程
  3. Azure上A/D系列虚拟机到DS系列迁移(2)
  4. GetLocaleInfo和本地化
  5. mysql存储引擎处理_[MySql学习笔记] 四 存储引擎事务处理
  6. 浅谈群集与分布式基础知识
  7. [2020.11.26NOIP模拟赛]询问【字符串hash】
  8. DotNetCore中异步编程的实用演练
  9. 通过管道传输快速将MySQL的数据导入Redis
  10. 向Spark的DataFrame增加一列数据
  11. jenkins 编译java_Jenkins 通过 maven 构建编译 JAVA 项目环境
  12. 用setuna截图时自动放大_setuna截图软件下载
  13. 好用的源码行数统计工具——cloc
  14. 使用谷歌云盘生成直接下载的url
  15. 安装Pytorch-gpu版本(第一次安装 或 已经安装Pytorch-cpu版本后)
  16. Camera ISP
  17. 8月26日计算机视觉理论学习笔记——医疗影像分割
  18. 算术左移,逻辑左移,算术右移,逻辑右移之间的区别
  19. Unity官方中文版(有生之年终于等到了)
  20. k8s可视化管理工具Rancher安装和使用

热门文章

  1. python flask gunicorn nginx 部署
  2. linux 内核 netfilter 网络过滤模块 (1)-框架
  3. Arduino各开发板针脚示意图
  4. 字符串转64位int(strtol,_atoi64)
  5. XP 组件中没有IIS,如何添加IIS组件
  6. 提权函数之RtlAdjustPrivilege()
  7. java 导入包报错_Intellij IDEA 导入个推jar包 报错java.lang.NoClassDefFoundError
  8. oracle limsize,Oracle9i AIX上单进程占用内存过多问题
  9. C Capture Full IE Document
  10. [总结篇4] l2-agent的细节