浅谈Redis线程模型

简介: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

1.Redis简介

1.1简介

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-valu存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

2.特征

1.NoSQL

2.分布式缓存中间件

3.key-value

4.提供海量的数据存储访问

5.所有数据放在内存中,访问数据非常快

6.非关系型,分布式,支持水平扩展,开源



2.Redis线程模型

image.jpeg

redis线程模型采用的是单线程模型,因为它是基于一个文件事件处理模型,而且该文件处理模型是单线程所以redis也是单线程的。那么这个文件事件处理器概含那些部分呢,它又是如何工作的呢。

文件事件处理模型如上图主要包含以下几部分:

1.Socket,一个redis服务器可以被多个redis客户端连接,这里的socket就代表着我们每一个连接着redis服务器的客户端,负责监听所以客户端的请求。

2.I/O多路复用器,服务器既然能被多个客户端连接,那么难免会出现请求并发的情况,I/O多路复用器负责监听各个socket,每当监听到socket的时候会将该socket放入一个队列,进而就将多客户端并发的这种请求转变成了队列这种串形方式

3.文件事件分配器,负责将I/O队列里的事件读取处理,然后分派给各个处理器进行处理。

4.事件处理器,负责处理对应的事件;事件处理器又包含3部分:连接应答处理器,命令请求处理器,命令回复处理器。

5.AE_Readable事件,当客户端连接到服务器,被socket监听到就会产生一个对应        AE_Readable事件。

6.AE_Writeable事件,当文件事件分配器分配事件到具体事件处理器事就会产生对        对应的AE_Writeable事件。


3.基于Redis线程模型的宏观工作流程

1.当redis客户端向服务器端发起一个写操作请求,Server Socket监听到请求后会产        生一个AE_Readable事件。

2.I/O多路复用器监听的socket后,将其放入队列中。

3.文件事件分配器从队列读取到事件后,将该事件分配给连接应答处理器,这时候会产生一个与客户端映射的socket,并将该socket与命令请求处理器绑定,这时候如果客户端请求某些操作时,例如本次请求写操作,这时候命令请求处理器就会执行对应的命令。

4.命令请求处理器处理完命令后,会将该socket与命令回复处理器绑定,并且会将请求结果返回给客户端。









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

热门文章

最新文章