首页 > 数据库 >单线程 Redis 如此快的 4 个原因

单线程 Redis 如此快的 4 个原因

时间:2023-07-20 18:57:00浏览次数:39  
标签:存储 单线程 Redis 线程 内存 接字 原因

本文翻译自国外论坛 medium,原文地址:https://levelup.gitconnected.com/4-reasons-why-single-threaded-redis-is-so-fast-414e0106f921

作为内存数据存储,Redis 以其速度和性能而闻名,通常被用作大多数后端服务的缓存解决方案。

然而,在 Redis 内部采用的也只是单线程的设计。

为什么 Redis 单线程设计会带来如此高的性能?如果利用多个线程并发处理请求不是更好吗?

在本文中,我们将探讨使 Redis 成为快速高效的数据存储的设计选择。

长话短说

Redis 的性能可归因于 4 个主要因素

  • 基于内存存储
  • 优化的数据结构
  • 单线程架构
  • 非阻塞IO

让我们一一剖析一下。

推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护,欢迎大家点个 star、关注博主。

github 地址:https://github.com/wayn111/waynboot-mall

基于内存存储

访问内存比访问磁盘快几个数量级

Redis 是在内存中进行键值存储。

Redis 中的每次读写操作都相当于从内存的变量中进行读写。

访问内存比直接访问磁盘快几个数量级,因此Redis 比其他数据存储快得多。

优化的数据结构

redis底层数据结构

作为内存数据存储,Redis 利用各种底层数据结构来高效存储数据,无需担心如何将它们持久化到持久存储中。

例如,Redis list 是使用链表实现的,它允许在列表的头部和尾部附近进行恒定时间 O(1) 插入和删除。

另一方面,Redis sorted set 是通过跳跃列表实现的,可以实现更快的查询和插入。

简而言之,无需担心数据持久化,Redis 中的数据可以更高效地存储,以便通过不同的数据结构进行快速检索。

单线程

单线程进程

Redis 中的写入和读取速度非常快,并且 CPU 使用率从来不是 Redis 关心的问题。

根据 Redis 官方文档,在普通 Linux 系统上运行时,Redis 每秒最多可以处理 100 万个请求。

通常瓶颈来自于网络 I/O, Redis 中的处理时间大部分浪费在等待网络 I/O 上。

虽然多线程架构允许应用程序通过上下文切换并发处理任务,但这对 Redis 的性能增益很小,因为大多数线程最终会在 I/O 中被阻塞。

所以 Redis 采用单线程架构,有如下好处

  • 最大限度地减少由于线程创建或销毁而产生的 CPU 消耗
  • 最大限度地减少上下文切换造成的 CPU 消耗
  • 减少锁开销,因为多线程应用程序需要锁来进行线程同步,而这容易出现错误
  • 能够使用各种“线程不安全”命令,例如 Lpush

非阻塞I/O

I/O 多路复用

为了处理传入的请求,服务器需要在套接字上执行系统调用,以将数据从网络缓冲区读取到用户空间。

这通常是阻塞操作,线程被阻塞并且在完全接收到来自客户端的数据之前不能执行任何操作。

为什么我们不能在只有确定套接字中的数据已准备好读取时,才执行系统调用嘞?

这就是 I/O 多路复用发挥作用的地方。

I/O 多路复用模块同时监视多个套接字,并且仅返回可读的套接字。

准备读取的套接字被推送到单线程事件循环,并由相应的处理程序使用响应式模型进行处理。

总之,

  • 网络 I/O 速度很慢,因为其阻塞特性,
  • Redis 收到命令后可以快速执行,因为这在内存中执行,操作速度很快,

所以 Redis 做出了以下决定,

  • 使用 I/O 多路复用来缓解网络 I/O 缓慢问题
  • 使用单线程架构减少锁开销

结论

四个原因

综上所述,单线程架构是 Redis 团队经过深思熟虑的选择,并且经受住了时间的考验。

尽管是单线程,Redis 仍然是性能最高、最常用的内存数据存储之一。

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

标签:存储,单线程,Redis,线程,内存,接字,原因
From: https://www.cnblogs.com/waynaqua/p/17569374.html

