Redis关键知识点总结

news2025/2/24 17:03:52

Reference: http://redis.cn

用处

  1. 缓存

  1. 数据库

  1. 分布式锁(Redission的redlock,自定义的lock等)

  1. 过滤器(布隆过滤器/增强的带计数的布隆过滤器/布谷鸟过滤器等)

  1. 大规模的计算辅助(bitmap)

  1. 消息订阅/监听 --> 例如分布式的websocket发送消息时可用Redis消息订阅/监听将消息发到所有实例上进行推送

  1. 延时队列 --> 例如email发送服务中同一个email client的多封邮件发送需要一定间隔

Redis介绍及NIO原理

  1. Redis是二进制安全的,在IO时都为字节流形式。

  1. Redis单线程但能支持高并发的原因:多路复用。多路复用通常有epoll,select,poll等方案,默认为epoll。

  1. epoll能大大增加处理效率原因:用户态和内核态之间提供了一个共享空间,主要有两个数据结构,一个红黑树与一个双向链表。在新的fd(file description/文件描述符)请求进来时,会增添进红黑树,处理完成后进入链表。因此在用户态与内核态通信时无需进行fd的复制,且红黑树查询效率高,用户态只需扫描链表中是否还有数据而不用扫描整个fd list。

  1. Reference: Redis IO多路复用技术以及epoll实现原理_觉悟不晚的程序员的博客-CSDN博客_epoll

Redis的类型

  1. 共5种类型:string,list,hash,set,sorted list

  1. type命令能根据key获得值的类型,而object encoding命令可获得redis在内部表示形式的类型。例如string类型会让部分数字value的encoding类型改为int以优化计算效率。

  1. bitmap是string类型中的一种非常适合做大数据处理的数据结构,例如做签到统计、登陆天数计算、大量号码去重等。主要思想是利用每一个二进制位的0/1标志及每一位的index实现用最小空间小号完成统计。

  1. 可在redis client中使用 help @<数据类型> 命令查看对应的所有方法。例如 help @list

  1. list类型数据结构为双向链表,有正向索引与反向索引。因此可从左右两边push/pop数据以实现FIFO/FILO;能够进行阻塞pop操作,当没有数据出现时阻塞x秒或一直阻塞下去。

  1. sorted set的存储方式是跳跃表(skip list),类似于平衡二叉树,每层节点以双向链表关联,能达到平均CRUD耗时最少。增加元素时的层数为随机造层得到。

Redis的消息订阅与事务

  1. 消息订阅的监听方知能收到监听之后过来的消息,之前publish的消息都不会收到。

  1. Redis不支持事物回滚,因为只有当命令错误时才会失败。为了性能考虑,事务失败不回滚而是继续执行余下命令。

Redis过滤器

  1. Redis缓存过滤器为解决缓存穿透问题而生。基础思想是:把系统中已有的数据通过多个映射函数计算出几个值并向bitmap中标记,在请求时使用相同算法去砸后bitmap对应结果的位置。如果都为1则能获得“此数据可能存在”的结论,可以继续向下寻找;如果有一个为0则获得“数据必不存在”的结论。

  1. 布隆过滤器优缺点:

  1. 优点:占用空间少,使用较简单

  1. 缺点:随着数据增加,误判率增加;不能从布隆过滤器中删除元素

  1. 增强版计数器布隆过滤器(Counting Bloom Filter)能解决不能删除过滤器中元素的问题。它使用了更多空间记录了每一个位的计数,删除时所有对应位数字减一。消耗空间增加但能实现精准删除。

  1. 布谷鸟过滤器:每个元素通过算法得到一组对偶节点,存元素指纹进入其中随机一个空节点。如果都不为空则随机挤走一个,被挤走的重复计算-->挤走操作直到成功进入节点。重复过程有次数阈值限制,达到阈值则自动扩容,所有元素重新计算。布谷鸟过滤器可实现删除,但不同数据在同一节点的指纹有小概率重复,因此删除操作有误删可能。

  1. 增强的布谷鸟过滤器:每个节点能存的指纹席位扩大到4个(类似hashmap中数组链表)

  1. Reference: Redis布隆过滤器和布谷鸟过滤器_JavaShark的博客-CSDN博客_布谷鸟过滤器

