当前位置: 首页 > news >正文

简单认识redis - 6 redis 存储速度快的原因

1基于内存存储

        缓存(内存)读写速度很快,相比于磁盘存储的Mysql 省去了磁盘I/O的次数。

2.高效的数据结构

 SDS动态字符串:

1.字符串长度处理:Redis获取字符串长度,时间复杂度为O(1),而C语言中,需要从头开始遍历,复杂度为O(n);


2.空间预分配:字符串修改越频繁的话,内存分配越频繁,就会消耗性能,而SDS修改和空间扩充,会额外分配未使用的空间,减少性能损耗。


3.惰性空间释放:SDS 缩短时,不是回收多余的内存空间,而是free记录下多余的空间,后续有变更,直接使用free中记录的空间,减少分配。


4.二进制安全:Redis可以存储一些二进制数据,在C语言中字符串遇到'\0'会结束,而 SDS中标志字符串结束的是len属性。


  字典:

Redis 作为 K-V 型内存数据库,所有的键值就是用字典来存储。字典就是哈希表,比如HashMap,通过key就可以直接获取到对应的value。而哈希表的特性,在O(1)时间复杂度就可以获得对应的值。

3.合理的数据编码

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(跳跃表)编码

4.合理的线程模型

I/O 多路复用

多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。

I/O :网络 I/O
多路 :多个网络连接
复用:复用同一个线程。


IO多路复用其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。

单线程模型

Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。也正因为是单线程,如果某个命令执行过长(如hgetall命令),会造成阻塞。Redis是面向快速执行场景的数据库。,所以要慎用如  smembers 和  lrange、hgetall等命令。


Redis 6.0 引入了多线程提速,它的执行命令操作内存的仍然是个单线程。

5.虚拟内存机制

Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

虚拟内存机制是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。这样就可以避免因为内存不足而造成访问速度下降的问题。

http://www.lryc.cn/news/456742.html

相关文章:

  • 【Qt Quick】状态:State 使用
  • ICE/TURN/STUN/Coturn服务器搭建
  • ctf.bugku-eval
  • Extreme Compression of Large Language Models via Additive Quantization阅读
  • 【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)
  • C++类成员变量的初始化
  • Golang 中的强大 TUI 库 ——tview
  • 电层相关 -- 支路板与线路板
  • leetcode 93.复原ip地址
  • AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案
  • UIP协议栈 TCP Server Client通信成功案例
  • Android Studio Koala Feature Drop 稳定版现已推出
  • 胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮
  • Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!
  • JavaSwitch控制流语句
  • PCL 3D-SIFT关键点检测(Z方向梯度约束
  • 肺结节分割与提取系统(基于传统图像处理方法)
  • ESP32 COAP 客户端观察者模式下,GET服务器的例程
  • 【Kubernetes】常见面试题汇总(五十七)
  • Java 设计模式 构建者模式
  • 建设企业网站如何建
  • C++ inline 的更进一步理解
  • 海康威视云台相机图像获取
  • 什么是词嵌入(Word Embedding)
  • LSTM时间序列模型实战——预测上证指数走势
  • 基于 STM32F407 的 SPI Flash下载算法
  • 力扣之1355.活动参与者
  • 数据资产治理:构建敏捷与安全的数据管理体系
  • Nodejs连接Mysql笔记
  • Canvas:AI协作的新维度