redis 设计与实现 摘抄笔记

Redis-笔记(视频摘抄 哔哩哔哩博主(感谢!):遇见狂神) redis(缓存数据库,有效控制查询)是非关系型数据库,缓存穿透、缓存击穿,缓存雪崩Nosql概述为什么使用Nosql大数据时代,那么什么是大数据,大数据就是一般的数据库没有办法进行分析处理,其中大数据处理产品就有Hoodoop(2006),(springBoot、springcould分布式开发), 阅读详情

https://yuedu.baidu.com/ebook/f9f378a176eeaeaad1f33085?pn=1&click_type=10010002&isFromWenku=1&rf=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DPJVoGbrLWi2TbbozQGpKizg0ho4QGbwxMl7uKsQ0CrGf98vrh_XME1LNPikEiB8uRFCa8TjGBVZKniRKjJVXGO_YfSE8uKAb07VZy6bVA_G%26wd%3D%26eqid%3Ddb3dc8c6000061e0000000065bd07d05

​ Redis 设计与实现学习总结

前言

在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。

O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。

​ 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。 再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。 O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)

 

第1 章​ 1.1 简单动态字符串(SDS)

​ Redis 没有直接使用C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS 用作Redis 的默认字符串表示。Redis中所有的字符串对象的键值,以及键值对应的value值如是字符串对象,其底层都是以SDS形式存储。

​ 1:SDS定义

每个sds.h/sdshdr 结构表示一个SDS 值,如图所示:

struct sdshdr {
// 记录buf 数组中已使用字节的数量
// 等于SDS 所保存字符串的长度
int len;
// 记录buf 数组中未使用字节的数量
int free;
// 字节数组,用于保存字符串
char buf[];
};

 

(1)free 属性的值为0,表示这个SDS 没有分配任何未使用空间。(2) len 属性的值为5,表示这个SDS 保存了一个五字节长的字符串。(3) buf属性是一个char类型的数组,数组的前五个字节分别保存了'R'、'e'、'd'、'i'、's' 五个字符,而最后一个字节则保存了空字符'\0'。这里遵循空字符结尾这一惯例的好处是就是可以重用一部分C 字符串函数库里面的函数。

1.2 SDS 与C 字符串的区别

​ 根据传统,C 语言使用长度为N+1 的字符数组来表示长度为N 的字符串,并且字符数组的最后一个元素总是空字符'\0'。而redis处于安全性与效率考虑,才有SDS结构体对象形式,保存字符串;优势如下:

(1)读取长度速度快,由于sds字符串长度在其更新和保存的时候已经自己记录到len属性中,这样获取长度复杂度就是O(1),而传统字符数组表示的字符串获取其长度时,需要进行遍历length次,即复杂度O(N);

(2)杜绝缓冲区溢出;由于C 字符串不记录自身长度,会导致由于分配字符数组空间不足,导致缓冲区溢出情况,比如两个字符串拼接时,如果字符串定义过小,就会导致缓冲区溢出;与C 字符串不同,SDS 的空间分配策略完全杜绝了发生缓冲区溢出的可能性:当SDS API 需要对SDS 进行修改时,API 会先检查SDS 的空间是否满足修改所需的要求,如果不满足的话,API 会自动将SDS 的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用SDS 既不需要手动修改SDS 的空间大小,也不会出现前面所说的缓冲区溢出问题。

(3)减少修改字符串时带来的内存重分配次数。Redis 作为数据库,为了减少内存重新分配的次数,降低性能消耗,redis在第一次内存分配后,会多分配预存空间,多分配长度与保存字符串长度len相等,其值保存在free属性中,即在SDS 中,buf 数组的长度不一定就是字符数量加一,数组里面可以包含未使用的字节,而这些字节的数量就由SDS 的free 属性记录。通过未使用空间,SDS 实现了空间预分配和惰性空间释放两种优化策略。、

​ (a)空间预分配

