Redis -- 单线程模型

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis -- 单线程模型


线程模型

       redis只使用一个线程,处理所有的命令请求,不是说redis服务器进场内部真的就只有一个线程,其实也有多个线程,那就是处理网络和io的线程。

       Redis使用单线程架构来实现高性能的内存数据库服务。

       下图是两个redis-cli客户端对同一个redis服务器进行+1请求:

       在学习java的过程中我们就可以很容易的就知道,这里肯定涉及到一个多线程问题,表面上是自增两次,但是实际上可能只自增了一次。 出现这种问题的原因就是并发。

       幸运的是redis并不会发生这种问题。因为redis是单线程模型,保证了接受多个请求,都是串行的执行,多个请求也是需要在请求队列中进行排队一个一个的执行。

       redis能够使用单线程模型来进行很好的工作,得益于redis的核心业务逻辑都是短平快。不需要消耗很多的cpu资源就可以执行。

redis单线程图解

       但是他也有弊端,那就是如果一个操作时间过长,那么就会影响其他任务的执行。


       说了这么多,既然是单线程,那为什么redis这么?🧐


Redis为什么这么快

       一切的快慢都是有参照物的,那么redis的快的参照物,毫无疑问那就是mysql和SqlServer等关系型数据库。因为redis是直接访问内存,而这些关系型数据库一般都是访问硬盘操作,访问内存的操作肯定比访问硬盘的操作要更加的快速。

       其次,redis要做的业务的核心功能更加简单。Redis既是访问内存,干的事也是很简单。关系型数据库mysql对于插入查询都有着更加复杂的功能支持,这样的功能势必要话费更多的开销。例如各种插入,都有各种约束,都会消耗性能,让数据库变慢。

       Redis干的活很少,提供的功能也是少了不少。🚀

       由于单线程模型,避免了一些不必要的线程竞争开销。

       处理网络IO的时候,使用了epoll这样的IO多路复用一个线程管理多个socket)再加上Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不在网络 I/O 上浪费过多的时间。

Redis如何利用多路复用?

        一个线程, 就可以管理多个 socket针对 TCP 来说,服务器这边每次要服务一个客户端,都需要给这个客户端安排一个 socket一个服务器服务多个客户端, 同时就有很多个 socket.

       这些 socket 上都是无事不刻的在传输数据嘛??? 很多情况下,每个客户端和服务器之间的通信也没那么频繁此时这么多 socket 大部分时间都是 静默的上面是没有数据需要传输的。

       同一时刻只有少数的socket是活跃的,如果每一个客户端都生成一个socket,那么线程就多了,系统开销就大了。

       虽然单线程给 Redis 带来很多好处,但还是有一个致命的问题:对于单个命令的执行时间都是有要求的。如果某个命令执行过长,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客户端的阻塞,对于 Redis 这种高性能的服务来说是非常严重的,所以 Redis 是面向快速执行场景的数据库。

       所以我们应该避免keys * 这样的操作。


       你确实挺厉害,如果能从第一篇看到这里的话。不过这些大多数是我自己复习的文章,如果能帮到你是最好的,谢谢。

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
22天前
|
存储 安全 Java
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
48 5
|
16天前
|
消息中间件 监控 Java
滴滴面试:谈谈你对Netty线程模型的理解?
Netty 线程模型是指 Netty 框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。 **Netty 线程模型被称为 Reactor(响应式)模型/模式,它是基于 NIO 多路复用模型的一种升级,它的核心思想是将 IO 事件和业务处理进行分离,使用一个或多个线程来执行任务的一种机制。** ## 1.**Reactor三大组件** Reactor 包含以下三大组件: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1717079218890-89000a00-48bc-4a1a-b87e-e1b6
26 2
|
17天前
|
安全 调度
鸿蒙HarmonyOS实战-Stage模型(线程模型)
本文介绍了线程作为操作系统调度的最小单位,是进程中的执行流,具有轻量级、并发执行、共享资源、通信简单和上下文切换等特点。线程分为用户线程和内核线程,其中内核线程由操作系统管理,而用户线程由应用程序控制。线程用于提高程序性能和响应速度,尤其适合多任务并发处理。在HarmonyOS中,每个应用有主线程负责UI和 ArkTS 引擎管理,以及Worker线程执行耗时任务。线程间通信可通过Emitter实现事件同步和Worker进行异步操作。
|
19天前
|
设计模式 安全 Java
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
24 2
|
23天前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
27 3
|
23天前
|
Linux 调度 Windows
【操作系统】线程、多线程模型
【操作系统】线程、多线程模型
31 1
|
缓存 NoSQL JavaScript
Redis之线程IO模型
Redis之线程IO模型
583 0
|
23天前
|
NoSQL Linux Redis
Redis -- 安装客户端redis-plus-plus
Redis -- 安装客户端redis-plus-plus
47 0
|
1月前
|
NoSQL Linux 网络安全
Linux安装Redis(详细教程)
Linux安装Redis(详细教程)
91 2
|
2天前
|
NoSQL Linux 网络安全
基于 centOS7 的 redis 安装
基于 centOS7 的 redis 安装
19 1