Redis进阶(一)

通过简单的KV数据库理解Redis

Redis进阶(一)

分为访问模块,操作模块,索引模块,存储模块

底层数据结构

Redis进阶(一)

除了String类型,其他类型都是一个键对应一个集合,键值对的存储结构采用哈希表

Redis进阶(一)

哈希表由多个哈希桶组成,桶中存储entry元素,存储key和value的地址

但是当hash冲突元素过多会导致查询效率变慢,所以引入 rehash操作

采用两个全局hash表,但是从一个哈希表复制到另一个哈希表肯定会造成线程阻塞,所以使用 渐进式哈希:分摊到多次拷贝

接受第一次请求就拷贝第一个索引的entry元素,下一次再拷贝第二个,以此类推

对于集合类型的底层数据结构:双向链表,压缩列表,哈希表,跳表,整数数组

压缩列表:

Redis进阶(一)

跳表:

增加多级索引,通过索引位置的跳转,快速找到元素 (时间复杂度为logn)

不同操作所对应的时间复杂度也不同

对于单个元素的操作一般为O(1)

范围操作一般为O(n),一般使用scan来代替

统计操作,因为底层的数据结构中有元素个数的统计,所以时间复杂度为O(1)

为什么快

单线程(多路复用)不会阻塞在一个客户端的请求连接上,因为在请求过程中有可能会因为监听到有连接请求但是迟迟没有建立起连接或者建立起连接数据一直没有到达都会发生阻塞,所以采用多路复用非阻塞结构,允许在内核中存在多个监听套接字和已连接套接字,采用事件回调机制,当有事件到来,进入一个队列,redis处理队列中的请求,针对每个事件都有相应的 回调函数

在内存中操作数据

高效的底层数据结构

持久手段

AOF(记录操作命令,所以恢复时还要执行,速度慢)

mysql数据库是写前日志,redis是写后日志,所以不会阻塞当前的写操作

但是有两个风险:1.redis宕机,有丢失一段时间内数据的可能 2.因为在主线程中进行aof操作,有可能会阻塞下一个操作

但是随着时间的推移,aof文件越来越大怎么办,数据恢复效率肯定会降低?

引入aof重写

多变一,把多条对同一个键的旧操作合并成最新的一条操作

但是aof重写会阻塞主线程吗?

不会的,和aof追加写入不一样,采用的不是主线程,是由主线程fork出的子线程bgrewriteaof线程重写,子线程里也有父线程的内存的最新数据(共享页表)

在重写过程中,客户端的操作也会由主线程写入当前aof的缓冲区和重写aof的缓冲区,保证宕机也是数据齐全的,重写之后数据也是最新的

Redis进阶(一)

RDB(内存快照)

把某一时刻的状态记录到磁盘上

