自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Redis原理:rename命令

将一个key重命名为新key,如果key不存在,则会返回异常。如果newKey已经存在,则会被覆盖,其实newKey会被显示的删除,所以如果newKey是一个大key,则会引起延迟。

2025-04-01 21:05:19 507

原创 Redis原理:set命令

在前面的章节也有提到过,这里会处理的内容:过期时间的设置,key的value设置、内存的占用计算等。set 命令主要用来设置key的值,可以增加一些选项,如过期时间,nx/xx/ex/px等。来看下相应的源码,setcommand 内部也会调用setGenericCommand。在上节中,说到setnx已经被废弃,建议使用set中指定nx参数,该函数主要解析以下几个参数:标识、过期时间单位、过期时间。

2025-03-29 10:30:22 634

原创 Redis原理:setnx

Setkeyvalueifkey. WhenkeySETNXifot eists".中文:如果key不存在,则创建key,并设置相应的值。

2025-03-27 18:32:40 437

原创 Redis原理:watch命令

在前面的中有提到,在multi 前可以通过watch 来观察哪些key,被观察的这些key,会被redis服务器监控,涉及该key被修改时,则在exec 命令执行过程中会被识别出来,exec 就不会再执行命令。

2025-03-26 12:15:10 730

原创 Redis原理:multi&exec命令

在Redis中,MULTI和EXEC命令提供了一种机制来确保一系列命令以原子性的方式被执行。这意味着一旦这些命令被组合在一起并发送到服务器端,它们将作为一个整体被处理:要么全部成功执行,要么完全不执行。这一特性对于需要保证数据一致性的应用场景非常有用。具体来说,当你向Redis客户端发送MULTI命令时,标志着开始一个事务块。从这时起,直到发出EXEC为止,所有发往该Redis连接的命令都不会立即执行,而是被暂时缓存起来。只有当EXEC。

2025-03-25 19:11:30 610

原创 Redis原理:Monitor 实现

在调用 Redis 的MONITOR命令后,可以在对应的客户端上实时查看服务器的执行情况。今天,我们将从源码的角度来深入探讨MONITOR机制是如何处理这些请求以及如何将数据反馈给用户的。MONITOR。

2025-03-24 19:43:45 590

原创 Redis原理:为什么要rehash

Redis的rehash 是为了解决hash冲突带来的性能问题,将原来紧凑的数据分布,进行松散分布,可以使key的查找尽可能达到O(1)

2025-03-23 14:43:28 661

原创 Redis原理: List BRPOP分析

以上的代码逻辑是当处理的key数组中,只要有一个key对应的列表有值(如 list1 list2 list3,list1 没有列表,list2 与list3 有值,则只会返回 list2对应的值),则会直接返回对应的数据,如果对应的key不是list类型,则会返回异常,这里的逻辑比较好理解,再来看下当没有数据时的处理逻辑,会继续往下调用 blockForKeys.所以这里其实对于客户端在发起 BLPOP命令时,如果没有数据,是直接返回的,来看下客户端调用的情况,以jedis为例。

2025-03-22 08:31:16 510

原创 Redis 大key删除方式

在前面的文章 Redis删除大key时为什么会阻塞中,有说到,不应该直接调用 del 命令删除key,容易造成请求被阻塞,那应该如何来处理呢?这次从代码编写的角度来举例说明下。在Redis中,有几个比较特殊的结构String,List、Hash、Set、ZSet, 从Redis删除大key时为什么会阻塞中文章可以知道,不能直接del (除了string),而应该使用 scan的方式,而每一个类型也都有自己的scan 方式。接下来以 Java Jedis 为例。

2025-03-21 21:59:36 413

原创 Redis原理:发布与订阅

在日常开发中,其实有较多的很成熟的消息队列中间件,如RocketMQ、RabbitMQ、Kafka等,其实Redis的发布/订阅机制,也是一种简单的消息队列机制。今天来分析下redis是如何实现的?到这里,Redis的发布/订阅源码就分析完了,redis内部其实是用一个hash表来维护客户端与channel、channel与客户端的列表关系,具体可以查看前面的文章来了解结构。

2025-03-20 12:00:21 659

原创 Redis 原理: key 过期

redis key设置了过期时间后,redis会通过两种方式来删除相应的key通过周期性任务来删除当访问redis key时也会检查相应的key的过期时间认识了server.hz 的作用,可以配置redis服务器中serverCron函数的执行频率。

2025-03-19 12:02:03 580

原创 Redis 原理: 大key为什么阻塞

因为每种类型的底层对应的存储方式不同,但一定是要对于每个元素进行释放,所以需要进行遍历,如果是同步的情况下,且删除的key对应的value是一个元素很多的值,称为大key,那么在删除时,就有可能这个del动作就会阻塞,导致redis的其他的客户端连接等待。在Redis的删除中,通常调用del 语法来执行Key的删除,但如果是大key,那有可能会阻塞线程,导致其他的连接也会受影响,那为什么呢?今天我们先从源码分析下删除的逻辑是怎么样的?不管是同步删除还是异步删除,最终都是调用以下的方法。

2025-03-18 12:17:02 557

原创 Redis提升 : Scan原理

在scan中的算法,在rehash过程中,使用高位加1的方式,可以比较好的处理扩容或是缩容后,对应位置的数据处理scan的流程中的过滤是在获取了指定的数量的数据后,再进行过滤的,所以指定数量,实际不一定会返回相应的数据量scan 时间复杂度也是 O(N),但它是进行多次迭代,通过count来控制,不会长时间的阻塞线程。

2025-03-17 12:05:18 850

原创 深入理解,Redis : 熟悉存储结构

以上简单介绍了在redis中涉及到的几个数据结构和每个数据结构的字段的意义,从中也了解了redis是如何存储一个key-value的,对于每种类型的数据存储,后面会再进行详细的介绍。

2025-03-16 09:40:23 966

原创 Redis数据结构之SDS

c语言的字符串是二进制不安全,对于图片、视频等二进制不能存储获取字符串长度,对于c语言的char数组,需要遍历整个数组,直到遇到'\0'为止,时间复杂度为O(n)那redis如何做来优化这两个问题的呢?在3.2 之前的sds结构是如下从这里可以看到有一个len来记录数组的长度,也一个free来记录当前还剩余多少空间,这样对于获取长度,只要通过 len字段即可。

2025-03-15 09:05:17 1250

原创 Redis 数据结构之 zipList

如果 entry1的previous_entry_length 只有1个字节,当新插入的节点的长度大于254时,因为entry1的previous_entry_length无法存储该数值,就需要将entry1的previous_entry_length长度更新为5个字节。假设当前的entry1大小,再加上扩容后的4个字节,超过254时,则entry2的长度也要进行更新,则会一直更新下去,删除操作也是相同的问题。记录当前ziplist结构的所有字节数,包含zlbytes的4个字节。

2025-03-14 12:09:53 739

原创 Redis不同部署方式的连接

Redis 可以支持多种部署方式,今天来看下不同的部署方式下,要如何使用jedis来进行连接。为什么使用Jedis 呢,因为它足够老(但易用性不一定是最高的)!连接组件统一使用jedis。

2025-03-13 12:09:10 996

原创 Redis的启动分析

Redis 的通过IO多路复用来处理客户端连接,io多路复用通过一个线程来监听文件描述符的状态,当有连接进来时,这个文件描述的状态会变成可读或是可写。获取到redisCommand对象后,后面再进行调用 call。分析的内容主要在server.c 文件。最终将缓存区的数据响应给客户端。最后,以下面的一张图来总结。

2025-03-11 12:27:37 557 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除