【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线程数为4
        JedisPoolConfig 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);

        // 创建多个线程并发访问Redis
        for (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的网络模型对于提高系统的性能和可靠性至关重要。在实际应用中,根据系统的需求和资源限制,可以选择适合的网络模型并进行相应的优化配置。

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开始学习Vue2(脚手架,组件化开发)

一、单页面应用程序 单页面应用程序&#xff08;英文名&#xff1a;Single Page Application&#xff09;简 称 SPA&#xff0c;顾名思义&#xff0c;指的是一个 Web 网站中只有唯一的 一个 HTML 页面&#xff0c;所有的功能与交互都在这唯一的一个页面内完成。 二、vue-cli …

omron adept控制器维修SmartController EX

欧姆龙机器人adept运动控制器维修SmartController EX 19300-000 维修范围&#xff1a;姆龙机器人&#xff1b;码垛机器人&#xff1b;搬运机器人&#xff1b;焊机机器人&#xff1b;变位机等。 Adept Viper s650/s850用于装配、物料搬运、包装和机械装卸&#xff0c;循环周期短…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

《汇编语言》- 读书笔记 - 第8章 - 数据处理的两个基本问题(阶段总结)

《汇编语言》- 读书笔记 - 第8章 - 数据处理的两个基本问题&#xff08;阶段总结&#xff09; 8.1 bx、si、di 和 bp (可用于内存寻址)8.2 机器指令处理的数据在什么地方8.3 汇编语言中数据位置的表达1. 立即数(idata)2. 寄存器3. 段地址(SA)和偏移地址(EA) 8.4 寻址方式8.5 指…

HPA自动扩缩容

HPA是什么&#xff1f;&#xff1f;&#xff1f; Horizontal Pod Autoscaling: k8s自带的模块&#xff0c;pod的水平自动伸缩&#xff0c;对象是pod。 pod占用cpu比率达到一定的阈值&#xff0c;将会触发伸缩机制。 replication controller 副本控制器 deployment controll…

【ZYNQ入门】第九篇、双帧缓存的原理

目录 第一部分、基础知识 1、HDMI视频撕裂的原理 2、双帧缓存的原理 第二部分、代码设计原理 1、AXI_HP_WR模块 2、AXI_HP_RD模块 3、Block design设计 第三部分、总结 1、写在最后 2、更多文章 第一部分、基础知识 1、HDMI视频撕裂的原理 在调试摄像头的时候&#xf…

CMS如何调优

业务JVM频繁Full GC如何排查 原则是先止损&#xff0c;再排查。 FGC的原因是对象晋升失败或者并发模式失败&#xff0c;原因都是老年代放不下晋升的对象了。 1.可能是大对象导致的内存泄漏。快速排查方法&#xff1a;观察数据库网络IO是否和FGC时间点吻合&#xff0c;找到对应…

Servlet生命周期

第一阶段&#xff1a; init&#xff08;&#xff09;初始化阶段 当客户端想Servlet容器&#xff08;例如Tomcat&#xff09;发出HTTP请求要求访问Servlet时&#xff0c;Servlet容器首先会解析请求&#xff0c;检查内存中是否已经有了该Servlet对象&#xff0c;如果有&#xff…

机器人制作开源方案 | 全自动导航分拣机器人

作者&#xff1a;孙国峰 董阳 张鑫源 单位&#xff1a;山东科技大学 机械电子工程学院 指导老师&#xff1a;张永超 贝广霞 1. 研究意义 1.1 研究背景 在工业生产中&#xff0c;机器人在解决企业的劳动力不足&#xff0c;提高企业劳动生产率&#xff0c;提高产品质量和降低…

【c++学习】数据结构中的链表

c链表 数据结构中的链表代码 数据结构中的链表 链表与线性表相对&#xff0c;链表数据在内存中的存储空间是不连续的&#xff0c;链表每个节点包含数据域和指针域。 代码 下述代码实现了链表及其接口 包括增、删、查、改以及其他一些简单的功能 #include <iostream>u…

FRRouting学习(一) 配置日志文件

以配置isis event事件日志为例 1、在配置之前&#xff0c;/var/log/frr路径下是没有文件的&#xff1a; 2、在vtysh config之下输入&#xff1a;log file /var/log/frr/isisd.log debugging 后面的debugging表示日志级别&#xff0c;可以根据自己修改 3、配置好了之后&#xf…

java——数据类型与变量

目录 &#x1f469;&#x1f3fb;‍&#x1f4bb;字面常量 &#x1f469;&#x1f3fb;‍&#x1f4bb;数据类型 &#x1f469;&#x1f3fb;‍&#x1f4bb;变量 ❗整型变量 &#x1f449;int(整型)默认值 &#x1f449;long(长整型) &#x1f449;short(短整型) &…

webpack如何把dist.js中某个模块js打包成一个全局变量,使得在html引入dist.js后可以直接访问

webpack可以通过使用expose-loader来将模块中的一个js文件暴露为全局可以访问的变量。下面是一个示例代码&#xff1a; 1、安装expose-loader npm install expose-loader --save-dev 2、webpack.config.js配置文件 值得注意的是&#xff1a;我在本地使用16.14.2版本的node打包…

Springboot+vue的医院后台管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的医院后台管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的医院后台管理系统&#xff0c;采用M&#xff08…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…

基于springboot+vue的海滨体育馆管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP

前言 整体评价 前三题蛮简单的&#xff0c;T4是一个带状态的DP&#xff0c;这题如果用背包思路去解&#xff0c;不知道如何搞&#xff0c;感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…

基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手

文章目录 一、效果演示二、操作步骤三、架构解析 一、效果演示 各位读者你们好&#xff0c;我最近在研究一个语音助手的项目&#xff0c;是基于GPT3.5网页版的逆向和本地BertVits2-2.3 文字转语音&#xff0c;能实现的事情感觉还挺多&#xff0c;目前实现【无需翻墙&#xff0…

UV紫外激光打标机的优缺点是什么

​ UV紫外激光打标机具有以下优点&#xff1a; 1. 精度高&#xff1a;紫外激光打标机的光束质量好&#xff0c;聚焦光斑小&#xff0c;可以实现在各种材料上进行超精细打标。 2. 速度快&#xff1a;由于紫外激光的独特特性&#xff0c;打标速度非常快&#xff0c;提高了生产效…

SpringSecurity认证登录成功后获取角色菜单

目录 前言 一、RBAC模型 二、实战应用 1. 建立用户、角色、资源实体类 2. 数据层查询角色资源 3. 业务层实现&#xff0c;调用数据层查询接口 4. SystemController控制器菜单获取方法 5. menu.jsp菜单页面实现 前言 本篇文章接SSM项目集成Spring Security 4.X版本&…