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

Redis核心技术

Redis是什么

Redis是以键值对,kv的形式存储的NoSQL数据库。它支持多种数据类型,能进行多种操作,如get,put,delete,scan,它的键值对保存在内存,使用网络框架访问,单线程,使用哈希表来确定索引位置,put delete的时候会分配内存,释放内存,并且还有持久化功能。

为什么说Redis很快

Redis的网络IO通信和对数据的访问修改等操作都是单线程的,因此没有了线程的切换也就没有了锁。除此之外Redis的数据类型也是Redis快的一个原因。

Redis的数据类型

Redis有五种基本数据类型

基本数据类型底层实现
String简单字符串
List双向链表,压缩列表
Hash哈希表,压缩列表
Zset跳表,压缩列表
Set哈希表,整数数组

Redis的整体存储的结构是key-value类型的,value可以是五种基本数据类型的一种。使用的是数组和列表的形式,以Map类似。

需要注意的是在装载因子大于1的时候,Redis允许扩容,但是AOF重写或生成RDB时就不可以扩容,为了保证不污染AOF和RDB,但是装载因子大于5,立即扩容。在rehash时,如果没有新的请求,也会通过定时任务的方式进行rehash。

双向链表,压缩列表,整数数组可以做到O(n)的时间复杂度

哈希表可以做到O(1)的时间复杂度

跳表可以做到O(logn)的时间复杂度

因此我们在使用Redis时,如果没有必要情况,最好不要使用List数据类型,而是改用其他数据类型。

Redis网络IO

Redis网络IO使用的是IO多路复用的方法。为了避免网络波动对Redis的快会产生影响,它允许在监听多个套接字的时候,线程可以去做别的事情,如果之后监听到了套接字的操作,例如accept,read,write等操作,会返回响应给线程。线程会查看是否有响应,如果有响应就会执行响应的操作。

Redis是怎么保证数据可靠性的

Redis保证数据可靠性主要有两个方法,AOF和RDB,我们先来说说AOF。

AOF

AOF就是将执行的命令原封不动的存进日志里,与mysql数据库不同的是,AOF是先执行这个命令再写日志的。这是因为如果先执行写日志操作的话,程序还需要先检查命令是否正确,然后正确了的话再写。后执行写日志操作的话就可以免去检查命令的操作了,成功执行的命令就直接写入日志当中。但是如果一直写入的话AOF的文件就会变得太大,这就引出了我们接下来要思考的问题,AOF的重写。

AOF是怎样重写的

当AOF文件达到一定大小就会重写,比如set key value1,set key value2,set key value3,重写后就只需要一句set key value3就可以了。但是如果在原来的地方重写的话,就和原来的写日志操作冲突了,这势必就要加锁了。因此重写时会拷贝一份空间,并对新空间进行重写。如果这个时候要写日志,那么就会对两份日志同时写日志。如果重写完了,就会只对新的日志进行写操作了。

AOF的频率

写AOF的时候可以设置写日志的频率,有执行了一条数据就立即写入日志,每秒钟执行写入日志,操作系统判断什么时候写日志,这三种的数据可靠性是从高到低的。但是虽然写日志并不需要主线程去完成,但是还是需要调用fork方法来创造一个新的线程。如果频率过快,就会让Redis速度变慢,因此我们在选择时需要对可靠性和效率两者做一个取舍。

但是AOF数据恢复的话比较慢,因为它是要一条条执行命令的,因此RDB就登场了。

RDB

RDB使用快照操作来记录数据,也就是直接把数据的值记录下来,因此恢复的时候比AOF更快。RDB会用写时复制技术来节省内存,但是执行RDB操作时,总不可以每次都把所有数据都处理一遍吧,因此有了增量同步,也就是从上次同步的位置继续同步下去。但是要怎么知道这期间进行了什么改动呢,这也是需要记录的,所以就有了AOF和RDB混合模式

最高效的方法-AOF+RDB

AOF记录数据,然后由RDB在一段时间后进行增量同步,AOF就可以把这段数据删除了,就算Redis故障了,也可以先靠RDB恢复之前的数据,然后靠AOF恢复最近一段时间的数据。这又保证了数据的可靠性,也保证了数据的恢复速度,在Redis4.0之后就有了这种方法。

结语

这就是本章要讲的Redis的基本技术,下一章我会讲解Redis集群,哨兵等内容。

 往期内容


深入理解协议栈的内部结构——创建和连接

深入理解协议栈的内部结构——收发和断开


http://www.mrgr.cn/news/5453.html

相关文章:

  • “解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“
  • 【揭秘!】糖尿病能否自我逆转?科学解读,给你希望之光!
  • 如何像演示PPT幻灯片一样演示PDF文件 - PDF幻灯片使用说明
  • 类和对象(高级)
  • 一文了解检索增强生成(RAG)
  • Spark2.x 入门:DStream 输出操作
  • 4170条中医综合真题中医真题ACCESS\EXCEL数据库
  • Java List 结合删除元素的方法
  • 神经网络算法 - 一文搞懂GAN(生成对抗网络)
  • 2408gui,wtl给对话框加快捷键
  • Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例
  • 查看U盘的具体信息,分区表格式、实际容量和分区状态
  • 100个智能体实战技巧 | 如何让工作流也能处理图片
  • 中兴 5G CPE 3 Pro产品参数
  • Spring Cloud LoadBalancer 源码解析
  • 【UE5.1】NPC人工智能——05 给NPC添加视觉感知
  • 数采网关面临的安全挑战
  • 【3.1】贪心算法-解分发饼干
  • Windows Server查看W3SVC IIS服务器中对应的网站日志
  • centos 7.9 迁移到 openEuler22.03-LTS-SP3