Redis解决内存空间不足的多种方案

  1. 新加数据直接报错;

  1. LRU(Least Recently Used)算法清除最久没有碰的数据 (它又拆分位两种细化方案:从所有的数据中找/只从设置了ttl的数据中找);

  1. LFU(Least Frequently Used)算法清除碰到次数最少的数据(同上,它也拆分位两种细化方案:从所有的数据中找/只从设置了ttl的数据中找);

  1. 清除即将过期的数据;

  1. 随机清除数据释放空间。

Redis key的过期判定

  1. 如果key设置了ttl,不会随着访问延长ttl,但如果发生对此key的写操作,则改为无过期时间;

  1. 过期时间判定有两种:

  1. 当访问时被动判定,若过期则清除;

  1. 主动周期轮询的过期检测。Redis每10秒随机抽取20个keys进行过期检测并删除所有已过期key,若>25%的key过期,再取20个重复操作直到不满足25%。(这是一个平凡的概率算法,意味着在任何给定时刻,最多会清除25%的过期key)。

Redis持久化

  1. 两种方式,RDB与AOF。在4.0版本之后AOF中包含RDB,为RDB+增量的AOF写操作记录。

  1. 两种方式能同时开启,如果同时开启则使用AOF恢复。

  1. RDB数据恢复速度较快但易丢更多数据,AOF体量岁时间增多变大,数据恢复慢但能丢失更少数据。

  1. RDB:通过SAVE或BGSAVE命令(BGSAVE不阻塞)。使用rdbsave和Linux的fork()方法,底层是copy-on-write导致速度快:创建子进程持久化数据,父子进程公用同一份无力存储空间,只有当数据发生改变时,改变的那个内存页会复制一份,让父子中数据出现差别,因此额外空间开销小。具有时点性,RDB进程创建那一刻的样子就是最后复制出来的样子。后续的数据改变会存入复制缓冲区中。

  1. AOF将redis的写操作存入文件中,保存的是可读的写操作命令。每次达到一定存储量时自动使用BGREWRITEOF命令优化合并AOF命令。

  1. 在新版中支持RDB+AOF混合存储方式:老数据RDB生成二进制文件在AOF文件的开头,增量以指令形式Append到AOF文件。

Redis高可用系列

  1. 主从,哨兵和集群实现了redis高可用;

  1. Redis每台服务器都有一个唯一的runid来标识对应服务器;

  1. Offset记录了命令的偏移量。

  1. Redis有4类缓冲区增强高可用。

Redis主从

  1. 将主节点的数据复制到从Redis服务器。主要为了解决单台Redis读写压力大的问题,实现读写分离(主:读写;从:只读);并达到数据备份的目的。

  1. 第一次连接从服务器或从服务器断开后进行重链接都会进行主从复制,从服务器会记录主服务器的runid。

  1. 主从复制分为全量复制和增量复制。选择全量/增量复制的流程图如下

  1. 全量复制流程:

⚠️Tips: 主节点上会为每个从节点都维护一个复制缓冲区。在全量复制时,主节点在向从节点传输 RDB 文件的同时,会继续接收客户端发送的写命令请求,并保存在复制缓冲区中,等 RDB 文件传输完成后,再发送给从节点去执行。

  1. 增量复制流程:

⚠️Tips: 复制积压缓冲区是一个固定长度,先进先出的队列,默认 1MB。当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会发送给这个缓冲区。

