MQ
文章平均质量分 95
柏油
不负冬日春晓 不负青春韶华
展开
-
Redis 核心原理串讲(下),架构演进之高扩展
本文围绕「架构主线」来透视 Redis「高可靠」的核心原理,在正文开始之前,我们先思考几个问题: - 数据要如何切分,在扩缩容过程迁移量最小? - 分片元数据如何维护?中心化 or 去中心化? - 如何平滑的从单机版升级到 cluster 集群版原创 2023-01-31 22:23:53 · 356 阅读 · 0 评论 -
Redis 核心原理串讲(中),架构演进之高可用
本文围绕「架构主线」来透视 Redis「高可靠」的核心原理,在正文开始之前,我们先思考几个问题:- Redis 数据丢失风险?- 持久化机制会拖慢 Redis 吗? - fork 子进程是否会阻塞主线程?不用 fork 操作行不行? - 有了持久化还需要副本机制? - 能不能自己写个 HA 来代替 Redis 哨兵?原创 2023-01-09 07:15:00 · 370 阅读 · 0 评论 -
Redis 核心原理串讲(上),从一条请求透视高性能的本质
本文围绕「请求主线」透视 Redis 高性能的核心原理,在正文开始之前我们先思考几个问题:- Redis 为什么节省内存又高效?- 同步/异步、阻塞/非阻塞有什么区别?- 删除一个百万级数据的 hash 字典会阻塞吗?- Redis6.0 的多线程需要考虑并发问题吗?原创 2022-12-26 22:39:35 · 409 阅读 · 0 评论 -
Redis 源码该怎么读?(译文)
当你阅读 `README` 文档时,不管是通过 GitHub 页面上还是下载 Redis 分支源码等方式,离源码仅一步之遥,因此,我们在这里对 Redis 源码做粗略讲解,你会看到:翻译 2022-11-20 16:45:59 · 460 阅读 · 0 评论 -
redis 过期删除策略、惰性删除(lazy-free),深入剖析
如果一个键过期了,什么时候会被删除呢?又如何找出这些过期 key 并删除?会不会影响服务正常运行?redis 中有两种 key,一种带有 expire 过期时间,另一种则是不带过期时间,本文讨论的过期删除策略是针对带有 expire 过期时间的 key。为了方便找出带过期时间并且已经过期的 key,redis 用了额外的字典专门存储带 expire 过期时间的 key,这样一来,只需遍历该字典即可找出过期的 key。原创 2022-10-11 07:15:00 · 3938 阅读 · 2 评论 -
redis 事务,深入解读
事务,古老而神秘的词汇,说起它,你应该能想起它的四大特性:原子性、隔离性、持久性和一致性。我们先往简单了想,事务解决了什么问题?确保一揽子修改操作的 `正确性` 和 `一致性`。事务需要做什么?本质是做了两件事,`控制并发` 和 `故障恢复`。redis 也提供了事务功能,不过,基于 redis 的一些特性,会在传统事务特性上做了一些宽松处理,也就是说,redis 的事务并非传统意义上的 “严格型事务”。我们先来回忆下,事务的的四大特性及其概念:`原子性`:一批操作要么一起成功,要么一起原创 2022-08-22 07:15:00 · 410 阅读 · 0 评论 -
redis 管道(pipeline),深入解读
管道,你肯定不陌生,你家里的自来水管、天然气管等,应用相当广泛。这些管道有啥特点?传输特定的物质、流式,.... 等等。我们知道,redis 是 C/S 模式,即客户端 + 服务端。当两端想要通信时,需要先建立特定的 TCP 握手连接,在进行通信时,采用 发送请求 -> 等待响应 这种`一问一答`模式。当然,这种一问一答模式在 redis 中应用非常广泛,可以说,绝大部分都是这种场景。但是,还是会存在一些特殊的场景,这个时候,我们可能更需要通过`批量`的方式来处理。比如,在一个接口或者某个操作中原创 2022-08-15 18:00:00 · 3778 阅读 · 2 评论 -
redis cluster 集群,终极方案?
前面系列文章,我们聊了 redis 主从模式、哨兵模式,这些都是单节点的高可用保障,受限于单机内存,另外,由于 redis 持久化的特性,单个 redis 实例的内存不宜过大。分布式存储的终极解决方案是什么?`加机器`。一台不够加两台、三台,直到足够撑起你的业务。因此,redis 也提出了集群版的解决方案。本质来说就是将数据尽可能`均分`到多个节点服务,这些节点可以同时对外提供服务,这样一来,集群模式既提高了整体存储容量,又提高了整体吞吐量。那这些数据如何进行切片分配呢?按关键字区间还是 关键字原创 2022-07-28 08:10:20 · 330 阅读 · 0 评论 -
redis 哨兵,高可用的执行者
哨兵是啥?站岗、放哨、巡逻之人,这种模式在生活中也十分常见,军队、安保、押运等等,都需要时刻注意周边异样,并及时作出响应。redis 哨兵也是如此。前面文章我们分析了 redis 副本机制,本质就是多个数据副本,为防止单副本故障而生。在 redis 服务遇到故障崩溃时,我们可以通过切换副本节点对外提供服务,你可以写一些脚本,做到一键切换,十分方便;前提是,需要人为判断是否需要故障切换,在工作时间遇到可能还能忍受,要是凌晨两三点呢?所以,我们可以选择更加智能一些,比如,你想继续写一个自动检测故障的原创 2022-07-20 22:39:01 · 1127 阅读 · 0 评论 -
redis 副本机制 - 高可用的保障?
前面的系列文章我们聊了 redis 持久化机制,尽可能的保障少丢数据。那么,如何保障服务的高可用呢?相信你也想到了,`副本机制`。副本,也就是我们常说的主从模式,从节点通过全量或增量的方式从主节点同步数据。一般情况下,从节点可以作为只读节点对外提供服务,也可以仅作为主节点的备份节点;当主节点故障挂掉之后,提升从节点为主节点,并对外提供无间断服务。本文主要探讨,redis 副本数据同步的过程以及相关原理介绍,至于如何做到主节点故障后,从节点自动切换为主节点?我们将通过后面的文章在进行分析。...原创 2022-07-11 22:39:32 · 1112 阅读 · 0 评论 -
redis 持久化原理,原理 + 应用
前言本文参考源码版本为 redis6.2我们先来看看演进这个事儿。软件都是迭代中越做越复杂。redis 也是这样,刚开始做了一个简单功能,通过一定的数据结构组织数据,让你能够相当快的拿到这些数据;慢慢地,场景越来越多,想要的功能支持越来越强烈;好,redis 慢慢给你实现。以上,是功能上的迭代演进,性能上呢?首先,我要处理客户端的请求,按照服务端 socket 编程几个步子写,相当容易;写好之后,你说不行,QPS 至少 1W+;于是,继续.........原创 2022-06-30 22:46:03 · 1266 阅读 · 0 评论 -
redis 6.0之多线程,深入解读
前言一般来说,一个 redis 请求有两大模块,网络模块 + 命令处理模块。我们常说的 redis 单线程模型,其实主要就是值的一个正常请求涉及的网络模块和命令处理模块。当然,两者都有可能出现问题,我们分别来看看:当一个执行一个特别慢的命令时,比如删除一个百万级的字典,可能会造成暂时的卡.原创 2022-05-31 21:31:53 · 12938 阅读 · 13 评论 -
Redis 6.0之前真的是单个线程吗?面试官:看来你只会背面试题
我们常说 redis 是`单线程模型`,一般是指正常的`请求处理` + `周期任务`。其中:- 处理请求包括:包括接收连接、IO监听/读/写以及命令执行。- 周期任务,如删除过期key、字典 rehash 等。其实,还有一些非常耗时的操作,redis 通过专用的线程来处理,这里的`专用线程`,便是我们这篇文章的主角,我们接着往下看~原创 2022-05-23 08:00:00 · 709 阅读 · 2 评论 -
Redis事件驱动框架(下),时间事件&文件事件详解
redis 服务器是典型的事件驱动程序,而事件又分为`文件事件`(socket 的可读/可写事件)与`时间事件`(定时任务)两大类。无论是文件事件还是时间事件都封装在结构体 `aeEventLoop`中。原创 2022-05-15 20:41:56 · 854 阅读 · 3 评论 -
redis scan 命令底层原理(为什么会重复扫描?)
`迭代器`——可在容器(容器可为字典、链表等数据结构)上遍访的接口,设计人员无须关心容器的内容,调用迭代器固定的接口就可遍历数据,在很多高级语言中都有实现。字典迭代器主要用于迭代字典这个数据结构中的数据,既然是迭代字典中的数据,必然会出现一个问题,迭代过程中,如果发生了`数据增删`,则可能导致字典触发 `rehash` 操作,或迭代开始时字典正在进行 rehash 操作,从而导致一条数据可能`多次遍历`到。原创 2022-04-12 09:54:01 · 3401 阅读 · 1 评论 -
redis 字典(dict)深入分析(抓住两个核心要点)
字典又称散列表,是用来存储键值(key-value)对的一种数据结构,在很多高级语言中都有实现,如 PHP 的数组。但是 C 语言没有这种数据结构,Redis 是 K-V 型数据库,整个数据库是用字典来存储的,对 Redis 数据库进行任何增、删、改、查操作,实际就是对字典中的数据进行增、删、改、查操作。原创 2022-04-06 08:23:26 · 2415 阅读 · 2 评论 -
redis之SDS字符串,到底高效在哪里?(全面分析)
Redis 只会使用 C 字符串作为字面量,在大多数情况下,Redis 使用SDS(`Simple Dynamic String,简单动态字符串`)作为字符串表示。SDS 的出现是为了解决 C 字符串在 Redis `三高` 场景下的不足,分别有 `安全性`、`效率`以及`功能`等方面。原创 2022-03-27 19:00:33 · 2400 阅读 · 0 评论 -
redis之intset整数集合,还是内存优化?
整数集合(intset)是一个`有序的`、`存储整型`数据的结构。我们知道 redis 是一个内存数据库,所以必须考虑如何能够高效地利用内存。当 redis 集合类型的元素都是整数并且都处在64位有符号整数范围之内时,使用该结构体存储。原创 2022-03-21 20:45:00 · 743 阅读 · 0 评论 -
redis zskiplist跳表,性能堪比红黑树?(深度分析)
`跳表`(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持`平均O(logN)`、`最坏O(N)`复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和`平衡树`相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。原创 2022-03-14 21:51:31 · 2749 阅读 · 0 评论 -
redis消息队列,你还不敢用?
消息队列要能支持组件通信消息的快速读写,而 Redis 作为一款常用的缓存组件,本身支持数据的高速访问,正好可以满足消息队列的读写性能需求。不过,除了性能,消息队列还有其他的要求,所以,很多人都很关心一个问题:“Redis 适合做消息队列吗?”其实,这个问题的背后,隐含着两方面的核心问题:- 消息队列适用场景?有哪些设计要点?- Redis 如何实现消息队列的需求?原创 2022-02-19 18:32:42 · 1585 阅读 · 0 评论 -
如何使用Redis实现分布式锁?
文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warn...原创 2021-06-26 22:59:00 · 1666 阅读 · 1 评论 -
Redisson解决Redis分布式锁提前释放问题
项目场景:提示:这里简述项目相关背景:例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)问题描述:提示:这里描述项目中遇到的问题:例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据APP 中接收数据代码:@Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DATA, bytes,原创 2021-06-19 16:28:58 · 3650 阅读 · 3 评论 -
spring-Kafka之@KafkaListener深入解读
本文主要通过深入了解源码,梳理从spring启动到真正监听kafka消息的这套流程原创 2021-05-12 00:24:20 · 9599 阅读 · 3 评论 -
spring-kafka之@KafkaListener单条或批量处理消息
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言消息监听容器1、KafkaMessageListenerContainer2、ConcurrentMessageListenerContainer@KafkaListener底层监听原理1.引入库2.读入数据生产配置1、单条消息处理2、批量处理3、同一个消费组支持单条和批量处理场景:Spring Boot 自动加载kafka相关配置只对部分topic做批量消费处理总结前言提示:这里可以添加本文要记录的大概内容:例如:随着原创 2021-05-09 23:18:04 · 4874 阅读 · 0 评论 -
Kafka请求处理流程
一起来探索 kafka是如何进行高效的保存队列中的请求,来确保Broker的高性能处理总体流程图主要涉及几个关键组件:SocketServer、Acceptor、Processor、RequestChannel、KafkaRequestHandler、KafkaApisSocketServer此组件是 Kafka 网络通信层中最重要的子模块。它下辖的 Acceptor 线程、Processor 线程和 RequestChannel 等对象,都是实施网络通信的重要组成部分Acceptor 线程类原创 2020-08-11 22:11:41 · 744 阅读 · 0 评论