- 博客(645)
- 资源 (24)
- 收藏
- 关注

原创 linux系列文章
linux文章汇总VIMbashMakefileubootu-boot编译过程分析linuxLinux系统编程Linux/UNIX网络编程
2019-11-09 22:07:43
834

原创 linux开发常用工具集
工具集 – linuxMarkdown 编辑器 – TyporaGit版本管理软件 – SmartGitDiff 比较软件 – Meld Diff 差异查看器代码编辑器 – Source Insight代码查看 – Visual Studio Code抓包 – WireShark截图软件-- Shutter串口软件 – PUTTY桌面壁纸软件 – Wallch浏览器 – ...
2019-03-05 22:51:24
685
原创 数据库的并发控制
但对于数据库而言,客户端可以以任意顺序获取锁,因此数据库必须检测并解决死锁,这是一个图问题。在乐观并发控制中,事务在冲突时无法继续,这对应用程序来说并不友好,因为它们只能不断重试。涉及I/O操作,我们可以通过在等待I/O时释放锁来进一步优化,以允许其他事务进入,并让只读事务退出。然而,单个写者仍然不足,因为事务的生命周期由客户端控制,可能任意延长。在现实中,这些步骤可以并行运行,因此需要序列化共享的KV结构。这种方法的用处有限,因为写者之间没有并发能力,且长时间运行的事务会导致读者和写者互相阻塞。
2025-05-05 22:13:42
806
原创 数据库的原子事务
简单的做法是一次迭代并逐个删除键,但这会将整个表读入内存并在删除前反复更新节点,做了一些无用的工作。在我们的案例中,所有内容使用单一的B+树,我们可以实现一个范围删除操作,无需查看即可释放具有特定范围的所有叶节点。:在任何排序的数据中,邻近的键可能共享一个公共前缀。:写时复制在一次更新中从叶节点到根节点复制节点,这对于多键更新来说不是最优的,因为中间树的节点在一个事务内分配、更新一次然后被删除。另一种方法是通过日志实现原子性,在写时复制树中,更新由根指针捕获,而在原地更新中,则需要日志来捕获更新。
2025-05-05 22:11:19
921
原创 数据库的范围查询
下一步将是添加二级索引,这实际上就是额外的表结构,用于加速某些类型的查询。例如,一个二级索引可以用来快速查找符合特定条件的所有记录,而不需要遍历整个主表。为了确保正确的顺序,正半部分与负半部分交换,这仅仅是翻转最高有效位。我们的B+树处理的是任意字节的字符串键,但列可以是其他类型的数据,如数字,而且键可以是多个列。为了在节点内找到当前键的兄弟键,需要知道当前键的位置。另一种方法是选择一个特殊的序列化格式,使得生成的字节能够反映排序顺序。有两种编码带有长度的字符串的方式,一种是在前面添加长度,这需要解码;
2025-05-05 22:03:53
759
原创 于键值(KV)的表
const (TYPE_BYTES = 1 // 字符串(任意字节)TYPE_INT64 = 2 // 整数;64位有符号TYPE_BYTES表示字符串类型,可以存储任意字节。TYPE_INT64表示整数类型,使用64位有符号整数。// 用户定义的部分Name string // 表名Types []uint32 // 列类型Cols []string // 列名PKeys int // 主键列的数量// 前 `PKeys` 列是主键// 不同表的自动分配的 B 树键前缀。
2025-04-28 00:04:44
725
原创 空闲列表:回收和再利用
高效的内存管理:自由列表能够自我维护,并且支持快速分配和释放页面。与写时复制的兼容性:通过追加写入的方式避免覆盖数据,减少了崩溃恢复的复杂性。灵活性:可以选择外部链表或嵌入式链表,根据性能和存储需求进行权衡。这种设计为数据库系统中的磁盘空间管理提供了一种优雅的解决方案。在这一节中,我们详细讨论了自由列表(Free List)的实现方法。自由列表是一种用于管理未使用页面的数据结构,它通过链表的形式组织页面编号,并支持高效的分配和回收操作。以下是对自由列表实现的逐步分析和总结。自由列表接口设计。
2025-04-24 23:34:01
848
原创 仅追加KV数据库
在本章中,我们将创建一个基于文件的键值存储(KV Store),其核心是一个**写时复制(Copy-on-Write, CoW)B+ 树**。这种设计的目标是实现数据的持久性和原子性。
2025-04-23 00:12:30
964
原创 B+树节点与插入操作
所有的B+树节点大小相同,这是为了后续使用自由列表机制。即使当前阶段不处理磁盘数据,一个具体的节点格式仍然是必要的,因为它决定了节点的字节大小以及何时应该分裂一个节点。
2025-04-20 21:57:41
877
原创 B树的异常恢复
叶节点存储实际数据所有的实际数据都存储在叶节点中,这使得查询路径更加一致和简单。内部节点仅存储引导键内部节点的键用于划分子树的范围,帮助快速定位目标数据所在的叶节点。高度平衡B+树的高度始终保持平衡,确保查找、插入和删除操作的时间复杂度为Ο(log 𝑁)。高效的范围查询由于所有叶节点通过指针链接在一起,范围查询变得非常高效。例如,查询[4, 9)范围内的所有数据时,只需遍历相关的叶节点。空间利用率高每个节点可以存储多个键和子节点,减少了树的高度,从而降低了磁盘访问次数。扩展B树。
2025-04-20 21:56:47
976
原创 数据库基础-B+树
日志结构存储(如LSM-tree)通过合并操作摊销了更新成本,并通过多级结构进一步优化了写放大效应。高效的写入性能:更新被缓冲在小文件中,避免频繁重写整个数据集。可控的写放大效应:通过多级合并,减少不必要的磁盘写入。灵活性:可以根据具体应用场景调整层级数量,权衡写放大效应和查询性能。B+树B+树适用于需要频繁更新的场景,但在磁盘上的更新效率较低,并且空间复用的问题需要额外处理。LSM-treeLSM-tree 解决了许多上一章提到的挑战,例如如何高效更新基于磁盘的数据结构以及如何复用空间。
2025-04-19 23:00:38
952
原创 容器技术解析:容器网络
随着云计算的发展,基础资源层的弹性伸缩问题得到了解决。然而,PaaS层应用如何随基础资源层的变化而快速、批量部署成为新的挑战。容器技术应运而生,它不仅提供了轻量级的虚拟化方案,还极大地简化了软件交付流程。本文将探讨容器技术的核心概念及其网络实现机制。
2025-04-17 21:00:54
927
原创 从物理机到虚拟化:构建更灵活的数据中心
在当今快速发展的信息技术领域,传统的本地服务器面临着诸多挑战。本文将探讨这些问题,并介绍通过虚拟化技术,特别是 qemu-kvm 和 TUN/TAP 技术,如何解决这些难题,从而为数据中心带来更高的灵活性和效率。
2025-04-16 16:48:40
393
原创 数据库的基本原则
SQL几乎成为了数据库的代名词,但它实际上只是数据库的一个用户界面,并不是数据库的核心。通过KV接口,你可以获取、设置和删除单个键值对,更重要的是,可以以排序顺序列出一系列键。为了实现持久性,可以使用。手机使用SQLite而非其他格式(如JSON)存储数据的原因在于,数据库系统提供了更高级的数据完整性和可靠性保证,尤其是在处理异常情况时。:这是一种常用的组织和存储数据的方式,特别适合于磁盘上的数据结构。以下是一些关键的原则,它们构成了数据库系统的基础,并且可以帮助你通过实践来学习如何构建一个简单的数据库。
2025-04-16 00:03:08
646
原创 TCP 和 UDP 的区别
特性TCPUDP连接方式面向连接无连接可靠性可靠(重传、排序、去重)不可靠(可能丢失或乱序)数据模式字节流数据报拥塞控制有无适用场景文件传输、HTTP 等实时音视频、DNS 等import ("fmt""net"if err!= nil {
2025-04-14 15:37:35
1160
原创 ubuntu24.04LTS安装向日葵解决方案
但是会报libgconf-2-4缺失的问题,而这个库24.04软件源里面是没有的,你需要使用如下命令。输入如下命令安装,将具体版本修改成自己下载的版本。
2025-04-13 11:38:54
658
原创 go语言内存泄漏的常见形式
例如,有时我们可能会让 Go 程序的主 Goroutine 挂起,以避免程序退出。因为,虽然go中并未对字符串时候共享底层内存块进行规定,但go语言编译器/运行时默认情况下允许字符串共享底层内存块,直到原先的字符串指向的内存被修改才会进行写时复制,这是一个很好的设计,既能节省内存,又能节省CPU资源,但有时也会导致"内存泄漏"。例如如下代码,一旦调用demo就会导致将近1M内存的泄漏,因为s0只使用了50字节,但是会导致1M的内存一直无法被回收,这些内存会一直持续到下次s0被修改的时候才会被释放掉。
2025-04-12 22:43:05
1124
原创 ICMP 协议深度解析
ICMP就像网络的神经系统,通过毫秒级的信号传递维持着互联网的生命体征。理解其工作原理,是掌握网络故障排查的基石。通过接收"需要分片"差错报文(Type=3,Code=4),动态调整数据包大小。源站抑制报文(Type=4)自动触发发送端降速,防止网络拥塞。(互联网控制报文协议)是IP协议体系的"哨兵系统",专用于。利用TTL递减触发ICMP超时报文,绘制完整传输路径。携带故障包"证据",便于源端精准定位问题。通过ICMP请求/应答判断主机可达性。
2025-04-07 19:52:46
394
原创 Linux网络配置解析:当IP地址与周围环境不匹配时会发生什么?
分层处理原则:Linux严格遵循OSI模型,上层(如ICMP)依赖下层(如ARP)的完整实现。子网隔离性:跨子网通信必须依赖网关,单播广播(如ARP)无法穿透子网边界。配置强校验:网关地址必须与至少一个本地接口在同一子网,否则配置无效。
2025-04-03 10:34:14
820
原创 go语言中空结构体
在某些场景下,你并不需要通过通道传递具体的数据,而只是需要一个简单的信号机制来通知其他协程某个事件已经发生。由于空结构体不占用内存,发送和接收空结构体的操作通常比发送和接收复杂数据类型的通道更快。虽然这种差异在大多数情况下是微不足道的,但在高并发或高性能要求的场景下,这些细微的优化可能会产生显著的影响。基于这个特性,在一些特殊的场合之下,可以用做占位符使用,合理的使用空结构体,会减小程序的内存占用空间。空结构体的表象特征,就是没有任何属性,而从更深层次的角度来说,空结构体是一个不占用空间的对象。
2025-03-19 10:43:54
537
原创 什么是eBPF?
eBPF(Extended Berkeley Packet Filter)是一种内核技术,允许用户空间程序在不修改内核代码的情况下,通过加载 eBPF 程序来拦截和处理内核事件。这种技术广泛应用于网络过滤、性能分析、安全审计等多种功能。eBPF 作为一种现代操作系统中不可或缺的技术,提供了强大的监控和诊断能力,同时保持了系统的高性能和稳定性。通过其实时数据收集和非侵入式的特性,eBPF 成为了提升系统可观测性的理想选择,推动了操作系统级别的创新和发展。
2025-03-04 14:47:28
815
原创 一分钟搭建promehteus+grafana+alertmanager监控平台
平时进行后端开发,特别是微服务的后端可开发,一定少不了对接监控平台,但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试,这里我使用docker-compose搭建了一个promehteus+grafana+alertmanager监控平台,如果你也需要接下来的一分钟,只需要执行几个命令就可以开启你的promehteus之旅啦。仓库clone好了之后,按照如下示例执行,命令执行结束,你的 promehteus+grafana+alertmanager环境就搭建完成了。
2025-01-26 15:47:39
917
原创 [go-redis]客户端的创建与配置说明
经过上述过程,一个完整的Client算是创建完成了,后面你就可以使用Client对redis进行操作了。
2024-12-04 21:48:45
1015
原创 剖析go协程池实现原理
协程本身也是一种资源,但是协程池有自己的特殊性,那是由协程池执行任务的特殊性决定的,协程作为资源使用时其实是在消费其他资源,也就是说必须向协程池提供一个统一的接口,所有需要协程池执行的任务都需要实现该接口,然后被协程池统一调用。触发协程池工作很简单,只需要向协程池等待的通道中放入一个任务即可,当协程池关闭时,所有任务都会被立即执行,当所有任务执行完毕,协程池中的所有协程都会退出。创建协程池需要指定最大并发数,当有新的任务加入时,会立即被执行,而当没有任务时,所有协程池中的协程阻塞竞争等待通道中的"任务"。
2024-12-02 15:58:40
766
1
原创 go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源
Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资源中的一个,它可以从池里申请,使用完后归还到资源池里。提到池子,channel天然就是一个池子,而且channel是多线程安全的,所以可以直接使用管道来安全的共享资源。文章按照如下四个方面对Pool资源池的设计过程以及使用进行剖析。
2024-12-02 13:52:17
664
原创 go并发设计模式runner模式
真正运行的程序不可能是单线程运行的,go语言中最值得骄傲的就是CSP模型了,可以说go语言是CSP模型的实现。
2024-12-01 13:28:12
1446
原创 go语言切片
还可以通过对切片再次切片来缩小一个切片的大小。空切片和nil切片并不等价,空切片和nil切片是不同的。空切片是一个长度为0,容量为0的切片,而nil切片是一个未初始化的切片,它指向一个不存在的内存区域。操作超过当前切片的容量时,Go 会分配一个新的更大的底层数组,并将原有数据复制到新的数组中。当使用make指定的切片长度为0时,那么底层其实会创建一个指针指向zerobase的切片,这时的Data指向。和C++的vector一样,在进行扩容时,一般会大于实际需要的长度,在实际使用中能有效的减少扩容的次数。
2024-11-29 17:41:49
1256
原创 go结构体匿名“继承“方法冲突时继承优先顺序
在 Go 语言中,当一个结构体匿名嵌入了多个实现相同接口的结构体时,调用该接口方法时会优先选择自己实现的方法,如果自己没有实现该方法,就按照顺序从上到下找到第一个定义的方法。方法的定义顺序决定了调用哪个方法。但是为了避免歧义和提高代码的可读性,建议在设计时尽量避免这种情况,或者在外部结构体中显式地实现接口方法。
2024-11-28 10:22:52
489
原创 Redis持久化即AOF与RDB
虽然每次执行更改数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。当使用Redis存储非临时文件时,一般需要打开AOF持久化来降低因进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis性能,但是大部分情况下这个影响是可以接受的。这时我们希望Redis将数据从内存中以某种形式同步到硬盘中,使得重启之后数据能从硬盘中的记录中恢复数据,这以过程就是持久化的过程。
2024-11-27 15:42:24
628
原创 Redis中如何使用lua脚本-即redis与lua的相互调用
- 定义一个函数-- 函数体end-- 将函数赋值给变量end-- 函数可以借助lua提供的语法糖简写为local funcend。
2024-11-27 13:33:15
1843
原创 Redis中的消息订阅与发布
假设你的博客网站,每次有新文章时需要发送邮件通知,但是邮件发送需要一定的时间,如果采用 FIFO 的方式,可能会导致用户发送邮件的请求时间过长。所以,我们可以使用优先级队列,在队列中存储用户发送邮件的请求,并根据请求的优先级进行排序,优先级高的先发送。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。的键优先级越高,借此特性可以实现区分优先级的任务队列。命令,当链表中没有数据时,客户端会阻塞等待。命令订阅指定名称的频道外,还可以使用。
2024-11-26 16:30:50
1088
原创 Redis过期时间和SORT命令的高级用法
在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。是 Redis 中一个强大的命令,用于对列表、集合或有序集合中的元素进行排序。选项配合,就可以在不排序的情况下,获取多个外部键,相当于执行一个整合的获取操作(类似于 SQL 数据库的。因为直接使用有序集合不如集合操作强大,当排序不经常使用的时候,可以使用集合存储数据,然后使用。命令只能设置精确的秒数,不能设置到毫秒级别,如果需要精确到毫秒级别的控制,可以使用。中的值,然后再用这个值来查找相应的键。
2024-11-25 21:23:28
1415
原创 Redis事务
Redis 事务允许你一次执行多个命令,并且这些命令会按照顺序被执行,中间不会被其他客户端的请求打断。我们可以使用 Redis 事务来确保这些操作作为一个整体执行,不会被其他客户端的请求打断。之间,其他客户端修改了。
2024-11-25 17:32:10
296
原创 redis常用命令整理
如果你的博客想每页显示5篇文章,但是在实际中文章的ID可能因为人为操作而变得不连续,比如从1到100,但是第50个被删除了,那么你再翻页就找不到了。集合类型内部是使用哈希表实现的,所以可以非常快速地添加和删除元素,向两端添加元素和删除元素的复杂度都是O(1)。因此使用集合命令可以非常快速地判断一个元素是否在集合中,在网站中常使用集合来存储标签。列表类型内部是使用双向链表实现的,所以可以非常快速地插入和删除元素,向两端添加元素和删除元素的复杂度都是O(1)。
2024-11-25 16:16:17
1050
原创 go语言range的高级用法-使用range来接收通道里面的数据
在 Go 语言中,可以使用循环来遍历通道(channel)。循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕。
2024-11-22 10:06:35
1133
The Robert C. Martin Clean Code Collection - Martin, Robert C-.m
2023-08-15
Technical Overview of LoRa and LoRaWAN-TÜV Rheinland
2023-08-15
Getting Started with LevelDB-Andy Dent
2023-08-15
Alice and Bob: A History Of The World’s Most Famous Couple
2023-08-07
福昕阅读器--linux最新版
2020-11-14
dbeaver-ce_7.2.4_amd64最新版本|dbeaver-ce_7.2.4_amd64.deb
2020-11-14
最新GeoLite2资源整合.zip
2020-10-03
C++基础课程讲义.pdf
2020-09-26
strtok的赞歌.pdf
2020-04-19
bsearch.zip
2020-04-18
RFC2616中文翻译-有待改进.odg
2020-01-15
Sqlite3.pdf
2019-06-30
GDB就该这样用
2019-05-04
IPC进程间通信
2019-05-03
在ubuntu上配置ftp服务器的说明文档,亲测可用(图片)
2018-08-26
自己参考网上的资源配置的vim编译器配置文件
2018-08-25
配置samba服务器的配置文件备份
2018-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人