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)

大家都在看

  • CSS样式

    css概述 层叠样式表(cascading style sheet) 层叠是指==将多个样式施加在一个元素(标签)上== 作用: 美化页面 将html代码与样式代码分离 好处: 功…

    数据库 2023年6月16日
    097
  • 【StoneDB故障诊断】数据库实例crash

    系统负载高 系统负载高导致了申请系统资源失败,最后数据库实例crash,常见原因及诊断方法详见系统资源瓶颈诊断。 数据页损坏 如果是硬件故障或者磁盘空间满了,向数据文件写入时,很容…

    数据库 2023年5月24日
    0125
  • Queue

    队列( Queue)是一种经常使用的集合。 Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表 Queue接口常用的实现类是 Linke…

    数据库 2023年6月9日
    095
  • LeetCode 21. 合并两个有序链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,…

    数据库 2023年6月11日
    0106
  • SpringBoot 搭建基于 MinIO 的高性能存储服务

    1.什么是MinIO MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应…

    数据库 2023年6月14日
    0158
  • 动手实验查看MySQL索引的B+树的高度

    一:文中几个概念 h:统称索引的高度;h1:主键索引的高度;h2:辅助索引的高度;k:非叶子节点扇区个数。 二:索引结构 叶节点实际上是一个双向链表,而叶节点中的行数据是一个单向链…

    数据库 2023年5月24日
    094
  • 2018年最新JAVA面试题总结之数据库(3)

    转自于:https://zhuanlan.zhihu.com/p/39804394 1、MySQL的delete与truncate区别? 回答:delete语句执行删除的过程是每次…

    数据库 2023年6月16日
    092
  • 十一章 配置文件参数化

    把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中 1. 小配置文件(.properties) 2. 好处 : 利于维护 1.配置文件参数化开发步骤 已数…

    数据库 2023年6月14日
    082
  • MySQL函数学习(一)—–字符串函数

    注:笔记旨在记录 一、MySQL 字符串函数 \ 函 数 名 称 作 用 完 成 1 LENGTH 计算字符串长度 勾 2 CONCAT 字符串拼接,返回结果为连接参数产生的字符串…

    数据库 2023年6月16日
    079
  • Atlassian Confluence 6.15.5 添加甘特图

    Atlassian Confluence 6.15.5 添加甘特图 Atlassian Confluence 编辑模式 工具栏 “+”→其它宏→视觉&amp…

    数据库 2023年6月9日
    089
  • 2022-8-16 mysql 第二天 约束

    重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。 构建数据库 创建一张student表: DROP TABLE IF EXIST…

    数据库 2023年5月24日
    074
  • leetcode 538. Convert BST to Greater Tree 把二叉搜索树转换为累加树(简单)

    一、题目大意 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node…

    数据库 2023年6月16日
    090
  • 3000帧动画图解MySQL为什么需要binlog、redo log和undo log

    全文建立在MySQL的存储引擎为InnoDB的基础上 先看一条SQL如何入库的: 这是一条很简单的更新SQL,从MySQL服务端接收到SQL到落盘,先后经过了MySQL Serve…

    数据库 2023年6月16日
    0124
  • Nginx基础入门篇(1)—优势及安装

    一、Nginx 的优势 1.1发展趋势: 2016年: 1.2、简介 Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMA…

    数据库 2023年6月14日
    079
  • SpringBoot邮件报警

    SpringBoot邮件报警 一、介绍 邮件报警,大体思路就是收集服务器发生的异常发送到邮箱,做到服务器出问题第一时间知道,当然要是不关注邮箱当我没说 (1)、引入依赖 <d…

    数据库 2023年6月6日
    0119
  • Figma 快捷键

    作用 WINDOWS MAC 窗口切换到Home Ctrl + 1 Cmd + 1 窗口切换到打开的第一个文件 Ctrl + 2 Cmd + 2 打开菜单搜索 Ctrl + / C…

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