深度解析Redis线程模型设计原理(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 深度解析Redis线程模型设计原理(上)

1 单线程模型设计

image.png

我们通常说Redis是单线程,主要指Redis的网络I/O和KV对读写是由一个线程完成,是Redis对外提供KV存储服务的主要流程。

但Redis其它功能如持久化、异步删除、集群数据同步等,是由额外线程执行的。


所以,严格来说,Redis并不是单线程,但一般把Redis称为单线程高性能,显得像 UC 编辑部。所以都说Redis是单线程模式。

为何单线程模型

要弄明白这个问题,需研究Redis的单线程设计机制以及多路复用机制。

调优Redis性能时,也能针对性避免会导致Redis单线程阻塞的操作,例如执行复杂度高命令。

多线程的开销

“使用多线程,可增加系统吞吐率或增加系统扩展性”。

一个多线程系统,在合理资源分配时,可增加系统中处理请求操作的资源实体,进而提升系统能够同时处理的请求数,即吞吐率。

左图是我们采用多线程时所期待的结果。

image.png

但通常情况用多线程后,若无良好系统设计,实际得到的结果,其实是右图那样。为什么会这样?‘

核心瓶颈在于,系统通常会存在被多线程同时访问的共享资源,如一个共享的数据结构。当多线程修改共享资源时,为保证共享资源正确性,就需额外机制保证,就直接带来额外开销。

比如Redis有List数据类型,并提供出队(LPOP)和入队(LPUSH)操作。假设Redis采用多线程设计,现有两个线程A、B:

A对一个List做LPUSH操作,并对队列长度加1

同时,线程B对该List执行LPOP操作,并对队列长度减1


为保证队列长度正确性,Redis要让线程A和B的LPUSH和LPOP串行执行,这样Redis可无误地记录它们对List长度修改。否则,可能得到错误结果。

这就是多线程编程面临的共享资源的并发访问控制问题。

image.png

如果无精心设计,比如只是简单采用一个粗粒度的互斥锁,就会出现不理想结果:即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加。

也会引入同步原语保护共享资源的并发访问,降低系统代码的易调试性和可维护性。


为避免这些Redis直接单线程模式。


讲到这里,你应该已经明白了“Redis为什么用单线程”,那么,接下来,我们就来看看,为什么单线程Redis能获得高性能。


纯内存操作

基于非阻塞的IO多路复用机制

避免了多线程的频繁上下文切换

2 文件事件处理器

Redis 基于 Reactor 模式开发了自己的网络事件处理器 - 文件事件处理器(file event handler,后文简称为 FEH),而该处理器又是单线程的,所以redis设计为单线程模型。

采用I/O多路复用同时监听多个socket,根据socket当前执行的事件来为 socket 选择对应的事件处理器。

当被监听的socket准备好执行accept、read、write、close等操作时,和操作对应的文件事件就会产生,这时FEH就会调用socket之前关联好的事件处理器来处理对应事件。

所以虽然FEH是单线程运行,但通过I/O多路复用监听多个socket,不仅实现高性能的网络通信模型,又能和 Redis 服务器中其它同样单线程运行的模块交互,保证了Redis内部单线程模型的简洁设计。


下面讲讲文件事件处理器的几个组成部分。

image.png

目录
相关文章
|
2月前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
5月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
209 0
|
2月前
|
存储 缓存 监控
什么是线程池?它的工作原理?
我是小假 期待与你的下一次相遇 ~
191 1
|
3月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
3月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
4月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
288 1
|
4月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
6月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
414 41
|
5月前
|
存储 缓存 NoSQL
Redis 核心知识与项目实践解析
本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。 还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。 此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
143 1

热门文章

最新文章

推荐镜像

更多
  • DNS