Redis为什么快(高性能)

Redis作为一个内存数据库,以其卓越的性能在大规模分布式系统中广泛应用。其高性能不仅仅依赖于单一的设计特性,而是多方面优化和精心设计的结果。以下是Redis高性能的详细介绍:

1. 内存存储架构(In-memory Database)

Redis是一个内存数据库,这意味着它的所有数据都存储在内存中,而不是磁盘上。这种内存存储架构带来了显著的性能优势:

  • 内存访问速度:内存比硬盘(即使是固态硬盘SSD)要快得多。内存的读写速度通常在纳秒级别,而硬盘则在毫秒级别,因此Redis能够提供极低的延迟。
  • 数据存储方式:数据以键值对的形式存储在内存中,支持高效的查找、插入和删除操作。Redis的数据结构(如字符串、哈希、列表、集合、有序集合等)都在内存中经过高度优化,确保访问速度非常快。

2. 单线程模型(Single-threaded Model)

Redis采用了单线程的事件驱动模型,这意味着所有的命令处理都由一个线程完成,避免了传统多线程程序中因锁竞争和上下文切换带来的性能损耗。具体优势包括:

  • 避免上下文切换:在多线程模型中,线程切换是必不可少的,这需要CPU保存和恢复线程的状态。上下文切换和线程调度都会带来额外的性能开销。Redis通过单线程模型避免了这个问题。
  • 高效的事件循环:Redis利用事件驱动机制(如epollkqueue)来处理IO多路复用,能够在处理请求的同时保持高效的响应。它采用了非阻塞的方式来处理客户端的请求,从而在处理大量并发请求时依然能够保持高吞吐量。
  • 低延迟响应:由于每次请求都由单一线程顺序执行,避免了线程间的争用,因此Redis能够处理大量并发请求并且保持非常低的延迟。

3. 高效的数据结构

Redis提供了多种高效的数据结构,每种数据结构都经过精心设计,能够在内存中进行高效存储和操作:

  • 字符串(String):支持高效的键值对操作,包括设置、获取、删除、修改等。支持大整数和浮点数运算、位图、HyperLogLog等功能。
  • 哈希(Hash):适用于存储对象(如用户信息、配置等),具有较高的内存压缩比和高效的查找、更新性能。
  • 列表(List):支持双端队列(deque),能够快速执行推送、弹出操作,适用于任务队列等场景。
  • 集合(Set):无序集合,支持集合操作(如交集、并集、差集等),执行速度非常快。
  • 有序集合(Sorted Set):每个元素都有一个分数,能够高效地进行按分数排序的操作,适用于排行榜等场景。
  • 位图(Bitmap):用于处理大量布尔值(0/1),可以高效地处理和存储大规模数据集的集合操作。
  • HyperLogLog:用于估算基数(例如去重统计),节省内存,同时保持相对较高的准确性。

每个数据结构都为特定场景做了优化,在内存中以最优的方式存储和访问数据,操作时间复杂度通常为常数级别(O(1))。

4. 高效的网络协议(RESP)

Redis采用了Redis协议(RESP,Redis Serialization Protocol),这一协议非常轻量且高效,它简化了客户端与服务器之间的通信,使得命令的发送和响应的处理变得非常快速:

  • 文本协议:RESP是一种文本协议,容易解析,解析过程非常高效,不需要复杂的协议解析步骤。
  • 二进制传输:RESP协议的数据传输部分是二进制格式,可以高效地进行序列化和反序列化操作,减少了处理的时间。
  • 简单的命令格式:Redis的命令格式非常简洁,每个命令都是通过字符串传递,减少了网络带宽的消耗。

5. 管道(Pipelining)

Redis支持**管道化(Pipelining)**技术,使得客户端可以在一次网络请求中发送多个命令,避免每个命令都等待网络往返的延迟:

  • 批量处理:通过管道化,多个命令可以在一个请求中传输,这样不仅减少了网络延迟,还减少了TCP连接的负担。
  • 适用于高并发场景:管道化非常适合高并发操作,比如批量写入、批量获取等,能够大大提高吞吐量。

6. 高效的内存管理

Redis非常注重内存的使用效率:

  • 高效的内存分配器:Redis使用jemalloc作为内存分配器,这是一种高效的内存管理工具,能够减少内存碎片并提升内存分配的效率。
  • 内存压缩和数据结构优化:Redis针对不同的数据结构进行了内存优化,使用高效的内存布局,确保能够在内存中存储更多数据。例如,Redis会根据哈希表的大小动态调整数据结构,避免浪费内存。
  • 避免内存碎片:通过jemalloc和内部的内存管理策略,Redis能够有效地减少内存碎片化,保持较高的内存使用效率。

7. 持久化与高可用

Redis提供了持久化机制,确保数据能够安全保存,同时它采用了异步持久化策略,不会阻塞客户端请求:

  • RDB持久化:通过定期快照(RDB),将数据写入磁盘。虽然磁盘IO比较慢,但RDB持久化是异步的,不会影响Redis的性能。
  • AOF持久化:记录每次写命令,通过追加写入日志的方式进行数据持久化。AOF的写入操作也是异步的,且可以配置为不同的策略,如每秒同步一次等。
  • 主从复制:Redis支持主从复制,主节点处理写操作,从节点负责读取操作。通过增加从节点,可以有效扩展读负载。
  • Redis Sentinel:Redis Sentinel提供了高可用性保障,能够在主节点发生故障时自动进行故障转移,保持系统的可用性。

8. 集群模式(Redis Cluster)