空间预分配用于优化SDS 的字符串增长操作:当SDS 的API 对一个SDS 进行修改,并且需要对SDS 进行空间扩展的时候,程序不仅会为SDS 分配修改所必须要的空间,还会为SDS 分配额外的未使用空间。其中,额外分配的未使用空间数量由以下公式决定:

​  如果对SDS 进行修改之后,SDS 的长度(也即是len 属性的值) 将小于1MB,那么程序分配和len 属性同样大小的未使用空间,这时SDS len 属性的值将和free 属性的值相同。举个例子,如果进行修改之后,SDS 的len 将变成13 字节,那么程序也会分配13 字节的未使用空间,SDS 的buf 数组的实际长度将变成13+13+1=27 字节(额外的一字节用于保存空字符)。​  如果对SDS 进行修改之后,SDS 的长度将大于等于1MB,那么程序会分配1MB 的未使用空间。举个例子,如果进行修改之后,SDS 的len 将变成30MB,那么程序会分配1MB 的未使用空间,SDS 的buf 数组的实际长度将为30 MB + 1MB + 1byte。通过这种预分配策略,SDS 将连续增长N 次字符串所需的内存重分配次数从必定N 次降低为最多N 次。

​ (b)惰性空间释放

​ 惰性空间释放用于优化SDS 的字符串缩短操作:当SDS 的API 需要缩短SDS 保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是使用free 属性将这些字节的数量记录起来,并等待将来使用。当减少buf数组中字符串数据值时,SDS中的len属性会减少,但其free属性并不会减少,会保持原来的长度不变,未使用的空间将会在以后新增元素时用到,同时SDS 也提供了相应的API,让我们可以在有需要时,真正地释放SDS 的未使用空间,所以不用担心惰性空间释放策略会造成内存浪费。

(4)二进制安全

​ 传统字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾。这些限制使得C 字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。通过使用二进制安全SDS,而不是C 字符串,使得Redis 不仅可以保存文本数据,还可以保存任意格式的二进制数据。

(5)兼容部分C 字符串函数

​

​ 字符串和SDS 之间的区别进行了总结

第二章 链表

1 链表和链表节点的实现

​ 每个链表节点使用一个adlist.h/listNode 结构来表示:

typedef struct listNode {
// 前置节点
struct listNode * prev;
// 后置节点
struct listNode * next;
// 节点的值
void * value;
}listNode;

多个listNode 可以通过prev 和next 指针组成双端链表

虽然仅仅使用多个listNode 结构就可以组成链表,但使用adlist.h/list 来持有链表的话,方便链表操作,有点像java集合中LinkedList;

typedef struct list {
// 表头节点
listNode * head;
// 表尾节点
listNode * tail;
// 链表所包含的节点数量
unsigned long len;
// 节点值复制函数
void *(*dup)(void *ptr);
// 节点值释放函数
void (*free)(void *ptr);
// 节点值对比函数
int (*match)(void *ptr,void *key);
} list;

list 结构为链表提供了表头指针head、表尾指针tail,以及链表长度计数器len,而dup、free 和match 成员则是用于实现多态链表所需的类型特定函数: dup 函数用于复制链表节点所保存的值; free 函数用于释放链表节点所保存的值;

 match 函数则用于对比链表节点所保存的值和另一个输入值是否相等。

一个包含三个listNode节点的list列表;Redis 的链表实现的特性可以总结如下:

 双端:链表节点带有prev 和next 指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。 无环:表头节点的prev 指针和表尾节点的next 指针都指向NULL,对链表的访问以NULL 为终点。 带表头指针和表尾指针:通过list 结构的head 指针和tail 指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)。 带链表长度计数器:程序使用list 结构的len 属性来对list 持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)。 多态:链表节点使用void* 指针来保存节点值,并且可以通过list 结构的dup、free、match 三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

第三章:字典

1:字典的实现

Redisd的字典使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,而名哈希表节点就保存了字典中的一个键值对。

1.1 哈希表

​ Redis字典所使用的哈希表由dict.h/dictht结构定义:

