首页 业界动态 单线程的Redis速度为什么快?

单线程的Redis速度为什么快?

Redis 是一个采用单线程架构的高性能内存键值数据库。官方测试报告中,单机可支持 10w 左右的 QPS。

为什么单线程设计的 Redis 具有这么高性能?

我们来探讨一下原因是什么。

我将原因归纳为以下的四个方面:

  • 单线程架构

  • 高效的数据结构

  • 数据存储在内存中

  • 事件驱动模型

下面我们详细分析下每一个方面。

单线程架构

在多线程环境中,操作系统需要频繁地进行线程切换以让不同的线程获得 CPU 时间片来执行任务。线程切换涉及到保存当前线程的状态、恢复另一个线程的状态等操作,这些操作会消耗一定的时间和系统资源。

而单线程的 Redis 完全避免了线程切换带来的开销,从而可以更高效地利用 CPU 资源专注于处理客户端请求。

请注意,当我们强调单线程时,我们指的是使用一个线程来处理网络 I/O 和键值对读写(文件事件调度程序)。

也就是说,一个线程处理所有的网络请求,但Redis的其他功能,比如持久化、异步删除、集群数据同步等,实际上都是由额外的线程来执行的。

高效的数据结构

Redis 的数据结构如字符串(SDS)、字典(哈希表实现)、链表等在设计时就考虑了在单线程环境下的高效操作。

例如,SDS 通过预分配和惰性空间释放策略,减少了内存分配和释放的次数,在单线程环境下可以更高效地进行字符串操作。

字典的哈希表实现采用渐进式 rehash 策略,避免了一次性进行大量数据的重新哈希,在单线程下可以平滑地进行哈希表的扩展和收缩操作,不会因为多线程竞争而导致复杂的同步问题。

Redis 共有 5 种数据类型: String 、 List 、 Hash 、 Set 和 SortedSet 。

不同的数据类型在底层使用一种或多种数据结构来支持,目的是达到更快的速度。

数据存储在内存中

Redis完全基于内存,数据存储在内存中。绝大多数请求都是纯内存操作,速度极快。

与传统的磁盘文件数据存储相比,Redis避免了通过磁盘I/O将数据从磁盘读入内存的开销。

事件驱动模型

使用基于网络 I/O 多路复用(非阻塞 I/O)的线程模型可以处理并发连接,有助于缓解网络 I/O 速度慢的问题。

Redis 使用高效的事件驱动模型(如 epoll、kqueue 等)来处理网络 I/O 和时间事件。

当有客户端连接请求或者数据可读可写时,事件驱动模型会通知 Redis 进行相应的处理。

Redis 6.0 的多线程

Redis采用单线程的方式来实现高可维护性。虽然多线程在某些方面可能表现良好,但它引入了程序执行顺序的不确定性,导致并发读写的一系列问题。这增加了系统的复杂性,并且可能由于线程切换、锁定和解锁甚至死锁而导致性能损失。

Redis 6.0引入了多线程,因为它的瓶颈不在于内存,而在于网络I/O模块,该模块消耗了CPU时间。因此,引入多线程来处理网络I/O,充分利用CPU资源,减少网络I/O阻塞带来的性能损失。

多线程模式下是否存在线程并发问题?

在Redis的多线程模式下,接收、发送和解析命令可以配置为在多个线程中执行,因为它们是我们确定的主要耗时点。然而,涉及内存操作的命令执行仍然在单线程中运行。

因此,Redis的多线程部分仅用于处理网络数据读写和协议解析。命令执行仍然是在单线程中顺序执行,因此不存在并发安全问题。

站心网

Redis 是一个采用单线程架构的高性能内存键值数据库。官方测试报告中,单机可支持 10w 左右的 QPS。为什么..

为您推荐

押注配送速度,Temu在韩国卷出新高度

文:习芮编辑:小戎出品:增长工场Temu 在韩国的“加码”还在继续。继年初开放韩国卖家入驻,2 月在韩国布局本地仓后,3 月 21 日,Temu 宣布与韩国乐天集团旗下物流子公司乐天全球物流签署长期租约,租用位于京畿道..

Redis 在现实世界的 5 个用法

Redis是一个强大的内存数据结构存储,包含数据库,缓存和消息代理等多种用途。大多数人经常认为它不过是一个简单的键值存储,但其实它有更多的能力。下面我将会总结一些Redis可以做的事情的真实例子。1.全页面缓存首..

配置 redis 外网可访问