两个命令生成RDB:1. save,使用主线程,会阻塞主线程 2. bgsave,使用子线程,避免了阻塞问题( 但是主线程只可读,不可写

那么在记录到磁盘的时间段内,怎么保证数据不被修改?

使用bgsave+写时复制:主线程修改处于RDB中的数据时,需要生成一个副本,子进程把副本数据写进RDB文件

虽然RDB恢复速度快,但是进行持久化的时间间隔却不好把控,所以Redis4.0推出AOF和RDB结合的方法:在两次RDB持久化期间,期间发生的改动由AOF记录,这样恢复数据即快,又避免了频繁fork子线程对主线程的阻塞。

高可用

主从

主从同步过程

第一步:从库发送同步命令,包括主库ID和复制进度offset

第二步:主库生成RDB文件,发送RDB文件,全量复制,发送包含两个参数:主库ID和复制进度offset

第三步:主库把第二步过程中收到的命令发送到从库

那么当从库增多,主库fork子线程生产RDB的压力必然会增大,所以采用主-从-从架构,进行从库之间的级联,取一些从库帮主库分担压力

Redis进阶(一)

那么网络断了怎么办?

redis2.8之前是再进行一次全量复制

之后是进行增量复制

在redis中存在一个 环形缓冲区,记录主库写的进度和从库复制的进度,由两个参数确定,master-repl-offset和slave-repl-offset

网络断开再重连之后,从库根据offset位置进行增量复制就好

但是如果从库复制进度赶不上主库写的进度,缓冲区就会被覆盖,就会触发从库的全量复制,所以一般增大缓冲区为2倍

Original: https://www.cnblogs.com/zz01/p/16558850.html
Author: 山野村夫01
Title: Redis进阶(一)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621420/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python pywin32学习笔记

    参考博客链接 参考博客链接 pyhandle windows窗体句柄,int 类型  className 窗体类名  text 窗体标题 窗体置顶  窗体最大化 通过父pyhand…

    数据库 2023年6月11日
    077
  • 前端常用函数封装

    常用函数封装 获取某日期若干个工作日后的日期 * 参数: * time: [String] 给&#x5B9…

    数据库 2023年6月11日
    082
  • Java集合详解

    Java集合 集合体系 Collection接口 Collection接口没有直接的实现子类,它的子接口list(有序容器,可以重复)和set(无序容器,不可重复)是两个重要的子接…

    数据库 2023年6月16日
    085
  • Simple SNMP with SimpleSnmp

    Apparently not everybody is as interested in the background workings of the SNMP protocol …

    数据库 2023年6月11日
    084
  • 将博客搬至CSDN

    将博客搬至CSDN posted @2021-11-11 15:01 深海云帆 阅读(20 ) 评论() 编辑 Original: https://www.cnblogs.com/…

    数据库 2023年6月9日
    083
  • 配置nginx只打印延迟超过0.1s和非2XX的accesslog

    背景 当业务accesslog全开时,写入es的qps达到了10W,评估后觉得不太值得,所以考虑抽样打印。查看相关文档后发现目前我们使用的nginx版本不支持抽样打印,所以考虑其他…

    数据库 2023年6月9日
    073
  • Vue3新特性API

    一、vue3介绍 vue3.0是在2.0的基础上重大优化调整后的升级版本,其响应式原理已经在vue2框架基础中介绍过,此文章重点介绍Vue 3 中一些新功能API及其使用,文章内容…

    数据库 2023年6月14日
    084
  • histogram的类型详解

    采样点 每隔指定的时间会采集并上报一次数据,称为采样点。 请注意这里采集的是当前瞬间的数据 count 对采样点的 次数累计和(count) bucket 对采样点的 次数进行统计…

    数据库 2023年6月9日
    0154
  • mysql练习题emp,dept

    DROP DATABASE IF EXISTS emp; CREATE DATABASE emp; USE emp;  CREATE TABLE dept( &a…

    数据库 2023年6月9日
    0168
  • UniApp文件上传(SpringBoot+Minio)

    UniApp文件上传(SpringBoot+Minio) 一、Uni文件上传 (1)、文件上传的问题 UniApp文件上传文档 uni.uploadFile({ url: ‘htt…

    数据库 2023年6月6日
    082
  • 500 ZuulException: Forwarding error

    com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.ne…

    数据库 2023年6月16日
    078
  • python实现Mysql数据库批量新增数据

    一、批量插入数据的场景 二、插入数据的工具选择 三、选择Python进行批量插入 Python实现批量插入Mysql数据库数据 一、批量插入数据的场景 在进行数据压力时需要进行大数…

    数据库 2023年6月6日
    097
  • Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

    在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在Linux中,对 Asp.Net Core 的程序进行发布和部署。 有关如何在 Jexus …

    数据库 2023年6月11日
    097
  • java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端

    新增功能:培训学习模块, PDF电子课程、视频课程、直播课程(自己搭建直播流服务器) 人脸识别(考试时验证,有开关)、补考开关 组建试卷:创建试卷,题目、类型、总分、及格分数、时长…

    数据库 2023年6月6日
    081
  • Python_Pandas入门

    一、什么是Pandas? 博文转载: https://www.runoob.com/pandas/pandas-tutorial.html 基于NumPy的一种工具,该工具是为解决…

    数据库 2023年6月11日
    0173
  • SQL语句实战学习

    参考:https://zhuanlan.zhihu.com/p/38354000再次感谢作者的整理!! 1.数据已提前准备好了,已知有如下4张表:学生表:student 成绩表:s…

    数据库 2023年5月24日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球