typedef struct dictht{
​
  //哈希表数组
​
  dictEntry **table;
​
  //哈希表大小
​
  unsigned long size;
​
  //哈希表大小掩码,用于计算索引值,总是等于size  - 1
​
  unsigned long sizemask;
​
  //该哈希表已有的节点数量
​
  unsigned long used;
​
}dictht;
​

1.2 哈希表节点

​ 哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存着键值对:

typedef struct dictEntry{
  //键
  void *key;
  //z值,表示键值对值的值可以是指针,或整数
  union{
    void *val;
    uint64_tu64;
    int64_ts64;
  }v;
  //指向下个哈希表节点,形成链表
  struct dictEntry *next;
}dictEntry;

next属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对链接在一起,以此解决键冲突(collision)的问题,简称拉链法,与java HashMap 键值冲突处理类似;

1.3 字典

//Rdeis 中的字典有dict.h/dict 结构表示
typedef struct dict{
  //类型特定函数
  dictType *type;//保存了一簇用于操作特定类型键值对的函数,类似java map中的方法
  //私有数据
  void *privdata;//保存了需要传给那些类型特定函数的可选参数
  //哈希表
  dictht ht[2];//包含两个dictht哈希表,一般情况只使用ht[0],ht[1]只会在对ht[0]进行rehash时用到
  //rehash 索引,当rehash不在进行时,值为-1;//记录rehash目前的进度
  in trehashidx;
}dict;

1.4 哈希算法

​ 当需要字典中哈希表添加新的键值对时,首先根据键值key,计算出哈希值和索引值,找到在哈希表数组中索引位置;hash值计算运行MurmurHash2算法,得出值;然后hash值与哈希表中的maskSize掩码值相与,得出索引值。同时为了解决哈希值冲突问题,哈希表使用链地址法,将相同哈希值得节点,同一节点属性next指针构成单向链表,由于dictEntry节点组成链表没有指向表为的指针,所有为了追求速度,新增节点总是排在单链表的表头位置。

1.5 rehash(重新散列)

​ 当哈希表保存值不在其负载因子(ht[0]表used/size )合理的返回内时,哈希表就会进行收缩或扩展操作。

​

​

同时rehash的扩展收缩在大数据量下时分多次,渐进式完成的;

 

豆瓣评分 9.7 的神书:《数据密集型应用系统设计》 豆瓣评分高达 9.7 分!《数据密集型应用系统设计》 (大名鼎鼎的DDIA)。数据库,mysql,redis,kafka,分布式,大数据,Json,ProtoBuffer, Thrift 原理的书籍。面试、工作都必看的一本分布式系统好书。本文分享了阅读体会、学习资料 阅读详情

相关推荐

技术人如何构建高效知识体系:从阅读笔记到个人知识库

在技术学习与职业成长中,知识管理是构建扎实认知框架的核心能力。其原理在于通过系统性的信息加工与连接,将碎片化输入转化为结构化、可提取、可应用的知识网络,从而有效对抗遗忘曲线并提升学习深度。这一过程的技术价值在于,它不仅解决了信息过载与知识留存率低的普遍痛点,更能直接赋能工程实践与问题解决能力。常见的应用场景包括技术书籍阅读、项目经验沉淀、以及个人知识体系的长期维护。本文以“geek树苗读书笔记汇总帖”为具体案例,深入探讨了如何运用**双向链接**和**渐进式总结**等现代笔记方法论,结合Obsidian等工

weixin_34159110的博客 314

C++类对象共享数据的5种实现方法介绍

转自:微点阅读https://www.weidianyuedu.com C++中实现数据共享的5种方式: 1.使用局部变量和全局变量共享数据 使用局部变量能够在调用和被调用函数之问通过参数传递实现不同函数块之问的数据共享。局部变量具有局部作用域,能很好地实现函数之间的数据隐蔽。但在传递过程中需要很大的系统开销,故一般只用于传递少量的数据。全局变量具有文件作用域。全局变量所存储的数据在程序中任何地方都可以访问,能够在程序中的所有函数之间实现数据共享。使用全局变量实现共享数据相当方便,但其副作用也..

