【redis】Redis为什么能抗住10万并发?

news2025/1/31 11:29:02

文章目录

  • 1. Redis简介
  • 2. 内存操作
  • 3. 丰富的对象类型
  • 4. 高效的数据结构
  • 5. 单线程模型
  • 6. 多路IO复用模型
  • 7. 总结

1. Redis简介

Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。

Redis还提供了多种特性,如持久化、事务、发布订阅、Lua脚本、管道、主从复制、哨兵机制、集群机制等,可以保证数据的安全性、一致性和可用性。

Redis的速度非常快,官方称其可以达到每秒10万次的读写操作。和其他数据库相比,Redis有着明显的优势。例如,和MySQL相比,Redis的速度大约快了100倍;和MongoDB相比,Redis的速度大约快了10倍。这些优势使得Redis成为了很多互联网公司和开发者的首选数据库。

那么,Redis为什么这么快呢?主要有以下几个原因:

  • 使用内存存储数据,避免了磁盘IO的开销,提高了数据访问的速度。
  • 丰富的对象类型,包含8种对象类型,满足不同场景的需求。
  • 高效的数据结构,减少了内存占用和计算复杂度,提高了数据操作的效率。
  • 单线程模型,避免了多线程之间的上下文切换和竞争条件,提升CPU利用率。
  • 非阻塞IO多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。

本文将详细介绍Redis为什么这么快的原理和机制,并给出一些实际应用和优化建议。

2. 内存操作

Redis是一种基于内存的数据库,与传统的基于磁盘的数据库(例如MySQL)不同,它将所有的数据都存储在内存中。

那么,Redis为什么选择内存存储数据呢?主要有以下几个原因:

  • 内存的速度远远快于磁盘。内存读写速度可以达到每秒数百GB,而磁盘读写速度通常只有数十MB,万倍的差距。
  • 内存可以支持更多的数据结构和操作。常见的数据结构如数组、链表、树、哈希、集合等,常见的操作如排序、查找、过滤、聚合等。内存是一个灵活介质,满足各种复杂和高效的功能,不是磁盘操作可比的。
  • 内存可以支持更高的并发和扩展性。内存是一种分布式和并行的存储介质,它可以支持多个CPU核心同时访问同一块内存区域,也可以支持多个服务器之间共享同一块内存区域。磁盘是一种集中式和串行的存储介质,它只能支持一个CPU核心或一个服务器访问同一块磁盘区域,也不能支持多个服务器之间共享同一块磁盘区域。

当然,Redis使用内存存储数据也有一些缺点和限制:

  • 内存限制:内存是非常昂贵的,容量通常只有几十GB或几百GB,而磁盘目前都是TB起步。所以我们通常只会把少量的、经常访问的数据存储在内存中。
  • 数据类型限制:Redis不支持复杂的数据结构,比如用户对象,通常只能序列化成字符串后再存储,查询的时候再把字符串反序列化成用户对象。
  • 数据备份问题:在服务器重启或崩溃时,存储的内存中的数据可能会丢失。通常采用持久化技术将数据保存到磁盘上,同时定期备份数据以防止数据丢失。

3. 丰富的对象类型

Redis包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。

  • String可以用来做缓存、计数器、限流、分布式锁、分布式Session等。
  • Hash可以用来存储复杂对象。
  • List可以用来做消息队列、排行榜、计数器、最近访问记录等。
  • Set可以用来做标签系统、好友关系、共同好友、排名系统、订阅关系等。
  • Zset可以用来做排行榜、最近访问记录、计数器、好友关系等。
  • Geo可以用来做位置服务、物流配送、电商推荐、游戏地图等。
  • HyperLogLog可以用来做用户去重、网站UV统计、广告点击统计、分布式计算等。
  • Bitmaps可以用来做在线用户数统计、黑白名单统计、布隆过滤器等。

4. 高效的数据结构

Redis有6种数据结构sds(简单动态字符串)、ziplist(压缩列表)、linkedlist(链表)、intset(整数集合)、hashtable(字典)、skiplist(跳跃表)

Redis的8种对象类型底层都是基于这5种数据结构实现的,丰富的数据结构可以减少内存占用和计算复杂度,提高数据操作的效率。

在这里插入图片描述

5. 单线程模型