相关文章

  • Redis
    基本结构nosql阿里巴巴架构演进nosql数据模型nosql四大分类CAPBASERedis入门Redis安装(Window&Linux服务器)五大基本类型三种特殊数据类型geohyperloglogbitmapRedis配置详解Redis持久化RDBAOFRedis事务操作R......
  • kafaka is unavailable or invalid, will attempt rediscover
    如何处理"kafkaisunavailableorinvalid,willattemptrediscover"错误提示引言在开发过程中,我们可能会遇到各种错误提示,其中一种常见的错误提示是"kafkaisunavailableorinvalid,willattemptrediscover"。这个错误提示意味着Kafka无效或不可用,需要尝试重新发现。本文......
  • CSRedisClient拿来主义,是这么用的吗?
        开篇先引用下鲁迅先生笔下的《拿来主义》一说,暂且粗浅的理解为,拿来就用,以为是能达到自己想要的效果。向鲁迅先生致敬!   算是2021年的新项目吧,内部精心规划,来年招兵买马,注入了不少新鲜血液。新人或许有新气象。老人带领下的新团队,开启了老项目的重构计划...新......
  • redis的基本部署和使用
    推荐步骤1.在centos01上安装Redis服务器端,安装redis客户端在centos02上2.Redis数据库管理,键值对管理3.修改redis配置文件管理RDB方式持久化存储修改为AOF持久化数据存储,创建任意键对值,查看AOF数据库内容,查看保存的数据挂载redis光盘解压移动redis安装位置,编译redis服务器初始化redis服......
  • Redis的作用,数据类型,缓存穿透,击穿和雪崩,Redis的索引模式【杭州多测师_王sir】
     一、Redis的作用:1.缓存数据,存在内存当中,效率非常高,比存储型数据快上千倍2.计数器,比如用户访问了多少次,点赞数统计3.可以限制 IP 的访问频率4.可以设置失效时间,可以用来设置优惠券到期时间5.任务队列:比如到货通知,内容更新6.排行榜:redis 的有序集合类型非常适合处理榜单和排序......
  • Redis
    Redis基于内存的key-value结构的非关系型数据库,远程字典服务特点基于内存存储,读写性能高适合存储热点数据(热点商品,资讯,新闻)使用范围广能做什么数据缓存消息队列注册中心发布订阅Redis入门官网:https://redis.io关系型数据库(RDBMS):MysqlOracleDB2SQLServer非......
  • Redis主从复制和哨兵模式
    一、Redis主从复制 1、配置Redis服务器启动服务自动建立主从复制1)配置ntp时间服务器并同步时间2)修改主配置文件自动挂载节点3)启动服务(所有主机)4)查看复制群集状态2、手动配置主从复制  1)将第一台从节点加入到群集中[root@centos02~]#redis-cli-h192.168.100.20-p6379-a......
  • 观看视频历史记录放数据库还是redis
    观看视频历史记录放数据库还是Redis?随着互联网的飞速发展,视频网站逐渐成为人们获取信息、娱乐和学习的主要平台之一。在视频网站上观看的视频数量非常庞大,而用户观看的视频历史记录也具有一定的价值。那么,我们应该将观看视频历史记录放在数据库中还是Redis中呢?本文将从数据特点、......
  • 多主机 docker redis集群
    多主机DockerRedis集群在分布式系统中,Redis是一个常用的内存数据库,它提供了高性能的键值存储。然而,在面对大流量的情况下,单个Redis实例可能无法满足需求。为了提高可用性和性能,我们可以使用多主机的Redis集群。Docker是一个流行的容器化平台,它可以帮助我们轻松地创建和......
  • 多线程,redis怎么写数据
    项目方案:多线程写数据到Redis介绍在现代应用程序开发中,Redis是一个非常流行的内存数据库,它提供了高性能的键值存储。然而,在高并发场景下,写入大量数据到Redis可能成为性能瓶颈。为了解决这个问题,我们可以使用多线程来提高写入数据到Redis的效率。本文将介绍一个项目方案,通过......