ysds20211402的博客 3165

从背题到体系化:我用二十八天啃下字节跳动技术面的八股文复盘

在互联网技术面试中,“八股文”常被误解为死记硬背的应试套路,实际上它是计算机基础知识的体系化索引。从TCP三次握手、MySQL索引结构到Redis缓存策略,每一道经典问题背后都对应着底层原理、设计权衡与应用场景。理解这些概念,不仅能帮助开发者建立完整的知识网络,还能在实际系统排查、性能优化和架构设计中发挥关键作用。无论是准备大厂面试,还是提升工程实践能力,系统地梳理这些基础知识点都至关重要。本文分享了一个非科班后端开发者如何通过二十八天的结构化复习,将算法、计算机网络、操作系统、数据库与缓存等散装知识串联成

weixin_33924312的博客 347

《redis设计与实现》摘记-底层数据结构

redis设计与实现 》数据结构简单动态字符串(sds)优点空间预分配惰性空间释放链表场景字典哈希键冲突rehash渐进式rehash跳跃表效率场景整数集合场景升级压缩列表场景 简单动态字符串(sds) SDS遵循C字符串以空字符结尾的惯例,保存空字符的1字节不计算在sds的len属性里面,并且为空字符分配额外的1字节空间,以及添加空字符到到字符串末尾等操作,都是有sds函数自动完成的,所以这个空...

feichen2016的博客 330

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1319

用LT1166+MOS管打造实验室级恒流源:闭环反馈与推挽驱动的深度调优

本文详细介绍了基于LT1166电流模式控制器与MOS管推挽架构的实验室级恒流源设计方法。通过闭环反馈调优和动态响应优化,实现带宽达100kHz、纹波低于0.1%的高性能恒流输出,适用于精密仪器校准和半导体测试等场景。重点解析了系统架构设计、MOS管选型策略以及频率响应测试等关键技术要点。

weixin_29290379的博客 202

读书笔记:《redis设计与实现》(第一部分)

感觉自己弱了,就多读点书,最近感觉对redis的理解有些弱,所以,找了一本书, 黄健宏的 《Redis设计与实现》,写了一些读书笔记与摘抄, 与各位牛马们共勉。

fronge的博客 1659

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 510

《redis设计与实现》

第一部分

qq_24664053的博客 1164

vcs覆盖率相关

选择要查看的覆盖率点,右键选择 show xxx tests;

qq_40571921的博客 2384

无源低通滤波器

无源RC滤波器“滤除”不需要的信号,因为它们分离并允许仅通过其频率的正弦输入信号,最简单的是无源低通滤波器网络。在低频应用(高达100kHz)中,无源滤波器通常使用简单的RC(电阻-电容)网络构建,而高频滤波器(高于100kHz)通常由RLC(电阻-电感-电容)元件制成。无源滤波器由电阻器、电容器和电感器等无源元件组成,没有放大元件(晶体管、运算放大器等),因此没有信号增益,因此它们的输出电平始终小于输入。滤波器是根据它们允许通过它们的信号的频率范围来命名的,同时阻挡或“衰减”其余部分。

weixin_44448586的博客 1万+

Redis-单机功能实现

个人学习redis的笔记和摘抄,主要来自《Reids设计与实现》一书 Ch9-数据库 数据库概念 服务器中有一个指向redisDb的数组,默认大小是16,即默认创建16个数据库 每个redis客户端都有自己的目标数据库,可以通过SELECT命令切换 键空间 redisDb结构中有一个dict保存了数据库中的所有键值对,键string对象,值可以是5种对象类型。 对数据库的CRUD操作即发生在这...

weixin_43780313的博客 254

AI 编程组合之deepseek+vscode+cline插件,使用deepseek大模型实现代码自动生成