Redis使用单线程模型,这意味着它只使用一个CPU来处理所有请求。因此,Redis不需要考虑多线程之间的同步、锁、竞争等问题,也不需要花费时间和资源在多线程之间的上下文切换上。这使得Redis的设计和实现更简单,性能和效率更高。

那么,Redis为什么选择单线程模型呢?主要有以下几个原因:

  1. Redis性能瓶颈不在于CPU,而在于内存和网络。因为Redis使用内存存储数据,所以数据访问非常迅速,不会成为性能瓶颈。此外,Redis的数据操作大多数都是简单的键值对操作,不包含复杂计算和逻辑,因而CPU开销很小。相反,Redis的瓶颈在于内存的容量和网络的带宽,这些问题无法通过增加CPU核心来解决。
  2. Redis的单线程模型可以保证数据的一致性和原子性。由于Redis只有一个线程来处理所有的请求,所以不会出现多个线程同时修改同一个数据的情况,也不需要使用锁或事务来保证数据的一致性和原子性。
  3. Redis的单线程模型可以避免多线程编程的复杂性和难度。例如线程安全、死锁、内存泄漏、竞态条件等,降低了开发和维护的成本和风险。

6. 多路IO复用模型

Redis使用单线程模型来处理客户端的请求,但是它能够利用多路I/O复用技术来实现高并发和高吞吐量。

那么,什么是多路I/O复用模型?

多路I/O复用模型是指使用一个线程来监控多个文件描述符(fd)的读写状态,当某个fd准备好执行读或写操作时,就通知相应的事件处理器来处理。这样就避免了阻塞式I/O模型中,单个线程只能等待一个fd的问题,提高了I/O效率和利用率。

例如Linux系统中提供了多种多路I/O复用技术的实现方式,如select、poll、epoll等。

7. 总结

本文介绍了Redis为什么如此快的原因。

  • 首先,Redis使用内存存储数据,避免了磁盘I/O的开销,提高了数据访问的速度。
  • 其次,Redis拥有丰富的对象类型,包含八种类型,满足不同的需求。
  • 此外,Redis采用了高效的数据结构,减少了内存占用和计算复杂度。Redis还使用单线程模型,避免了多线程之间的上下文切换和竞争条件,提升了CPU利用率。
  • 最后,Redis使用非阻塞I/O多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建vue3项目+按需引入element-ui框架组件

场景:使用vue create脚手架快速搭建vue的项目 前提:需要安装node.js和cnpm以及yarn 并且cnpm需要设置为淘宝镜像,cnpm和yarn安装教程网上很多可以自行搜索 1.使用dos命令安装vue-cli脚手架 //这个是从镜像源下载 cnpm install -g vue/cli 查…

设计模式简述

设计模式(简述) 设计模式的分类 ​ 根据目的可以分为创建型、结构性和行为型三类: 创建型模型:创建对象结构性模型:处理类或对象的组合行为型模式:用于描述对类或对象怎样交互和怎么分派职责 ​ 根据范围可以分为类模式和对象…

13.基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码:基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词:日前-实时市场竞标 电动汽车 双层优化 编程语言:MATLAB平台 内容简介:代码主要做的是电动汽车充电站市场竞标策略,采用双层优化模型对电动汽车…

Redis缓存穿透、击穿、雪崩面试题详解

缓存穿透 问题: 指的是客户端请求的数据在缓存中找不到,数据库中也没有存储,客户端还不断的发起请求。这样每次都无法在数据库查询到,缓存中永远没有这个数据。 ​ 这样的话,客户端一直去访问,会给后端数据…

【观察】解读新一代戴尔AMD服务器:场景优化为先,筑牢数字化底座

毫无疑问,今天算力就是生产力已成为业界共识,特别是算力作为数字经济时代的关键生产力要素,更成为了挖掘数据要素价值,推动数字经济发展的核心支撑力和驱动力。 在此过程中,由算力驱动的数字经济除了以信息产业这一独立…

