Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)

Redis网络模型-epoll的ET和LT模式

Redis采用epoll作为网络模型,通过ET(Edge Triggered)和LT(Level Triggered)两种模式来处理网络事件。ET模式只在状态变化时触发事件,而LT模式则在状态可读或可写时触发事件。

示例代码:

// 设置socket为ET模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK | O_ET);
// 设置socket为LT模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

Redis网络模型-基于epoll的服务端流程

Redis服务端在启动时,会创建一个epoll实例,并监听客户端连接。当有新连接时,会注册对应的事件处理函数,并使用非阻塞IO模式进行通信。

示例代码:

// 创建epoll实例
int epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
    perror("epoll_create1");
    exit(EXIT_FAILURE);
}
// 监听客户端连接
epoll_event.events = EPOLLIN | EPOLLET; // 使用ET模式
epoll_event.data.fd = sockfd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &epoll_event) == -1) {
    perror("epoll_ctl");
    exit(EXIT_FAILURE);
}
// 处理事件循环
while (1) {
    int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
    for (int i = 0; i < num_events; i++) {
        if (events[i].data.fd == sockfd) {
            // 处理新连接
            handle_new_connection(sockfd);
        } else {
            // 处理数据读写
            handle_io_event(events[i].data.fd);
        }
    }
}

Redis网络模型-信号驱动IO及异步IO

Redis采用信号驱动IO(Signal-driven IO)和异步IO(Asynchronous IO)来提高IO效率。信号驱动IO通过信号通知内核完成IO操作,而异步IO则由内核完成IO操作后通知应用程序。

示例代码:

// 设置信号处理函数
signal(SIGIO, io_handler);
// 设置socket为异步IO模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_ASYNC);

Redis网络模型-Redis是单线程吗,为什么用单线程

Redis采用单线程模型,即每个客户端连接对应一个线程。这样做的好处是避免了线程切换和同步开销,提高了并发能力。

Redis网络模型-Redis单线程及多线程网络模型变

Redis在4.0版本中引入了多线程网络模型,通过线程池处理IO事件,提高了并发处理能力。

Redis通信协议-RESP协议

Redis通信协议采用RESP(REdis Serialization Protocol),是一种简单而高效的二进制协议。

示例代码:

*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n

Redis通信协议-基于socket的自定义Redis客户端

开发一个基于socket的自定义Redis客户端,可以直接与Redis服务器进行通信。

示例代码:

// 创建Socket连接
Socket socket = new Socket("localhost", 6379);
// 发送命令
OutputStream outputStream = socket.getOutputStream();
outputStream.write("SET mykey myvalue\r\n".getBytes());
// 接收响应
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
inputStream.read(buffer);
String response = new String(buffer);
System.out.println(response);

Redis内存回收-过期key处理

Redis采用惰性删除和定期删除两种方式处理过期key。惰性删除是在访问时检查key是否过期,而定期删除是通过定时任务扫描过期key进行删除。

感谢您阅读本篇Redis原理篇的技术博客分享!如果您有任何问题或建议,请随时在评论中告诉我们。谢谢!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
46 6
|
11天前
|
算法 JavaScript 前端开发
新生代和老生代内存划分的原理是什么?
【10月更文挑战第29天】新生代和老生代内存划分是JavaScript引擎为了更高效地管理内存、提高垃圾回收效率而采用的一种重要策略,它充分考虑了不同类型对象的生命周期和内存使用特点,通过不同的垃圾回收算法和晋升机制,实现了对内存的有效管理和优化。
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
56 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
116 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
16天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
191 2
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
225 3
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
26 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
24 3