【Redis】网络模型

图片

前言

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储系统,广泛用于各种网络应用中作为数据库、缓存和消息代理。Redis的网络模型是其高性能的关键因素之一,它涉及到多个方面,包括内存管理、事件处理、网络协议等。了解Redis的网络模型有助于更好地利用其功能,优化系统的性能和可靠性。

Redis具有的特点:

  1. 高性能:Redis采用内存存储和异步IO机制,能够实现高速读写,读写性能优越。

  2. 数据持久化:Redis支持多种数据持久化方式,包括RDB和AOF两种方式。RDB方式会将内存中的数据定时写入磁盘,AOF方式则会将每个命令追加到磁盘中的AOF文件。

  3. 多种数据结构:Redis提供了多种数据结构,包括字符串、哈希表、列表、集合和有序集合等,可满足不同场景下的需求。

  4. 分布式:Redis提供了分布式支持,能够通过主从复制和集群两种方式实现数据的分布式操作。

  5. 原子性操作:Redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。

  6. 高可用性:Redis支持哨兵机制(master-slave模式)和redis cluster高可用两种高可用方式。

  7. 发布与订阅的消息机制:Redis也支持发布与订阅的消息机制,但不建议使用Redis来做消息中间件。

  8. 简单事务:Redis支持简单事务。

Redis的应用场景:

  1. 会话管理:利用Redis的持久化功能,可以存储和跟踪用户的会话信息。这对于保持用户在网站上的活动以及个性化体验非常重要。

  2. 缓存:由于Redis的高性能和持久化特性,它经常被用作缓存系统。缓存热门数据或频繁访问的数据可以减少数据库的负载,提高应用程序的响应时间。

  3. 排行榜和积分系统:Redis提供了有序集合数据类型,可以轻松实现各种复杂的排行榜应用,例如商品按时间的上新排行榜、京东的月度销量榜单等。

  4. 计数器:例如电商网站商品的浏览量、视频网站视频的播放量等,可以使用Redis的incre命令实现计数器功能。内存操作使得性能非常好,适用于这些计数场景。

  5. 分布式锁:在许多互联网公司中都使用了分布式技术,Redis提供的分布式锁功能可以帮助开发者解决分布式系统中的并发访问问题。

  6. 社交网络功能:点赞、踩、关注/被关注、共同好友等功能是社交网络的基本功能。Redis提供的哈希、集合等数据结构能很方便的实现这些功能。

  7. 消息队列:虽然RabbitMQ、Kafka等专业的消息队列服务对消息队列支持更全面,但Redis的发布/订阅功能也可以用于简单的消息队列场景。

  8. 日志管理:Redis可以用来存储和管理应用程序的日志数据,特别是对于需要实时处理和分析日志数据的场景。

  9. 实时数据分析:Redis提供了丰富的数据结构和操作,可以用于实时数据分析,如统计网站的独立访客、页面浏览量等。

  10. 地理位置服务:利用Redis存储地理位置信息,如经纬度坐标,可以快速查询和定位用户或物品的位置。

Redis的网络模型主要包括以下几个方面:

  1. 内存存储:Redis使用内存作为其主要存储介质,数据直接存储在内存中,避免了磁盘I/O操作的开销,从而实现了极高的数据读写速度。

  2. Reactor模式:Redis采用了一种称为Reactor模式的事件处理机制。在这种模式下,Redis使用一个主循环来监听客户端的连接请求,并将连接请求分配给一个或多个工作线程进行处理。

  3. 单线程模型与多线程模型:根据使用的版本和配置,Redis可以运行在单线程或多线程模式下。在单线程模式下,所有的读写操作都在一个线程中执行。多线程模式允许多个线程同时处理客户端的请求,提高了系统的并发处理能力。

  4. 网络协议:Redis使用自定义的网络协议与客户端进行通信。客户端和Redis服务器之间通过TCP连接进行通信,使用二进制格式的数据传输,具有高效的数据传输性能。

图片

Redis内存存储

Redis使用内存作为其主要存储介质。所有的数据都存储在内存中,这意味着读写操作的速度非常快,避免了磁盘I/O操作的开销。Redis提供了多种数据结构,如字符串、哈希表、列表、集合等,这些数据结构在内存中以特定的方式进行存储,以便快速地进行读取和修改。为了优化内存使用,Redis还实现了内存回收和内存压缩机制。通过合理配置和优化Redis的内存使用,可以进一步提高系统的性能和可靠性。

Reactor模式

Reactor模式是一种事件处理机制,广泛应用于网络编程。在这种模式下,一个单独的线程或一组线程等待多个事件的发生,一旦事件发生,就立即处理该事件。Redis使用Reactor模式来处理客户端的连接请求和读写事件。Redis的主循环负责监听客户端的连接请求,并将请求分配给一个或多个工作线程进行处理。每个工作线程负责处理一部分连接,这使得多个CPU核心可以同时工作,从而提高了系统的整体性能。通过合理配置Reactor模式下的线程数量和工作负载分布,可以进一步优化Redis的性能和并发处理能力。

 Reactor模式读写流程:

  •  Reactor:负责响应事件,将事件分发到绑定了对应事件的Handler,如果是连接事件,则分发到Acceptor。

  • Handler:事件处理器,负责执行对应事件对应的业务逻辑。

  • Acceptor:绑定了connect事件,当客户端发起connect请求时,Reactor会将accept事件分发给Acceptor处理。

