深入Redis内幕:通信协议、内存回收与淘汰策略
888
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
深入Redis内幕:通信协议、内存回收与淘汰策略
1. RESP协议简介
Redis采用RESP(Redis Serialization Protocol)协议进行客户端与服务端之间的通信。RESP协议通过首字节区分不同的数据类型,包括单行字符串、错误信息、数值、多行字符串以及数组。该协议从Redis 1.2版本引入,2.0版本成为标准(RESP2),6.0版本升级到RESP3,增加更多数据类型并支持客户端缓存。
2. Redis通信协议-基于Socket自定义Redis的客户端
Redis支持基于TCP通信,因此可以通过Socket实现自定义客户端与Redis服务端的交互。示例代码展示了如何建立连接、发送请求和接受响应。通信中遵循RESP协议格式,如发送命令时构造符合协议的字符串。
3. Redis内存回收-过期key处理
3.1 内存过期策略
通过expire命令为key设置TTL,过期后自动释放内存。Redis通过两个Dict结构分别记录key-value对和key-TTL对,用来判断key是否过期。
3.2 惰性删除
惰性删除是在访问key时检查其存活时间,若已过期则删除。
3.3 周期删除
周期删除通过定时任务抽样部分过期key进行清理,分为两种模式:
- SLOW模式:每秒执行10次,每次不超过25ms。
- FAST模式:两次间隔不低于2ms,每次耗时不超过1ms。
两种模式均以抽样方式判断过期比例,超过阈值则继续清理。
4. Redis内存回收-内存淘汰策略
当Redis内存达到上限时,通过淘汰策略主动删除部分key以释放空间。Redis支持8种淘汰策略:
- noeviction:不淘汰key,内存满时禁止写入。
- volatile-ttl:淘汰TTL值最小的key。
- allkeys-random:随机淘汰所有key。
- volatile-random:随机淘汰设置了TTL的key。
- allkeys-lru:基于LRU算法淘汰所有key。
- volatile-lru:基于LRU算法淘汰设置了TTL的key。
- allkeys-lfu:基于LFU算法淘汰所有key。
- volatile-lfu:基于LFU算法淘汰设置了TTL的key。
LRU与LFU是两种核心算法,其中LRU淘汰最近最少使用的key,而LFU淘汰访问频率最低的key。LFU通过逻辑计数和时间衰减机制更智能地管理访问次数。
总结
Redis通过RESP协议实现高效通信,通过过期key处理和内存淘汰策略优化内存使用。这些机制使Redis在内存存储、性能和稳定性上表现卓越。
springboot葵花宝典
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
白皮书上线