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

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

相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
691 0
|
6月前
|
存储 人工智能 搜索推荐
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
Mem0 是专为 AI 代理设计的内存层,支持记忆、学习与进化。提供多种记忆类型,可快速集成,适用于开源与托管场景,助力 AI 代理高效交互与成长。
689 123
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
本文深度分析了Redis内存陡增100%的一些细节和解决方案。
522 1
Redis:内存陡增100%深度复盘
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
691 6
|
6月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
802 3
|
6月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
334 0
|
9月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
343 9
|
11月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
消息中间件 缓存 NoSQL
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
307 6