本文介绍了VSCODE下cline插件的安装结合DeepSeek-V3,ai编程的组合套件,举了两个例子一个是生成登录页面,一个是生成贪吃蛇游戏

技术博客 7万+

Redis-数据结构与对象

个人学习redis的笔记和摘抄,主要来自《Reids设计与实现》一书 Redis-对象 对象 redis定义了一系列基本数据结构,并基于这些数据结构创建了一个对象系统,包括String、List、Set、Hash、Zset。 使用对象的好处 针对不同使用场景设置不同的数据结构实现,优化使用效率 基于引用计数的内存回收机制,节约内存;多数据库共享一个对象 对象带有访问时间信息,空转时间较长的被...

weixin_43780313的博客 200

树莓派4B系统安装及SSH远程控制(简单易操作)

​自从2022年4月树莓派官网更新了RaspberryPiImager版本v1.7.2后,便不再支持自行建立ssh文件,并用默认用户名pi和密码raspberry的方式进行远程控制(亲测不行,输密码时一直access denied)。但是该版本软件提供了烧录系统前设置ssh用户及密码功能。本文记录了系统安装和SSH远程操作步骤。........................

机械人的代码路 5789

飞牛 NAS 部署 Hermes Agent 全指南:打造 24 小时在线、自我进化的 AI 智能体!

当大多数人还在把 AI 当聊天机器人使用时,我已经把它部署到了家里的飞牛 NAS 上,让它 24 小时在线工作、记忆我的习惯、自动执行任务,甚至还能不断学习新的技能。今天带你从零搭建这个真正属于自己的 AI Agent。🚀

XiaoqiangClub的博客 1218

【技术晨读】4- 关于Redis的常识

今天的博文阅读只有一篇《关于Redis的常识》, 文中给了不少有价值的参考资料。 有一本书《Redis设计与实现》, 从底层数据结构和设计的角度去看Redis。准备有时间去翻看一下。 在线阅读版本:  http://redisbook.com/ 这本书的下边,给出了不少的资源。摘抄如下: Redis 3.0 源码注释 ——包含中文注释的 Redis 3.0 源码,帮助有兴趣的读

专注、专心 2095

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Redis源码(1)基本数据结构

Redis源码阅读笔记 文章目录**Redis源码阅读笔记****前言****基本数据结构****动态字符串SDS****结构定义****对比C字符串****接口API****链表List****结构定义****接口API****字典Dict****结构定义****接口API****迭代器****跳跃表skiplist****结构定义****查找、删除、添加节点****接口API****补充:有序集合****HyperLogLog****算法细节****密集存储****稀疏存储****计数缓存****API

青玉白露的博客 333

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机专业毕业设计之避坑指南(开题答辩选导师必看)--告诉你怎么顺利毕业,其他专业也适用

最近好多童鞋问我怎么顺利闯过大学四年的最后一关–毕业设计,根据我多年做计算机毕设的经验,给小伙伴们总结一下,先上图:如果你是学霸,那就请你默默的离开吧,下面的内容对你没有什么帮助。想要顺利毕业,总结起来也就是上图这六点。注:文章底部有投票,如果你是大四学生,麻烦给个关注投个票吧。一、选好导师======·一定要提前选,有些学校导师人员紧张,到后期会给你分配一些非本专业的老师。· 选熟悉的,事儿少的,千万不要选那种特别爱让学生帮忙干活的,否则你就是她的快递员、跑腿。二、选毕设题目=======

2401_84048179的博客 772

Redis 基本类型介绍与基础操作指令

记录 Redis 数据库基本数据类型与基础操作命令。

TROUBLE I AM IN 1387

基于微信小程序的中小学生个性化阅读平台的设计与实现计算机毕业设计源代码+文档+讲解视频