在 Linux 中安装了redis 服务。在 Windows 中安装了 xampp 环境,以供 PHP 运行。PHP 代码如下:<?php$redis = new Redis();$redis->connect('192.168.1.4', 6379);$redis->set('tag', 'hello&#..

Redis 数据结构详解

Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分..

Redis 同步、击穿、穿透及雪崩简述

对Redis最常见的几个问题,简要的说下我的理解与解决方法。数据同步指Redis做为缓存,在数据变化时,怎么保持与数据库数据同步的。一般解决方案为:缓存双删(同步方案大都采用删除缓存,而不会更新新缓存。缓存击穿..

宝塔里redis停止了自动启用脚本

redis突然停止的原因有多种:1、内存不足,如果Redis使用的内存超过了服务器可用内存,操作系统会自动杀死Redis进程。2、服务器的资源限制(ulimit)比较低,Redis可能会因为无法打开足够的文件描述符而停止。3、其..

提高网站访问速度的20优化技巧

网友上网都不喜欢用太多的时间等待网页的打开,等待的越长,用户可能会直接关闭网页,这样就会损失很多流量!其次,关键字的排名与网页的打开速度也有关系,这个主要体现搜索引擎对用户体验度上,用户体验度好,排..

C# .NET Core中Microsoft.Extensions.Caching.Redis库用法

Microsoft.Extensions.Caching.Redis库可以与Redis服务器进行交互,并在应用程序中实现内存缓存功能。使用Microsoft.Extensions.Caching.Redis库进行缓存的示例:首先在项目中通过NuGet包管理器或使用.NET CLI来安装..

Centos7安装Redis教程

在 CentOS 7 上安装 Redis 可以通过以下步骤实现:注意:在开始之前,请确保你拥有 CentOS 7 的 root 或具有 sudo 权限的用户账户。更新系统在安装任何新软件之前,首先要确保系统已经更新到最新版本:sudo yum upda..

Windows下Redis的安装使用教程

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add..

5个Redis使用技巧

使用Redis开发应用程序是一个很愉快的过程,但是就像其他技术一样,基于Redis的应用程序设计你同样需要牢记几点。在之前,你可能已经对关系型数据库开发的那一整个套路了然如胸,而基于Redis的应用程序开发也有许多..

Memcached,Redis,MongoDB的区别

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。 和memcached更为接近的是redis。它们都是内..

Redis要收费了有什么平替产品?

Redis 官方在 2023 年 10 月 11 日宣布,将从 2024 年 4 月 1 日起对 Redis 的企业版进行收费。Redis 的开源版本将继续免费提供,但该版本不包括上述企业版功能。Redis 的收费模式如下:按年订阅:每年每节点 1000 ..

微软开源缓存存储系统Garnet平替Redis

近日,微软正式开源缓存存储系统 Garnet。据微软研究院数据库小组高级首席研究员 Badrish Chandramouli 介绍,Garnet 项目是从零开始构建而成,且以性能为核心考量(特别是吞吐量中的线程可扩展性与更高比例的低延迟..

token+redis和Jwt怎么选?

选择使用JWT还是Token+Redis进行项目开发取决于项目的具体需求和规模。下面是对两种方法的简要比较:JWT(JSON Web Token)1. 优点:JWT是一种轻量级的身份验证和授权机制,它可以在客户端和服务器之间传递信息,并..

20万QPS如何利用Redis实现高效、稳定、安全的存储

处理20万QPS(每秒查询数)的业务场景需要一些高效和可扩展的解决方案。Redis是一个非常适合高性能场景的内存数据库,它可以用于缓存、数据结构存储等多种用途。1、场景缓存:数据有效期:为不同的数据设置合适的过..

Redis缓存击穿原因和防范措施

Redis是一种广泛用于缓存的内存数据库,它具有快速读写操作和高并发处理能力。然而,当某个热点数据过期或不存在时,恰好有大量并发请求同时访问该数据,就可能发生缓存击穿问题。本文将深入探讨Redis缓存击穿的原因..

Redis和Memcached的区别 如何选择

Redis和Memcached都是常见的内存缓存系统,它们有一些相似之处,但也有一些区别。数据类型支持:Redis支持的数据类型比Memcached更多。Redis可以支持String、Hash、List、Set、Sorted Set、Bitmaps等数据类型,而Mem..

redis和mongodb的区别?

Redis 和 MongoDB 是两种不同类型的数据库系统,它们在设计和使用场景上有很大的区别。Redis类型: Redis 是一个基于内存的键值存储系统,也被称为数据结构服务器,它支持多种数据类型,包括字符串、哈希表、列表、集..

Redis与数据库数据强一致性解决方案

Redis是一个内存数据库,而传统数据库(如MySQL、PostgreSQL等)通常是基于磁盘的。它们的特性和用途不同,因此在实现强一致性时需要考虑一些因素。数据同步与强一致性保持Redis和传统数据库的强一致性是一个复杂的..

发表回复

返回顶部