首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)

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

作者头像
用户8589624
发布2025-11-13 15:08:49
发布2025-11-13 15:08:49
910
举报
文章被收录于专栏:nginxnginx

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

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

示例代码:

代码语言:javascript
复制
// 设置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模式进行通信。

示例代码:

代码语言:javascript
复制
// 创建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操作后通知应用程序。

示例代码:

代码语言:javascript
复制
// 设置信号处理函数
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),是一种简单而高效的二进制协议。

示例代码:

代码语言:javascript
复制
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n

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

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

示例代码:

代码语言:javascript
复制
// 创建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原理篇的技术博客分享!如果您有任何问题或建议,请随时在评论中告诉我们。谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis网络模型-epoll的ET和LT模式
    • Redis网络模型-基于epoll的服务端流程
    • Redis网络模型-信号驱动IO及异步IO
    • Redis网络模型-Redis是单线程吗,为什么用单线程
    • Redis网络模型-Redis单线程及多线程网络模型变
    • Redis通信协议-RESP协议
    • Redis通信协议-基于socket的自定义Redis客户端
    • Redis内存回收-过期key处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档