【Redis】第4篇 深刻理解高性能Redis的本质

本文深入探讨了Redis的高性能特性,包括基于内存的存储方式、单线程模型、I/O多路复用以及针对不同场景优化的数据结构。Redis通过内存实现实现了快速读写,单线程模型避免了线程切换开销,I/O多路复用确保了高并发处理,而其灵活高效的数据结构如SDS、压缩列表、跳跃表等则进一步提升了性能。Redis的这些设计使其成为理想的缓存和高性能数据库解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、几个方面进行深刻理解

2、Redis高效性能分析

官网的性能报告

基于内存实现

适配多元场景的高效数据结构

SDS 简单动态字符串

zipList 压缩列表

 linklist 双端列表

Hhash 字典

intset 整数集合

skipList 跳跃表

单线程模型

为何是单线程?

单线程的好处

单线程是否有效利用CPU

I/O 多路复用模型

普通 I/O 模型

I/O 多路复用

3、高性能Redis总结


1、几个方面进行深刻理解

  1. 内存数据库:Redis是一种基于内存的键值存储数据库。其本质是将数据存储在内存中,以获取极高的读写性能。相比传统的磁盘数据库系统,Redis通过避免了磁盘I/O的开销和数据结构的复杂性,使得数据的读写速度更加迅速。

  2. 单线程模型:Redis采用单线程模型,即所有的操作都在一个线程中顺序执行。这样可以避免多线程的线程切换开销,提高了处理请求的效率。虽然是单线程模型,但Redis通过非阻塞的IO复用机制(如epoll)实现并发处理客户端请求,保证了高并发环境下的性能表现。

  3. 基于异步的网络通信:Redis使用异步的网络通信模型,即非阻塞的事件驱动模型。当有新的请求到来时,Redis会将其放入事件队列中,然后由事件循环机制负责处理这些事件。这种异步的网络通信方式使得Redis能够高效地处理大量的并发请求,提供快速的响应能力。

  4. 数据结构与操作优化:Redis支持多种灵活的数据结构,如字符串、哈希、列表、集合、有序集合等。每种数据结构都经过了精心的设计和优化,使得其具备高效的操作性能。例如,Redis的哈希表使用了散列表和链表相结合的方式,并采用了一致性哈希算法来解决扩容时的数据迁移问题,从而保证了数据读写的高效性和可靠性。

综上所述,高性能Redis的本质在于将数据存储在内存中,并通过单线程模型、异步的网络通信以及优化的数据结构与操作来实现出色的读写性能。这使得Redis成为了一款非常适合用于缓存、消息队列、计数器等场景的高性能数据库。

分布式系统绕不开的核心之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升。通过使用缓存,我们把频繁查询的数据由磁盘调度到缓存中,保证数据的高效率读写。

当然,除了在内存内运行还远远不够,我们今天就以具有代表性的缓存中间件Redis为例子,分析下,它是如何达到飞起的效率。

2、Redis高效性能分析

Redis之所以能够提供超高的执行效率,主要从以下几个维度来实现的:

  • 存储模式:基于内存实现,而非磁盘
  • 数据结构:基于不同业务场景的高效数据结构
    • 动态字符串(REDIS_STRING):整数(REDIS_ENCODING_INT)、字符串(REDIS_ENCODING_RAW)
    • 双端列表(REDIS_ENCODING_LINKEDLIST)
    • 压缩列表(REDIS_ENCODING_ZIPLIST)
    • 跳跃表(REDIS_ENCODING_SKIPLIST)
    • 哈希表(REDIS_HASH)
    • 整数集合(REDIS_ENCODING_INTSET)
  • 线程模型: Redis 的网络 IO 以及键值对指令读写是由单个线程来执行的,避免了不必要的contextswitch和竞选
  • I/O 模型: 基于I/O多路复用模型,非阻塞的I/O模型
  • 恰单的数据编码: 根据实际数据类型,选择合理的数据编码

官网的性能报告

Redis benchmark | RedisUsing the redis-benchmark utility on a Redis servericon-default.png?t=N7T8https://redis.io/docs/management/optimization/benchmarks/在较高的配置基准下(比如 8C 16G +),在连接数为0~10000的时候,最高QPS可达到120000。Redis以超过60000个连接为基准,仍然能够在这些条件下维持50000个q/s,体现了超高的性能。下图中横轴是连接数,纵轴是QPS。

 下面这张图为data size 与整体吞吐量之间的趋向关系:

 这个大概可以得出一个容量预估,比如你的服务用户量是多少,预估峰值QPS是多少,集群需要配置多少个实例(虽然实例的多少不能线性计算),可以大致推算出去。

基于内存实现

Redis的读写操作都是在内存中实现了,相对其他的持久化存储(如MySQL、File等,数据持久化在磁盘上),性能会高很多。因为在们在操作数据的时候,需要通过 IO 操作先将数据读取到内存里,增加工作成本。

上面那张图来源于网络,可以看看他的金字塔模型,越往上执行效率越高,价格也就越贵。下面给出每一层的执行耗时对比:

  • 寄存器:0.3 ns
  • L1高速缓存:0.9 ns
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式职场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值