当前位置: 首页 > article >正文

[Redis]Redis学习开篇概述

欢迎来到啾啾的博客🐱。
这是一个致力于构建完善 Java 程序员知识体系的博客📚。
它记录学习点滴,分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

引言

大家好,这是 Redis 系列的开篇。
本系列旨在深入了解 Redis 的设计原理。
内容涵盖 Redis 的运行原理、设计思路、解决的问题以及应用场景。

Redis发展趋势与学习

Redis趋势

Redis版本流行情况参考阿里云Redis云原生可选版本,如下⬇️:
![[Pasted image 20250403150557.png]]

在Redis的官网中有写到

Redis 8 is the best version of Redis ever.

Redis8即将到来了。相较于现在流行的Redis5\6\7版本,Redis8有哪些改动呢?

其中最为人所知的应该就是异步IO线程的实现,我们也以线程改动为例,来一起窥见Redis发展趋势。

Redis线程从单线程IO发展到Redis6的多线程IO,再发展到Redis8的异步IO。反映了其在性能优化和适应现代硬件环境上的演进。

  • 单线程时代-2009年
    在单线程时代,Redis 的IO模型基于IO多路复用和非阻塞IO,所有操作(网络读写、命令执行)都在一个主线程中完成。
    此时Redis通过事件驱动处理多个客户端连接,避免线程切换和锁竞争,适合内存操作的高速场景。
    随着网络带宽和多核CPU的提升,单线程在高并发网络IO场景下成为性能瓶颈。
    毕竟,这个设计是2009年的了。🙂

  • 多线程时代-2020年
    在多线程时代(Redis6),Redis将网络IO处理(读写socket、协议解析)从主线程中剥离,交给多个IO线程并行处理,而命令执行还还是由单线程处理。
    多线程的改动,让Redis可以充分利用多核CPU提升网络IO吞吐量,解决单线程网络处理跟不上硬件速度的问题。
    此时Redis在多核环境下,吞吐量可提升一倍左右。

不过有文章介绍多数场景中Redis CPU没有打满,即不会遇到Redis单线程性能瓶颈问题。
Redis 多线程IO 主要解决是 IO 密集型场景,即网络 IO 消耗在 Redis 中占比较大的场景,而非计算密集型场景,因为命令处理仍然是单线程的。并且 Redis 提供了集群模式,可以通过增加从库和分片的方式来扩展系统吞吐能力。

  • Redis8异步IO-2024年
    很详细的介绍文章➡️Redis Async IO Thread:突破百万级 QPS 的性能极限,上面关于单线程和多线程的比较也是这篇文章提及的。

在异步IO设计中,Redis还是没有改变多线程IO设计的“命令必须在主线程中执行”的原则。
每个 IO 线程都有独立的事件循环,IO 线程也采用多路复用的方式来处理客户端的读写操作,从而消除了忙等待所带来的 CPU 开销。
而主也线程不再需要执行繁重的 epoll_wait 操作来处理客户端读写操作,只需要专注于命令处理。
如下图所示,主线程和 IO 线程交互过程可以简要描述如下:

  • 主线程在 accept 新连接后将客户端分配给 IO 线程
  • IO 线程在完成客户端的请求读取和命令解析后会通知主线程
  • 主线程处理来自 IO 线程的命令并生成回复并再转回给相应的 IO 线程
  • IO 线程负责将回复写回客户端,并继续处理客户端的读写事件
    ![[Pasted image 20250403162537.png]]

以Redis线程发展为例,可以看出Redis始终围绕着“高性能”这个核心目标演进。

感觉Redis设计真的很了不起,线程实现从单线程到多线程到异步,其所有命令还是都在主线程中执行。
着其实乍一看好像并不是什么高性能的设计,但单线程在内存环境中,可以最大化地利用L1/L2缓存。Redis的核心操作(如键值读写)是内存操作,速度极快(纳秒到微秒级),单线程足以处理高吞吐量,瓶颈更多出现在网络IO而非命令执行。前面提到Redis6多线程也是为了解决网络IO瓶颈而设计。

多线程则需要解决缓存一致性问题,其较单线程更复杂(如锁、死锁、线程同步)。
但是Redis通过这样的设计保证了操作的原子性与一致性(在微服务架构的事务处理一篇中,我们有了解到多服务访问多数据源一致性的难做)。
这样的设计也更适应Redis常用的缓存、计数器、分布式锁等一致性要求高的场景。

单线程执行命令还保持了Redis代码的简洁性、可维护性。
Redis之父Salvatore Sanfilippo他在博客中多次强调,Redis的成功部分归功于其简单性,多线程命令执行会让系统变得像传统RDBMS,失去轻量级优势。

Redis终归是:

简单高效的内存数据库。

即,在简单的同时追求一致性与高性能。

Redis学习

尽管 Redis 8 有诸多改动且即将推出,但我们仍能从先前的 Redis 设计中获取解决问题的思路。