Redis支持分布式集群(Redis Cluster),通过数据分片机制将数据分布到多个节点,支持横向扩展:

  • 自动分片:Redis Cluster会将数据分成多个槽(hash slots),并自动将这些槽分配给集群中的不同节点。每个节点负责处理一定范围的槽。
  • 高可用性:Redis Cluster内每个主节点都可以有一个或多个从节点,当主节点故障时,可以自动切换到从节点,保证系统高可用。
  • 负载均衡:客户端可以通过哈希算法将请求路由到正确的节点,Redis Cluster能够支持水平扩展,处理更大的数据集和更高的并发请求。

9. 优化的写操作

Redis对写操作进行了许多优化:

  • 异步写入:写操作(尤其是持久化操作)大部分是异步执行的,不会阻塞客户端请求。比如AOF的日志写入是通过后台进程完成的。
  • 批量写入:Redis支持批量操作,可以一次性提交多个命令,减少网络往返延迟。

10. 高效的复制机制

Redis的主从复制不仅支持高可用性,还支持负载均衡。主节点处理写操作,多个从节点可以提供读取服务,这样可以扩展系统的读性能:

  • 全量复制和增量复制:Redis通过增量复制来提高复制效率,只有数据变化部分会被复制到从节点,减少了网络负担。
Redis的碎碎念 文章被收录于专栏

Redis面试中的碎碎念

全部评论

相关推荐

  大晚上睡不着有感而发,在当下这个卷到无边的就业环境,鼠鼠我能在去年十一月被海康收留属实不易,这里真应该给海康磕一个,愿意给我一个双非一个机会,从11月开始,收到offer后短暂的喜悦过后就是学校繁琐的制度,最后期末周,课设,实习,考试全聚一起,这压力感觉比之前比赛都要大,奈何鼠鼠能力实在太菜无法多方面兼顾,只能无奈缓考两门换取一点喘息的机会,刚解决完考试,结果学校又开始作妖了,课设请假两次直接挂科,直接拿挂科威胁,无奈刚入职不到一个月就连续请了两周假,我自己都感觉不好意思了,主管那边也真的感觉很对不住,因为一个烂课设(大三来调式32单片机,鼠鼠就想说这些我大一就玩完了#双非本科求职如何逆袭# )海康最后只能留到大年二十几才回家,年后因为之前请假也只能早早地来上班。  来了之后又发现,各种约面邀请,还有那两门难了吧唧的专业课缓考,属实把鼠鼠压的喘不过来气,不到一个周时间前前后后面了十场面试,其中可惜挂掉了的影石嵌软,良信hr担心不能干长久怕我跳槽(这里各位uu也注意一下 不要跳的太频繁,一些hr可能会因为这个卡你)最后好不容易小米二面泡池子,童心oc,童心给了一个很有竞争力的工资,刚拿到这个offer别提有多开心了,差不多是现在薪资的三倍,你敢想这对我那会是一个多大的鼓励,童心技术官和hr两次面试体验都很好本来都已经决定好要去这家公司了,结果西安这边租房房东不同意退房,爸妈也不太愿意去,意味着拿着一份工资要同时间付西安深圳两边的房租,哪怕这再高对鼠鼠也是承受不起的,只能当一会鸽子,鸽了童心了,然后就在小米的池子里泡着,也不知道什么时候能开,之后就剩下三四天时间,一门电力电子一门自控都是那些难坑的专业课平均一门就一天半时间,真的要绷不住了,上大学以来第一次有了挂科感,真的很无力很害怕,自控甚至一晚上不睡觉通宵复习,最后两门课都要看老师愿不愿意捞了,哎如果再挂两科这对今年更是雪上加霜了,在这里给这周许个愿望吧,希望这周可以等到小米的offer,能顺利通过两门缓考。#小米# #小米汽车# #日常实习# #学校不放实习# #挂科/重修对秋招有什么影响# #缓考#
点赞 评论 收藏
分享
03-11 08:56
已编辑
南京邮电大学 Python
时间跨度:3.2 号投递简历3.3 收到面试邀约 约3.4 拒了换时间3.6 一面一面(45min)面试官介绍团队具体业务---------------------------------------------正式开始面试1. 自我介绍2. 3个项目,先介绍下第一个3. ROS的通信方式知道有哪些?类似于共享内存这种?(话题通信、服务器通信...DDS)4. DDS你用的是哪种DDS?(我说的是ROS组网,面试官想了解的是Fast DDS这种)5. RAG方面你是怎么构建的?有一个流程吗,基本原理说一下(怎么来的,介绍RAG具体流程,最后效果)6. 在实际应用的时候,通过RAG效果不好的话会怎么做?如何优化?(数据集处理,检索排序,query改写)7. 第一个项目获奖了,那你觉得值得改进的地方是哪里?(硬件设备的问题导致于模型推理速度太慢)8. 停顿中……---------------------------------------------9. 第二个项目介绍一下10. 能具体介绍下文本切分方式的一些基本原理吗?11. 你得这个准确率指标是怎么来的?(几个准确率、召回率等)12. 那是主观评价还是用一些量化指标去做?(主观评价)---------------------------------------------13. 第三个项目没细问14. 大模型本地训练是在哪里?训练框架用什么的?15. 大模型相关的框架有了解过吗?(答langchain,RAG用的)---------------------------------------------手撕代码205. 同构字符串 - 力扣(LeetCode)---------------------------------------------面试官细心说明:不要切出页面,不要使用AI助手,可以拿纸张进行计算面试官真的好好10分钟不到发二面邀请了
查看27道真题和解析
点赞 评论 收藏
分享
02-28 20:57
已编辑
南京大学 算法工程师
点赞 评论 收藏
分享
评论
2
8
分享

创作者周榜

更多
牛客网
牛客企业服务