Redis的四类缓冲区

  1. 客户端输入缓冲区:暂存客户端发送过来的请求数据;Redis 主线程再从输入缓冲区中读取命令进行处理。大量数据高速请求或执行耗时操作会导致生产速度大于消费速度,最终溢出。

  1. 客户端输出缓冲区:redis处理后的输出不会直接给客户端而是放进输出缓冲区,防止客户端消费慢阻塞redis。若服务端大量数据快速处理后返回导致消费速度大于客户端接受速度,导致溢出。可以通过`client-output-buffer-limit`参数来调整缓冲区大小。

  1. 复制缓冲区:主节点上会为每个从节点都维护一个复制缓冲区。在全量复制时,主节点在向从节点传输 RDB 文件的同时,会继续接收客户端发送的写命令请求,并保存在复制缓冲区中,等 RDB 文件传输完成后,再发送给从节点去执行。若从节点接收和加载 RDB 较慢,同时主节点接收到了大量的写命令则溢出,也可通过`client-output-buffer-limit`参数来调整缓冲区大小。

  1. 复制积压缓冲区:为增量主从复制服务。它是一个固定长度,先进先出的队列,默认 1MB。当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会发送给这个缓冲区。不会溢出。可通过`repl_backlog_size`参数调整大小。

Redis哨兵模式

TODO

Redis集群

TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyQt5入门学习(一)【小白入门系列】

PyQt5入门学习 介绍&#xff1a;PyQt5是Python较好的图形库&#xff0c;与C的Qt不同的是PyQt5封装得较为简单&#xff0c;上手也更加的方便。下面话不多说&#xff0c;开始学习PyQt5吧&#xff01; 安装过程 安装方法有两种&#xff0c;一种是下载PyQt5最新源码进行编译安装…

初识Kafka

1.1 定义 Kafka传统定义: Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 发布/订阅: 消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只…

[数据结构基础]二叉树——堆的概念、结构、接口函数及经典的Topk问题和堆排序问题

目录 一. 堆的概念及结构 1.1 堆的概念 1.2 堆的结构及在内存中的存储 二. 堆的主要接口函数 2.1 堆初始化函数HeapInit 2.2 堆销毁函数HeapDestroy 2.3 向堆中插入数据函数HeapPush&#xff08;以小堆为例&#xff09; 2.4 删除堆根节点数据函数HeapPop&#xff08;小…

C++ 夺冠!成为 TIOBE 2022 年度编程语言

目录&#xff1a;C夺冠—成为TIOBE2022年度编程语言一、前言二、C 摘得桂冠三、Top 10 编程语言 TIOBE 指数走势&#xff08;2002-2023&#xff09;四、历史排名&#xff08;1987-2023&#xff09;五、编程语言“名人榜”&#xff08;2003-2022&#xff09;六、说明一、前言 2…

vitepress(三):自动生成目录

上一节我们将自己的网站发布到了git pages上&#xff0c;但是现在我们需要每次更新一篇文章就重写一次目录&#xff0c;操作上十分的繁琐和不方便&#xff0c;所以我们需要一个方法去自动生成我们的侧边栏结构&#xff0c;方便我们每次只需要更新我们的项目即可。这里我们要知道…

【每日一题】【LeetCode】【第六天】【Python实现】加一

加一的解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 1这个很好理解&#xff0c;唯一的难点就是个位1导致的进位的问题&#xff0c;可能会只会导致十位1&#xff0c;也有像8999这样产生多次进位的情况。 为了解决进位问题&#xff0c;自己想到了第三天学…

mysql三表查询15个例子带你搞懂它

mysql三表查询30个经典案例创建三个表a、b、c表a中的数据表b中的数据表c中的数据1.查询出学习成绩70分以上的学生姓名与成绩与学科&#xff1b;2.查询姓名以mi结尾的学生姓名及其任课老师姓名&#xff1b;3.选修课名为math的学生学号与姓名;4.选修课号为C4的学生学号&#xff1…

QEMU调试Linux内核环境搭建

一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs&#xff0c;本文整理了其制作、安装过程&#xff0c;调试命令&#xff0c;以及如何添加共享磁盘。编译内核源码从 The Linux Kernel Archives 网站下载内核源码&#xff0c;本文下载的版本为4.14.191&#xff0c;4.14.…

危险程度(并查集)

有 nn 种化学物质&#xff0c;编号 1∼n1∼n。 其中&#xff0c;有 mm 对物质之间会发生反应。 现在&#xff0c;要将这些化学物质逐个倒入同一个试管之中&#xff0c;具体倒入顺序不限。 我们需要计算一下试管的危险值。 已知&#xff0c;空试管的危险值为 11&#xff0c;…