本课题设计基于微信小程序的中小学生个性化阅读平台,聚焦 K12 阶段学生的阅读兴趣培养与能力提升,构建 “分级阅读 - 个性推荐 - 互动学习” 的轻量化阅读场景,解决传统课外阅读 “选书盲目、效果难追踪、缺乏引导” 的痛点。 平台核心功能包括: 分级阅读资源库:按年级(小学 1-6 年级 / 初中 1-3 年级)、阅读水平(基础 / 进阶 / 拓展)分类,涵盖名著节选、科普故事、寓言童话等,标注字数、阅读时长、核心知识点(如修辞手法 / 历史背景),支持拼音标注(低年级)、生词即时查(中高年级)。 个性化

专注于大学生项目实战开发,讲解,毕业答疑辅导,java就业辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。全网粉丝10w+,平台优质java、小程序创作者。 669

设计模式学习笔记 - 开源实战三(中):剖析Google Guava中用到的设计模式

我通过 Google Guava 这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们抽离出来,设计成独立的类库、框架或功能组件。本章再来学习下,Google Guava 中用到的几中经典的设计模式:Builder 模式、Wrapper 模式,以及之前没有讲过的 Immutable 模式。

chenjian723122704的专栏 1308

MyBatis整体架构

《MyBatis技术内幕》笔记摘抄: MyBatis项目源码主要模块如下: 1.整体架构图 主要分为三层:基础支持层、核心处理层、接口层 基础支持层:数据源模块、事物管理器模块、缓存模块、Binding模块、反射模块、类型转换、日志模块、资源加载、解析器模块 核心处理层:配置解析、参数映射、SQL解析、SQL执行、结果映射、插件 接口层:SqlSession 点击查看原图 2.基础支持层 反射模块:对应 reflection包。 Java 中的反射虽然功能强大,但对大多数开发人员来说,写出高质量

阿璐4r的博客 454

本地知识图谱与Graph RAG实践:用Kwipu激活Markdown笔记

知识图谱是一种用图结构建模知识和关系的技术,它将实体作为节点,关系作为边,形成语义网络。其核心原理是通过结构化表示,让机器理解概念间的关联,而非仅仅进行关键词匹配。这项技术的价值在于能够实现深度的语义理解和推理,为智能检索、问答系统提供支撑。在工程实践中,知识图谱常与RAG(检索增强生成)技术结合,构建Graph RAG系统,以提升大模型回答的准确性和逻辑性。应用场景广泛,尤其适用于个人知识管理、技术文档库和项目文档智能查询。本文以Kwipu工具为例,展示了如何将本地Markdown笔记自动构建为知识图谱,

weixin_33722405的博客 362

《 SpringBoot经典学习笔记》读书笔记

一SpringBoot返回Json数据及数据封装 项目开发中,接口和接口之间,前后端之间数据传输使用Json格式, 在SpringBoot中的Controller使用@RestController注解即可返回Json格式的数据, 点击进入@RestController注解 可以看出@RestController注解包含了原来的@Controller和@ResponseBody注解 @ResponseBody将返回的数据结构转换为json格式 打开idea右侧的maven栏 发现在此版本中Spring

呆大王的博客 1401

碎片化时代的知识沉淀:信息甄别、笔记系统与回顾验证方法

在信息过载的数字化时代,大量碎片化内容不断挤占注意力,但收藏不等于掌握。有效的知识管理要求先区分信息与知识,再通过一套可执行的知识沉淀流程将零散输入转化为结构化能力。这套流程涵盖信息判断规则、笔记模板、标记规范、回顾节奏与验证指标,并使用收件箱、概念笔记、项目笔记和定期复查组成轻量系统。同时引入git和命令行巡检来保证笔记库的可维护性,通过过程指标和结果指标衡量学习效果。无论是长期面对碎片化学习的技术人员,还是希望构建个人知识库的知识工作者,都可以参考这套方法,把阅读真正变成可复用的决策资产,避免陷入低效收

weixin_29051811的博客 297
上一篇: Spring中Ordered接口简介
下一篇: 聊聊高并发系统之限流特技
god_love_hlq_xff
博客等级 码龄11年 27粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值