Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快

简介: 本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。

redis 只使用一个线程,处理所有的命令请求

不是说 redis 服务器进程内部真的就只有一个线程

其实也有多个线程,多个线程是在处理 网络IO

    redis 能够使用 单线程模型 很好的工作,原因主要在于 redis 的**核心业务逻辑,都是短平快的**,不太消耗 cpu 资源也就不太吃多核了!!!

    因此 redis 必须要特别小心,某个操作占用时间长,就会阻塞其他命令的执行

一、redis 的线程安全问题?

假设有多个客户端,同时操作一个 redis 服务器

当前这两个客户端,也相当于“并发”的发起了上述的请求

此时就意味着是否服务器这边也会存在类似的线程安全问题呢

幸运的是,并不会

redis 服务器实际上是单线程模型,保证了当前收到的这多个请求是串行执行的!!!

多个请求同时到达 redis 服务器,也是要先在队列中排队

再等待 redis 服务器一个一个的取出里面的命令再执行

微观上讲,redis 服务器是串行/顺序执行这多个命令的

二、redis 虽然是单线程模型,为什么效率这么高呢,速度这么快呢(参照物是数据库)

1、redis 访问内存、数据库则是访问硬盘

2、redis 核心功能,比数据库的核心功能更简单

    数据库对于数据的插入、删除、查询等操作都有更复杂的功能支持,这样的功能势必要花费更多的开销

    比如,针对插入、删除,数据库中的各种约束,都会使数据库做额外的工作

3、单线程模型,避免了一些不必要的线程竞争开销

    redis 每个基本操作,都是短平快的,就是简单操作一下内存数据,不是什么特别消耗 cpu 的操作,就算搞多个线程,也提升不大

4、处理网络IO的时候,使用了 epoll 这样的 IO 多路复用机制

目录
相关文章
|
3月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
216 2
|
8月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
8月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
监控 NoSQL 安全
如何在 Redis 中正确使用多线程?
【10月更文挑战第16天】正确使用 Redis 多线程需要综合考虑多个因素,并且需要在实践中不断摸索和总结经验。通过合理的配置和运用,多线程可以为 Redis 带来性能上的提升,同时也要注意避免可能出现的问题,以保障系统的稳定和可靠运行。
368 2
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
305 1
|
10月前
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
260 6
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
244 1
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
199 1
|
缓存 NoSQL JavaScript
Redis之线程IO模型
Redis之线程IO模型
699 0

热门文章

最新文章