【UE4 第一人称射击游戏】21-添加动态扩散准心

素材资料地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg密码&#xff1a;jlhr上一篇&#xff1a;【UE4 第一人称射击游戏】20-添加瞄准十字线本篇效果&#xff1a;步骤&#xff1a;将资源移至FPS项目文件夹内移入后发现多了一个名为“WBCro…

【web安全】——报错注入

作者名&#xff1a;Demo不是emo主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

如何查看sqlite数据库的 .db文件中的表的内容数据

在使用 qt 的sqlite 数据的时候,对于创建的数据库的 .db 文件的内容的查看我们可以按照下面的步骤安装工具进行查看 下载所需的sqlite 查看工具 下载:链接&#xff1a;https://pan.baidu.com/s/1KSl9w61zaEyemhR1Ir04_A 提取码&#xff1a;6666 只需要解压即可,其中安装包内…

MINISForum HX90 主机风扇调教

今年秋天买了个1个HX90 5900H的mini主机。准系统版本&#xff0c;2899元。 但是买回来之后&#xff0c;发现它的风扇声音实在是大&#xff0c;稍微一加载点东西&#xff0c;就 开始呜呜的响&#xff0c;简直让人心烦 意乱。 去了官网查看。好多人的解决办法看了没看明白&…

【机器学习】PR曲线F1评分ROC曲线AUC

参考&#xff1a;《百面机器学习》 PR曲线 TP&#xff08; True Positive&#xff09;&#xff1a;真正例 FP&#xff08; False Positive&#xff09;&#xff1a;假正例 FN&#xff08;False Negative&#xff09;&#xff1a;假反例 TN&#xff08;True Negative&#xff0…

基于imx6ull配置开发环境

1. 交叉编译链背景&#xff1a;因为在原子的教程中有强调最新的Linaro gcc编译完uboot后无法运行的问题&#xff0c;所以原子采用4.9&#xff0c;那我们就沿用下。Linaro gcc有两个版本: gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-20…

linux反弹备忘录

如果你有幸在渗透测试中发现了命令执行漏洞&#xff0c;那么不久之后你可能需要一个交互式shell。如果无法添加新帐户/ SSH密钥/ .rhosts文件并登录&#xff0c;则下一步可能是拖回反向shell或将shell绑定到TCP端口。 本页讨论前者。创建反向 shell 的选项受到目标系统上安装的…

【阶段三】Python机器学习05篇:机器学习项目实战:逻辑回归模型

本篇的思维导图: 要对离散变量进行预测,则要使用分类模型。分类模型与回归模型的区别在于其预测的变量不是连续的,而是离散的一些类别,例如,最常见的二分类模型可以预测一个人是否会违约、客户是否会流失、肿瘤是良性还是恶性等。逻辑回归模型虽然名字中有“回归…

Neural-Pull曲面重建程序配置

前几天一篇曲面重建文章的审稿意见回来了&#xff0c;要求加近三年对比方法。在github上搜了一些项目&#xff0c;大部分的环境都很难配置成功。最后找了一个ICML2021年的点云重建项目[1]作为实验对比。 项目链接&#xff1a;mabaorui/NeuralPull-Pytorch 整体来说&#xff0…

SpringBoot 多种方式配置错误页面

参考资料 SpringBoot异常处理机制-BasicErrorController与ControllerAdviceJava开发从工作到原理–BasicErrorController统一异常处理【spring boot】spring boot 处理异常SpringBoot一个请求的处理全过程ControllerAdvice和ErrorPageRegistrar接口配置错误页面的问题SpringBo…

【Linux操作系统】自动化编译make和Makefile

文章目录一.make/makefile简介1.什么是make,makefile?2.为什么要有make/makefile?二.makefile文件规则1.基本规则2.举一个例子3.伪目标4.其他规则三.文件三个时间问题-make程序1.三个时间何时更新2.touch的两个作用3.make程序如何知道依赖文件是否更新?一.make/makefile简介…