Redis 为什么这么快?
2024-09-04 22:59:34
1. 纯内存操作,肯定快
数据存储在内存中,读取的时候不需要进行磁盘的 IO
2. 单线程,无锁竞争损耗
单线程保证了系统没有线程的上下文切换
使用单线程,可以避免不必要的上下文切换和竞争条件,没有多进程或多线程引起的切换和 CPU 的消耗,不必考虑各种锁的问题,没有锁释放或锁定操作,不会因死锁而降低性能;
3. C 语言实现,更接近底层操作
Redis 是用 C 语言开发完成的
4. 多路 I/O 复用模型,非阻塞 IO
采用多路 I/O 复用技术可以让单个线程高效的处理多个网络连接请求(尽量减少网络 IO 的时间消耗)
非阻塞 IO 内部实现采用 epoll,采用了 epoll+自己实现的简单的事件框架。epoll 中的读、写、关闭、连接都转化成了事件,然后利用 epoll 的多路复用特性,绝不在 io 上浪费一点时间。
5. 数据结构简单,底层又做了优化
数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
6. 源码精湛、简短
扩展:
在 Redis 中,常用的 5 种数据结构和应用场景
- String: 缓存、计数器、分布式锁等。
- List: 链表、队列、微博关注人时间轴列表等。
- Hash: 用户信息、Hash 表等。
- Set: 去重、赞、踩、共同好友等。
- Zset: 访问量排行榜、点击量排行榜等。
多路 I/O 复用模型
多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响 Redis 性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。
参考文章:
视频 | IO 多路复用 select/poll/epoll 介绍
个人公众号《骇客与画家》,欢迎关注
最新文章
- Redis模式匹配删除key
- JS获取地址栏参数的方法
- linnux 3
- js 滚动加载iframe框中内容
- 穹举,迭代,while循环。
- Build better apps: Windows 10 by 10 development series
- 转:从编译链接过程解析static函数的用法
- GNU C 扩展(转)
- C/C++ 中 const 修饰符用法总结
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
- CTSC2017总结
- 乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778
- MySQL--CREATE INDEX在各版本的优化
- jar各个版本号的意义
- noip第23课作业
- 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破
- 题目1446:Head of a Gang(并查集操作)
- iptable防火墙案例
- 【数据库_Postgresql】sql查询结果添加序号列
- popViewControllerAnimated 后的刷新问题