avatar
文章
342
标签
52
分类
23

Home
Archives
Tags
Categories
List
  • Music
  • Movie
Link
About
Southblock'Blog
Home
Archives
Tags
Categories
List
  • Music
  • Movie
Link
About

Southblock'Blog

无题
发表于2026-09-15
在上一讲中,我们重点介绍了 quicklist 的核心结构,一起分析了 quicklist 里面关键的结构体定义以及关键的配置含义。本节我们将继续重点介绍 quicklist 的核心函数,主要包括:插入数据、弹出数据以及查询数据这三方面的函数实现。 创建 quicklist首先来看创建 quicklist 实例的 quicklistNew() 函数,可以用 CLoin 调用链的视图看一下它都调了哪些函数。 可以看到,quicklistNew() 函数先会调用 quicklistCreate() 创建一个空 quicklist 实例,里面就是走 malloc 分配内存,然后通过 quicklistSetCompressDeth() 和 quicklistSetFill() 函数来初始化 compress 和 fill 两个字段。 插入数据向 quicklist 插入一个元素的入口函数是 quicklistPush() 函数,其核心代码片段如下: 123456789void quicklistPush(quicklist *quicklist, void *value, const si ...
无题
发表于2026-09-15
在前面第 8 讲《 实战应用篇:Hash 命令详解与实战(上)》中我们已经讲解了哈希表的结构,就如下图所示,这个 HashMap 有 8 个槽位,每个槽位下面挂一个链表。我们这一节就来看看 Redis 里面哈希表是怎么实现的。 在 Redis 里面,Hash 表底层依赖的数据结构其实有两种:第一种是前面介绍的 ziplist,Redis 7.0 之后呢,就是 listpack,总之就是一块连续的内存空间;另一种是我们今天这一节要介绍的 dict 结构,它就是哈希表的结构。 在后面介绍 redisObject 对象的时候,我们还会展开说明哈希表底层什么时候用 listpack、什么时候用 dict,现在你只需要知道:哈希表底层数据少、键值对都比较短的时候用 listpack 存,数据量大了之后就用 dict 存。 dict & dictEntry在 Redis 里面,哈希表对应的是 dict 这个结构体,你看其他 Redis 文章的时候,说到的字典结构,其实就是这个结构体。 我们打开 dict.h 这个头文件,找到字典这个结构体的定义,如下所示: 123456struct di ...
无题
发表于2026-09-15
在前面几讲中,我们重点讲解了 ziplist 和 listpack 这两个结构,它们都是连续的内存空间,也是构成 Redis List 的关键结构之一。 Redis List 底层的另一个关键结构是 quicklist,本节我们就来重点分析 quicklist 的核心结构以及控制 quicklist 特性的关键配置,另外,还会介绍 quicklist 迭代器的设计思想和具体实现。 注意哦,本节介绍的 Redis 7.0 版本的 quicklist 实现,与 Redis 6 以及之前的主要差别就是底层把 ziplist 换成了 listpack。 quicklist 核心概述quicklist 是一个类似于 Java 里面 LinkedList 的双向链表,大概结构如下图所示: quicklist 里面的节点是 quicklistNode 类型,quicklistNode 里面维护了 next、prev 指针,指向前后两个 quicklistNode 节点;然后还有一个 entry 指针,指向了一个 listpack 实例。真正的元素是存储在这个 listpack 里面的,那就是说 ...
无题
发表于2026-09-15
作为“先导篇”的第一篇文章,本文主要是给不熟悉 Redis 的小伙伴,快速介绍一下 Redis 的相关概念和使用场景。 本文主要从三个方面来介绍(如下图所示):Redis 是什么、为什么使用 Redis 以及 Redis 与 Memcached 的对比。其中,第二、第三方面也是面试的重灾区,在不同等级的面试中,多多少少都会涉及到这两方面的问题。 Redis 是什么?先来说说 Redis 是什么东西吧,有的小伙伴可能是第一次接触 Redis。 一般我们看一个东西是什么的时候,都是去官网上看一下 Introduction, 那我们 Redis 官网(https://redis.io/)走起,如下截图: 毕竟官网的解释最标准而权威,所以我们就一起解读下官网对于 Redis 的介绍。 Redis 是一个开源的、内存的、有数据结构的存储,通常会被用作 DB、缓存、消息队列、流处理引擎。 Redis 提供了非常多的数据类型,比如,String、Hash、Set、List 等。Redis 还提供了主从复制、Lua 脚本、LRU 淘汰机制,以及持久化、哨兵 、Cluster。(小声说一句,这些 ...
无题
发表于2026-09-15
要想读懂 Redis 里面关键的代码实现,还是需要先有一点点 C 语言基础的,因此,本文我们就来做一个简单的 C 语言入门讲解,主要是介绍一下 C 字符串、结构体、指针以及数组这四方面的内容。这四方面内容会和 Java 对比着说,尽可能让熟悉 Java 的小伙伴做到零门槛。 当然,如果你非常熟悉 C 语言的话,可以直接跳过这一篇文章。 C 字符串首先来看 C 语言中的字符串。在 Java 里面,我们是如何创建一个字符串呢?直接 new 一个 String 对象,就行了。比如,下面就定义一个 s 字符串变量: 1String s = new String("Hello World"); new String() 是在堆里面分配一个 String 对象,s 这个变量存的就是这个 String 对象的地址,就和下面这张图一样: 如果你看过 Java String 的源码,会知道 String 底层是拿 char 数组(字符数组)实现的。我这里用的还是 JDK 8 的源码,JDK 9 的话,就已经变成 byte[] 数组(字节数组)了。 C 语言里面的字符串也是这么 ...
无题
发表于2026-09-15
介绍完 Redis 概述之后,本文我们就通过源码的方式,来安装一下 Redis 7.0。同时,也把阅读 Redis 的源码环境搭起来。 前面我们讲过 Redis 一般是部署在 Linux 系统上面,所以我们这里,就在 Mac 或者是在 Linux 上进行搭建,Windows 的话,就不太建议你去浪费时间搞这个了。 如果你手里只有 Windows 机器的话,也可以安一个虚拟机,在上面装一个 Linux,然后再去搭建 Redis 环境。后面我们可以用 IDE 远程连到这个虚拟机上进行 Debug,非常不建议你浪费时间在 Windows 上做 Redis 的编译或者是安装,没有啥太大意义。 说明:本小节的内容整体还是比较简单的,如果小伙伴不知道如何搭建 Redis 7 源码环境或者不知道怎么查看一个 Redis 7 新特性实现的话,可以跟着本小节一步步操作,我也是希望能尽量照顾到各个基础水平的小伙伴,做好铺垫,打好基础,在刚开始学习时有个平滑的学习曲线,这样咱们后续学习就能减少在基础知识上的磕磕绊绊,这也是我们“先导基础篇”的设置初衷。 当然,肯定有小伙伴基础水平很不错,已经完全掌握些细碎 ...
无题
发表于2026-09-15
在前面的文章中,我们了解了 Redis 的基本功能,通过源码方式安装了 Redis,并搭建了 Redis 的源码运行环境。接下来将进入 “Redis 的实战应用篇”,在这部分我们将重点介绍 Redis 核心命令的使用,主要包括 Redis 中 String、List、Set、Hash 以及 Sorted Set 五大核心数据结构的命令,同时还会分析这五大数据结构的使用场景。 本节作为 Redis 实战应用篇的第一篇,我们重点介绍 Redis 中 String 相关的命令以及应用场景。 redis-cli 基础使用在开始正式介绍 String 的相关命令之前,我们需要先了解一下本篇执行 Redis 命令的工具 —— redis-cli。它是 Redis 自带的命令行客户端,可以将命令发送到 Redis 服务端执行并接收命令执行结果。 在上一讲编译好的 Redis 的 src 目录下面,就可以看到 redis-cli 这个命令行客户端,如下图所示: 直接执行这个 redis-cli 命令,它就会默认连到前面启动的 Redis 服务上。要是连其他远程的 Redis 服务,我们可以用 -h ...
无题
发表于2026-09-15
这一节我们开始看 Redis 里面的 List 命令。看到 List 这个词的时候,小伙伴们肯定非常亲切,因为我们在 Java 里面最常用的、最基础的数据结构就是 List。Redis 里面的 List 与 Java 里面的 LinkedList 差不多,都是用来表示一组有序元素的集合。 按照我们之前介绍字符串(String)的思路,我们依旧是打开 Redis 官网,找到 Command 页面,选择 List,然后就能看到 List 相关的全部命令: List 的命令也不少,这里对 List 命令做一个简单的分类,这节就按照这个思维导图去介绍这些 List 的命令。这里主要分了四个大类,基本的 List 操作、阻塞版本的 List 命令,还有一些复合操作,最后是一些随机访问的命令。 基础操作你可以想一下,Java 里面 LinkedList 是不是能够在队尾写元素、队头取元素,实现一个先进先出(FIFO)的队列,那我们怎么用 Redis 的 List 实现 FIFO 的效果?会涉及到四个命令,分别是 LPUSH、RPOP、RPUSH、LPOP,我们一个个来说。 上一节介绍字符串的时 ...
无题
发表于2026-09-15
上一节中,我们介绍了操作 List 的五大类命令,对每一个命令都做了详细的演示,并分析了每个命令的特性和应用场景。 这一节,我们就来看看 Redis List 数据结构在实战中的应用场景,这里主要介绍消息队列、提醒功能、热点列表三个实战场景,如下图所示: 消息队列Redis List 最简单的一个应用场景就是利用 List 先进先出的特性,做一个消息队列。 我们先创建一个 ListTest 测试类,专门用来写 List 的单元测试,然后把之前连 Redis 的 before() 方法和 after() 方法拷贝过来,具体代码如下所示: 12345678910111213141516171819202122public class ListTest { private static RedisClient redisClient; private static StatefulRedisConnection<String, String> connection; private static RedisAsyncCommands<Strin ...
无题
发表于2026-09-15
Redis 五大基础数据结构里面,我们已经介绍完了 String、List 两个,这一节,我们就开始介绍一下哈希表部分的内容。 这里我们先简单介绍一下 Hash 的底层结构:Hash 由数组和链表两种数据结构组成,数组里面每个元素就是一个槽位,一个槽位下面挂了一个链表。写入 field-value 数据的时候,会计算 field 的 hash 值,然后对数据长度进行取模,找到对应的槽位,把 field-value 插入到这个链表里面。 了解了 Redis 里面哈希表的大概结构之后,我们再来看看 Hash 表的命令,大概分成三类,如下图所示(本节我们也将按照该图的思路去进行介绍): 读写操作哈希表里面最简单、最常用的操作,就是读写 field-value 数据,对应的就是 HGET、HSET命令。 下面先来演示一下 HSET 命令,HSET 命令的第一个参数是哈希表 Key 的名称,后面跟的才是 field-value 数据,示例中的 field 名称是 name,value 值是 kouzhaoxuejie。HSET 执行后的返回值为 1,表示成功写入了一个键值对。 12127.0 ...
1…567…35
avatar
Southblock
个人博客Blog
文章
342
标签
52
分类
23
Follow Me
公告
欢迎来到Southblock' Blog
最新文章
无题2026-09-15
无题2026-09-15
无题2026-09-15
无题2026-09-15
无题2026-09-15
分类
  • AI Agent147
    • Agent23
    • AgentScope14
    • Function Call5
    • Harness & Loop5
    • LangChain4j6
    • MCP16
    • Skills13
标签
Bat脚本 跨域 Claude Code Harness Engineering 微服务 Mem0 LLM JWT 长期记忆 提示词工程 课程介绍 AgentScope 前端 LangGraph MCP 工具调用 CSS3 MySQL 是怎样运行的:从根儿上理解 MySQL Prompt 环境搭建 LangChain4j 大模型 基础概念 Loop Engineering 智能体 工作流 Github Action 快速开始 架构设计 协议 Memory 后端开发 Obsidian Spring AI AI Coding Blog 项目结构 Workflow Dify Skills
归档
  • 九月 2026275
  • 八月 20264
  • 二月 202625
  • 六月 20255
  • 五月 20253
  • 八月 20242
  • 七月 20241
  • 六月 20242
网站资讯
文章数目 :
342
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2026 By Southblock
框架 Hexo|主题 Butterfly