例如,从上一章节提及的 Redis 线程设计的演进历程可知,多线程适合处理网络 IO 密集型场景,异步 IO 同样如此。
而单线程处理一致性更为简单、合适。这提醒我们要避免过度复杂,切勿滥用线程。在线程使用前,先查看 CPU 状况,确认瓶颈是否真的在线程上,是否是网络与磁盘IO等。
我们也很容易了解到Redis有着高效的数据结构,那么遇到性能问题时,是否可以借鉴Redis的数据结构来避免其他复杂机制。
等等……

本系列将跟随《Redis设计与实现》,系统学习了解Redis的原理与实践。
了解其内存存储与高效的数据结构、单线程事件循环模型、持久化机制、高可用性与分布式扩展、内存管理与淘汰机制、客户端协议与命令优化等核心内容。
了解Redis是怎么设计高性能、灵活性、可靠性、扩展性、简单性的。
以及思考为什么Redis8使用了另外的设计来实现目标。

虽然这本书使用的Redis(基于Redis2.9)版本有点老,Redis最新稳定版已达到7.x系列,但是Redis的核心设计理念8.0版本前变化不大。
另外推荐作者黄健宏的新书——《Redis应用实例》,书中介绍了Redis各种应用。

相关文章:

[Redis]Redis学习开篇概述

欢迎来到啾啾的博客🐱。 这是一个致力于构建完善 Java 程序员知识体系的博客📚。 它记录学习点滴,分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 引言 大家好…...

WordPress浮动广告插件+飘动效果客服插件

源码介绍 WordPress浮动广告插件飘动效果客服插件 将源码上传到wordpress的插件根目录下,解压,然后后台启用即可 截图 源码免费获取 WordPress浮动广告插件飘动效果客服插件...

Java基础关键_034_网络编程

目 录 一、概述 二、网络编程三要素 1.IP 地址 2.端口号 3.通信协议 (1)说明 (2)OSI 七层参考模型 (3)TCP/IP 四层参考模型 三、网络编程基础类 1.InetAddress 2.URL (1&#xff09…...

Ubuntu交叉编译器工具链安装

声明 本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记,(内容参照正点原子I.MX6U嵌入式linux驱动开发指南,可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档),旨在如实记录我在学校学…...

C# 操作 Redis

一、简介 C# 中通过 StackExchange.Redis 库可以方便地操作 Redis,实现高性能的数据缓存和存储。StackExchange.Redis 提供了强大的 API,允许开发者轻松连接、读取和写入 Redis 数据。通过使用 ConnectionMultiplexer 类,可以建立与 Redis 服…...

基于Python的招聘推荐数据可视化分析系统

【Python】基于Python的招聘推荐数据可视化分析系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 🚀🌟 基于Python的招聘推荐数据可视化分析系统!&#x1…...

光谱相机在工业中的应用

光谱相机(多光谱、高光谱、超光谱成像技术)在工业领域通过捕捉物质的光谱特征(反射、透射、辐射等),结合化学计量学与人工智能算法,为工业检测、质量控制和工艺优化提供高精度、非接触式的解决方案。以下是…...

Nginx介绍及使用

1.Nginx介绍 Nginx是一款开源的、高性能的HTTP和反向代理服务器 1.正向代理和反向代理 正向代理(代理客户端)是一种位于客户端和目标服务器之间的中间服务器。客户端通过正向代理服务器向目标服务器发送请求,代理服务器将请求转发给目标服…...

使用PyQt5绘制水波浪形的柱状显示流量—学习QTimer+QPainterPath

前言:进入学习Python开发上位机界面的第二阶段,学习如何开发自定义控件,从常用的控件入手学习,本期主要学习如何使用PyQt5绘制水波浪形的柱状显示流量。但是最后我放弃了,因为水波的效果达不到我想要的。 1. 明确想要…...

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们!今天我们来一起学习算法和贪心思维,准备好了吗?咱们开始咯! 第1题 数位排序 对于这道题,我们需要自己写一个排序算法,也就是自定义排序,按照数位从小到大进行排序。 举一…...

如何将本地更改的README文件同步到自己的GitHub项目仓库

如何将本地更改的 README 文件同步到 GitHub 仓库 在你 git clone 下来的工程目录下: 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 将你的更改Copy到你git下来的工程中(上面的命令会自动处理,例如只会C…...

无人驾驶是自动化还是智能化?

这是一个由小米Su-7和人形机器人问题引起的思考:努力决定了下限,认知决定了上限。 一、无人驾驶既涉及自动化,也涉及智能化,这两者在无人驾驶系统中应该是相互融合、相辅相成的1、自动化(Automation) 自动化…...

实操(不可重入函数、volatile、SIGCHLD、线程)Linux

1 不可重入函数 为什么会导致节点丢失内存泄露?main函数在执行insert,但是没执行完就被信号中断了,又进了这个函数里,所以这个insert函数在不同的执行流中,同一个函数被重复进入,如果没有问题,…...

【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】

教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…...

Ubuntu 下搭建 MCU 开发环境全流程指南(以 STM32 为例)

在嵌入式开发中,许多工程师都习惯于在 Windows 平台使用 Keil、IAR 等 IDE。然而,随着对自动化、可定制性以及开放工具链的需求增长,越来越多的开发者开始尝试在 Linux 环境下进行 MCU 开发。 本篇文章将以 STM32F1 系列 为例,手把手带你在 Ubuntu 下搭建一个完整的 MCU 开…...

Codecademy—— 交互式编程学习的乐园

一、网站概述 Codecademy 是一家美国在线学习编程知识的网站,它为编程学习者提供了一种全新的学习方式。在如今众多的编程学习平台中,Codecademy 凭借其独特的优势脱颖而出,吸引了全球数百万用户。其目标是帮助更多人轻松学习编程&#xff0…...

Python----计算机视觉处理(Opencv:道路检测之车道线拟合)

完整版: Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示) 一、获取左右车道线的原始位置 导入模块 import cv2 import numpy as np from matplot…...

OpenCV 图形API(13)用于执行两个矩阵(或图像)逐元素乘法操作的函数mul()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算两个矩阵的每个元素的缩放乘积。 mul函数计算两个矩阵的逐元素乘积: dst ( I ) saturate ( scale ⋅ src1 ( I ) ⋅ src2 ( I ) ) …...

2025高频面试算法总结篇【二叉树】

文章目录 直接刷题链接直达非递归实现求二叉树的深度非递归从左至右打印一颗二叉树中的所有路径判断平衡二叉树二叉搜索树中第K小的元素二叉树的完全性检验根据前&中序遍历结果重建二叉树二叉树的最近公共祖先二叉树的直径二叉树的遍历 直接刷题链接直达 非递归实现求二叉…...

如何理解神经网络中的“分段线性单元”,优雅解析前向和反向传播

什么是非线性 非线性本质上指的是一个系统或函数中输入与输出之间的关系不呈现简单的比例关系,也就是说,输出不只是输入的线性组合 ( 比如 y k 1 x 1 k 2 x 2 b ) (比如yk1x1k2x2b) (比如yk1x1k2x2b)。下面详细解释这个概念: 缺乏叠加性…...

WVP-GB28181摄像头管理平台存在弱口令

免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 攻击者可利用漏洞获取当前系统管…...

开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)