老胡的周刊(第087期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 Auto-GPT[2] Auto-GPT 是一个实验性的开源应…

极简sklearn-使用决策树预测泰坦尼克号幸存者

泰坦尼克号幸存者数据集是kaggle竞赛中入门级的数据集,今天我们就来用决策树来预测下哪些人会成为幸存者。 数据集下载地址: https://download.csdn.net/download/ting4937/87630361 数据集中包含两个csv文件,data为训练用数据,test为测试集。 探索数据…

通过HBuilderX运行uniapp到微信者开发工具

目录 一、安装开发工具 二、配置运行微信开发者工具 三、异常处理 1.[微信小程序开发者工具] ? Enable IDE Service (y/N) [27D[27C 2. [error] Error: Fail to open IDE 3.[app.json 文件内容错误] app.json: 在项目根目录未找到 app.json 一、安装开发工具 安装HBuil…

如今的就业环境下,怎样才能跻身于高收入的IC行业?

看到不少人失业找工作,其实现在不光是大学生难找工作,在职的人工作也不怎么开心。 要么累,要么没前途。 要么又累又没前途。 总的占个啥吧,现在大家面临的问题就是工作时间越来越久,人际关系也搞得很压抑&#xff0…

初识linux之线程同步与生产者消费者模型

目录 一、线程同步的概念 1. 饥饿状态 2. 同步的概念 二、生产者消费者模型 1. 生产者消费者模型基本概念 2. 生产者、消费者之间的关系 2.1 消费者与消费者的关系 2.2 生产者和生产者的关系 2.3 生产者和消费者的关系 3. “321”原则 4. 消费者与生产者模型的特点 …

C++数据结构:STL

数据结构和算法简介 数据结构 数据结构是相互间存在特定关系的数据的集合,分为逻辑结构和物理结构。 逻辑结构 反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关 集…

类加载器详解(重点)之双亲委派

回顾一下类加载过程 开始介绍类加载器和双亲委派模型之前,简单回顾一下类加载过程。 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 加载是类加载过程的第一步,主要完成下面 3 件事情…

多线程基础

1.多线程基础概念 多线程:让程序同时做多件事情 多线程作用:提高效率 并发:在同一时间,有多个指令在单个cpu上交替执行 并行:在同一时刻,有多个指令在多个cpu上同时执行 2.多线程的实现 (1)继承Thread类…

计算机网络问题

1.网络分层结构及其必要性 五层体系结构: 七层结构: 应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.表示层:数据的表示、安全、压缩。,确保一个系统的应用层所发…

『Linux笔记』Linux设置SSH远程连接Docker容器

Linux设置SSH远程连接Docker容器 文章目录 一. 创建容器二. 进入容器/设置密码三. 安装ssh及修改配置四. 重启ssh服务五. 远程连接六. 提交运行中的容器docker commit参考文章 一. 创建容器 在ubuntu镜像中创建容器,并将docker服务器的60222端口映射到容器的22端口…

如何将Tomcat集成到IDEA中并启动项目?

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录一、为什么要将Tomcat集成到IDEA里?二、集成步骤2.1 在IDEA中创建Tomcat2.2 创建java的企业级模块(动态的we…

同为科技(TOWE)8路RS485通讯智能机柜PDU时序电源管理器

智能PDU电源时序管理器的出现是为了更好地管理数据中心和服务器机房的电源,以提高其可靠性和效率。在传统的机房电力管理中,运维人员需要手动控制每个设备的电源开关和电力分配,这种方式不仅效率低下,而且容易出现操作失误和电源供…

记一次mysql cpu 异常升高100%问题排查

此服务器为一个从库,用于数据的导出业务,服务器配置较低,日常的慢sql也比较多。 上午11点左右cpu异常告警,如下图所示, cpu使用率突增到50%,下午2点左右突增到100% ,登录服务器top命令查看cpu升…

基于脚手架@vue/cli 5.0.8搭建vue3项目教程

基于脚手架vue/cli 5.0.8搭建vue3项目教程 前言 前言 脚手架可以快速的帮我们搭建一个项目,而不需要我们从头开始去配置和引入插件,使用脚手架5.0.8版本创建的项目,局部webpack是5.x版本的,因此所有的配置均需要使用支持5.x版本的…

Shader Graph11-Detail Normal Map(法线贴图叠加)

本次我们希望通过叠加两个法线贴图来增加细节。 一、准备资源 我们需要一个模型,1张纹理贴图,2张法线贴图 我们可以在商店下载,这个mesh资源来做这个例子 打开OldWest->VOL3->Meshes,找到SM_Blankets_01c这个布的模型&am…