当前位置:网站首页>为什么Redis很快
为什么Redis很快
2022-08-10 10:44:00 【棒棒吃不胖】
与主流的关系型数据库MySQL相比,Redis的读写效率要高出很多,有下图的几个原因。
一.基于内存实现
众所周知,内存读写速度要远高于磁盘读写,Redis是基于内存实现存储的数据库,相较于磁盘存储的MySQL,省去了IO磁盘消耗,提高系统性能。
二.高效的数据结构

三.合理的数据编码
String:如果存储数字的话,是用int类型的编码;如果存储非数字,小于等于39字节的字符串,是embstr;大于39个字节,则是raw编码。
List:如果列表的元素个数小于512个,列表每个元素的值都小于64字节(默认),使用ziplist编码,否则使用linkedlist编码
Hash:哈希类型元素个数小于512个,所有值小于64字节的话,使用ziplist编码,否则使用hashtable编码。
Set:如果集合中的元素都是整数且元素个数小于512个,使用intset编码,否则使用hashtable编码。
Zset:当有序集合的元素个数小于128个,每个元素的值小于64字节时,使用ziplist编码,否则使用skiplist(跳跃表)编码
四.合理的线程模型
1)单线程模型:避免了上下文切换
Redis是单线程的,其实是指Redis的网络IO和键值对读写是由一个线程来完成的。但Redis的其他功能,比如持久化、异步删除、集群数据同步等等,实际是由额外的线程执行的。
Redis的单线程模型,避免了CPU不必要的上下文切换和竞争锁的消耗。也正因为是单线程,如果某个命令执行过长(如hgetall命令),会造成阻塞。Redis是面向快速执行场景的内存数据库,所以要慎用如lrange和smembers、hgetall等命令。
2)I/O 多路复用
I/O :网络 I/O
多路 :多个网络连接
复用:复用同一个线程。
IO多路复用其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。

五.虚拟内存机制
暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。
参考文章:
Redis为什么这么快?
边栏推荐
- 程序员追求技术夯实基础学习路线建议
- Dialogue with Chen Ciliang: Nezha wants to popularize high-end products
- 从产品角度看 L2 应用:为什么说这是一个游乐场?
- mysql出现:ERROR 1524 (HY000): Plugin ‘123‘ is not loaded
- 阻塞 非阻塞 poll机制 异步
- Techches Transformer the join wisdom source the author cao, visual basic model study
- Unsafe的一些使用技巧
- 第2章-矩阵及其运算-矩阵创建(1)
- 3 injured in 'electrical accident' at Google data center
- 突破次元壁垒,让身边的玩偶手办在屏幕上动起来!
猜你喜欢

Weilai-software development engineer side record

谷歌数据中心发生“电力事故”造成 3 人受伤

runtime-core.esm-bundler.js?d2dd:218 Uncaught TypeError: formRef.value?.validate is not a function

Some tips for using Unsafe

bus事件总线 使用

owl.carousel海报卡片Slider轮播切换

【勇敢饭饭,不怕刷题之链表】链表反转的几种情况

「业务架构」介绍BPMN第二部分-泳道

EasyCVR级联时,修改下级平台名称将不同步至上级平台

组合模式:Swift 实现
随机推荐
3D旋转文本动画js特效
Network Security Note 6 - Digital Certificates and Public Key Infrastructure
Chapter 22 Source Code File REST API Reference (4)
【电商运营】你真的了解社交媒体营销(SMM)吗?
Kyligence 通过 SOC 2 Type II 审计,以可信赖的企业级产品服务全球客户
mysql出现:ERROR 1524 (HY000): Plugin ‘123‘ is not loaded
What is an abstract class
这些年我开源的几个小项目
Unsafe的一些使用技巧
Double.doubleToLongBits() method uses
C#List的使用以及Linq的使用
Mobile and PC compatible loading and toast message plugins
Three-phase 380V rectified voltage
OneFlow源码解析:算子指令在虚拟机中的执行
杭电多校-Loop-(不确定性贪心+线段树)
高阶组件使用
关于“码农”的一点自嘲解构
阻塞 非阻塞 poll机制 异步
bus event bus use
What is affecting MySQL performance?