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

[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各种应用。

相关文章:

  • 做网站必须购买空间吗国外网站设计
  • 电脑网站打不开是什么原因造成的重庆森林电影完整版
  • 中国网通做网站如何制作一个网页
  • 立陶宛和中国最新消息佛山seo网站排名
  • 大连市建设局网站成都企业seo
  • 南京专业做网站公司网络营销总结及体会
  • Linux 容器环境磁盘空间不足问题及解决方案
  • 最新源支付V7开源1.9.9版
  • 零基础使用AI从0到1开发一个微信小程序
  • KisFlow-Golang流式实时计算案例(四)-KisFlow在消息队列MQ中的应用
  • 讲解机器学习中的 K-均值聚类算法及其优缺点
  • 哈希表+前缀和+滑动窗口高效查找——蓝桥杯例题
  • 【算法】反转单向链表 链表和数组的区分 时间复杂度
  • 野指针成因及避免方法
  • 制造OA系统怎么选?有没有简单易用的?
  • Android Fresco 框架编解码模块源码深度剖析(三)
  • 数据结构与算法面试题精讲)C++版——day4
  • day20 学习笔记
  • PyTorch中的损失函数
  • 【Django】教程-10-ajax请求Demo,结合使用
  • 算法导论(动态规划)——子数组系列
  • 了解Docker容器的常见退出状态码及其含义
  • dify新版本1.1.3的一些问题
  • 生成对抗网络(GAN)详解(代码实现)
  • MySQL 中的 MVCC 版本控制机制原理
  • PCIe初始化Detect状态解读