文章目录 开源身份和访问管理方案之keycloak(三)keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak(三&…...

STM32看门狗原理与应用详解:独立看门狗 vs 窗口看门狗(上) | 零基础入门STM32第九十四步

主题内容教学目的/扩展视频看门狗什么是看门狗,原理分析,启动喂狗方法,读标志位。熟悉在程序里用看门狗。 师从洋桃电子,杜洋老师 📑文章目录 一、看门狗核心原理1.1 工作原理图解1.2 经典水桶比喻 二、STM32看门狗双雄…...

Android学习总结之service篇

引言 在 Android 开发里,Service 与 IntentService 是非常关键的组件,它们能够让应用在后台开展长时间运行的操作。不过,很多开发者仅仅停留在使用这两个组件的层面,对其内部的源码实现了解甚少。本文将深入剖析 Service 和 Inte…...

网络安全的挑战与防护策略

随着互联网的高速发展,人们的生活、学习和工作已离不开网络。然而,便利的背后也潜藏着巨大的安全隐患。从数据泄露、账户被盗,到网络攻击、系统瘫痪,网络安全问题层出不穷,影响范围从个人用户到国家机构。 网络安全&a…...

spring mvc异步请求 sse 大文件下载 断点续传下载Range

学习连接 异步Servlet3.0 Spring Boot 处理异步请求(DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总) spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…...

Opencv计算机视觉编程攻略-第十节 估算图像之间的投影关系

目录 1. 计算图像对的基础矩阵 2. 用RANSAC 算法匹配图像 3. 计算两幅图像之间的单应矩阵 4. 检测图像中的平面目标 图像通常是由数码相机拍摄的,它通过透镜投射光线成像,是三维场景在二维平面上的投影,这表明场景和它的图像之间以及同一…...

14.流程自动化工具:n8n和家庭自动化工具:node-red

n8n 安装 docker方式 https://docs.n8n.io/hosting/installation/docker/ #https://hub.docker.com/r/n8nio/n8n docker pull n8nio/n8n:latest docker rm -f n8n; docker run -it \ --network macvlan --hostname n8n \ -e TZ"Asia/Shanghai" \ -e GENERIC_TIME…...

图形渲染: tinyrenderer 实现笔记(Lesson 1 - 4)

目录 项目介绍环境搭建Lesson 1: Bresenham’s Line Drawing Algorithm(画线算法)Lesson 2: Triangle rasterization 三角形光栅化Scanline rendering 线性扫描Modern rasterization approach 现代栅格化方法back-face culling 背面剔除 Lesson 3: Hidde…...

大规模硬件仿真系统的编译挑战

引言: 随着集成电路设计复杂度的不断提升,硬件仿真系统在现代芯片设计流程中扮演着越来越重要的角色。基于FPGA(现场可编程门阵列)的商用硬件仿真系统因其灵活性、全自动化、高性能和可重构性,成为验证大规模集成电路设…...