单线程模型

在早期版本中,Redis采用单线程模型。redis网络IO模型底层使用IO多路复用,通过reactor模式实现的。这意味着所有的读写操作都在一个线程中执行。虽然这种模型简单且易于实现,但它无法充分利用多核CPU的性能。为了解决这个问题,Redis引入了多线程模型。

图片

多线程模型

Redis6.0 版本之后,Redis 正式在核心网络模型中引入了多线程,也就是所谓的 I/O threading,至此 Redis 真正拥有了多线程模型,这对应了主从Reactor多线程模型的Reactor设计模式。多线程模型允许多个线程同时处理客户端的请求。每个线程负责处理一部分连接,这使得多个CPU核心可以同时工作,从而提高了系统的整体性能。然而,多线程模型也带来了线程管理和同步的问题,需要谨慎处理以避免竞态条件和死锁。

图片

例子1:多个线程并发访问Redis

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisMultiThreadDemo {public static void main(String[] args) {// 创建JedisPoolConfig对象,设置IO线程数为4JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(4);config.setMaxIdle(4);config.setMinIdle(0);config.setTestOnBorrow(true);config.setTestOnReturn(true);config.setTestWhileIdle(true);// 创建JedisPool对象,连接到Redis服务器JedisPool jedisPool = new JedisPool(config, "localhost", 6379);// 创建多个线程并发访问Redisfor (int i = 0; i < 10; i++) {new Thread(() -> {try (Jedis jedis = jedisPool.getResource()) {jedis.set("key" + Thread.currentThread().getId(), "value");System.out.println("Set key" + Thread.currentThread().getId() + ": " + jedis.get("key" + Thread.currentThread().getId()));}}).start();}}
}

网络协议

Redis的网络协议是一种基于文本的协议,使用基于文本的命令请求和响应格式。客户端通过TCP协议与Redis服务器建立连接,然后发送命令请求,服务器接收到命令请求后执行相应的操作,并将结果作为响应返回给客户端。

命令请求和响应都是以回车换行符(CRLF)为结束标记的字符串,其中命令请求是由一个或多个命令组成的字符串序列,每个命令以回车换行符(CRLF)结束;响应则是由一个或多个响应组成的字符串序列,每个响应也是以回车换行符(CRLF)结束。

除了基本的文本协议外,Redis还支持一种二进制安全的数据协议(Binary-Safe),该协议允许客户端发送二进制数据作为命令请求和响应。这种协议可以更好地处理非文本的数据,例如图像、音频、视频等。

另外,Redis还支持一种称为“请求-响应协议”的通信协议,该协议允许客户端发送多个命令请求并接收多个响应。这种协议可以提高通信效率,减少网络延迟和阻塞。

总之,Redis的网络协议是一种简单、高效、可靠的通信协议,能够满足各种应用场景的需求。

图片

例子2:连接Redis服务器并执行一些基本操作

import redis.clients.jedis.Jedis;public class RedisDemo {public static void main(String[] args) {// 创建Jedis对象,连接到Redis服务器Jedis jedis = new Jedis("localhost", 6379);// 设置一个键值对jedis.set("key", "value");// 获取键对应的值String value = jedis.get("key");System.out.println("Value of key: " + value);// 关闭连接jedis.close();}
}

结语

Redis的网络模型是其高性能的关键因素之一。通过使用Reactor模式和多线程模型,Redis能够高效地处理大量并发连接,并提供快速的数据读写操作。了解并合理配置Redis的网络模型对于提高系统的性能和可靠性至关重要。在实际应用中,根据系统的需求和资源限制,可以选择适合的网络模型并进行相应的优化配置。

图片

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

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

相关文章

数灵通可以让抖音跳转企业微信并回传

抖音作为一款热门的短视频应用&#xff0c;吸引了大量用户的关注和参与。 对于企业而言&#xff0c;如何有效地将其他平台的客户引入企业微信成为了一个重要的课题。本文以利用抖音渠道进行引流&#xff0c;跳转到企业微信为例&#xff0c;介绍一种高效的方法。 在抖音上直接…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧&#xff0c;本文将帮助大家零门槛的实现模型在多个GPU的并行训练&#xff0c;如果你手头上没有GPU资源&#xff0c;根据本文的介绍也可实现…

dhcp服务器的ip池的待分配ip地址是否冲突的检测机制

看到有的资料说&#xff0c;dhcp服务器在分配ip地址时&#xff0c;要检测是否待分配的ip地址是否存在冲突&#xff0c;会向广播域发出&#xff0c;对应ip发出icmp的ping消息来验证是否冲突。特地用自己的公司的交换机验证一下&#xff0c;在交换机上镜像抓包观察一下。 wiresha…

机器学习实验4——CNN卷积神经网络分类Minst数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1; 原理&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;CNN实现分类Minst&#x1f9e1;&#x1f9e1;代码数据预处理&#xff1a;设置基本参数&#xff1a; &#x1f9e…

接口文档swagger2的使用

Spring-接口文档swagger2 1、swagger/knife4j 接口文档配置 ​ knife4j是swagger的增强版本&#xff0c;更加的小巧、轻量&#xff0c;功能也是更加的完善&#xff0c;UI也更加的清晰&#xff1b;可以从swagger到knife4j无缝切换。 1.1 引入相关依赖 <!--接口文档的开发:…

神经网络:表述(Neural Networks: Representation)

1.非线性假设 无论是线性回归还是逻辑回归&#xff0c;当特征太多时&#xff0c;计算的负荷会非常大。 案例&#xff1a; 假设我们有非常多的特征&#xff0c;例如大于 100 个变量&#xff0c;我们希望用这 100 个特征来构建一个非线性的多项式模型&#xff0c;结果将是数量非…

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

springboot导出数据到excel模板,使用hutool导出数据到指定excel,java写入数据到excel模板

最近遇到一个需求&#xff0c;需要从数据库查询数据&#xff0c;写入到对应的excel导入模板中。再把导出的数据进行修改&#xff0c;上传。 我们项目用的是easyExcel&#xff0c;一顿百度搜索&#xff0c;不得其法。 主要是要把数据填充到指定单元格中&#xff0c;跟平时用到的…

【Android】细数Linux和Android系统中的伪文件系统

文章目录 前言Linux伪文件系统cgroupfsLinux的cgroupsAndroid的cgroups debugfsfunctionfs(/dev/usb-ffs/adb)functionfs 的引入sysfs是什么 procfs(/proc)pstore(/sys/fs/pstore)selinuxfs(/sys/fs/selinux)sysfs(/sys)参考 前言 做了好些年Android开发&#xff0c;你了解过L…

Java Web(二)--HTML

基本介绍 官网文档地址: HTML 教程 HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff1b;HTML 文本是由 HTML 标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、链接等&#xff1b;HTML 的结构包括头部&#xff08;Head&…

学校“数据结构”课程Project—扩展功能(自主设计)

目录 一、设想功能描述 想法缘起 目标功能 二、问题抽象 三、算法设计和优化 1. 易想的朴素搜索 / dp 搜索想法 动态规划&#xff08;dp&#xff09;想法 2. 思考与优化 四、算法实现 五、结果示例 附&#xff1a;使用的地图API 一、设想功能描述 想法缘起 OSM 导出…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写&#xff0c;1986年&#xff0c;由德国Bosch公司为汽车开发的网络技术&#xff0c;主要用于汽车的监测与控制&#xff0c;目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

TA百人计划学习笔记 3.1.1模板测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例&#xff08;描边&#xff0c;多边形填充&#xff0c;反射区域限定&#xff0c;阴影…

c++学习笔记-STL案例-机房预约系统6-老师模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统5-学生模块”&#xff0c;本文主要设计老师模块&#xff0c;从&#xff0c;老师登录和注销、查看所有预约、审核预约三个方面进行分析和实现。 目录 9 教师模块 9.1 教师登录和注销 9.1.1 构造函数 9.1.2 教师子菜单 ​编…

Linux7 安装 Oracle 19C RAC 详细图文教程

实战篇&#xff1a;Linux7 安装 Oracle 19C RAC 详细图文教程 本文是按照&#xff1a;https://www.modb.pro/db/154424的思路进行编写 一、安装前规划 安装RAC前&#xff0c;当然要先做好规划。具体包含以下几方面&#xff1a; 节点主机版本主机名实例名Grid/Oracle版本Publi…

鸿蒙原生开发-仿ChatGPT应用实战

运行环境 DAYU200:4.0.10.16 SDK&#xff1a;4.0.10.15 IDE&#xff1a;4.0.600 前言 在配置好环境之后&#xff0c;可以尝试这编写一个较为简单的应用程序练练手&#xff0c;这里选择使用一个免费的API接口网站 ALAPI来尝试编写一个可进行对话的GPT应用程序。 创建项目 …

SQL注入示例

例一、基础SQL注入&#xff1a;load_file读文件 CISP-PTE 认证考试 首先是有单引号和括号的&#xff0c;首要是要闭合&#xff0c;然后回显点是在-1的位置&#xff0c;读取文件上面的key的话使用的是load_file(/tmp/360/key) id-1)%09ununionion%09select%091,2,3,load_file…

【算法与数据结构】322、LeetCode零钱兑换

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以抽象成一个完全背包问题。 第一步&#xff0c; d p [ j ] dp[j] dp[j]的含义。 d p [ j ] dp…

Unity之Cinemachine教程

前言 Cinemachine是Unity引擎的一个高级相机系统&#xff0c;旨在简化和改善游戏中的相机管理。Cinemachine提供了一组强大而灵活的工具&#xff0c;可用于创建令人印象深刻的视觉效果&#xff0c;使开发人员能够更轻松地掌控游戏中的摄像机行为。 主要功能和特性包括&#x…