- 博客(248)
- 收藏
- 关注
原创 【Redis】事务
Redis 的事务和 MySQL 的事务概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。Redis 事务。每次客户端在事务中进行一个操作,都会把命令先发给服务器,放到“事务队列”中(但是并不会立即执行),而是。因此,Redis 的事务的功能相比于 MySQL 来说,是弱化很多的。只能保证事务中的这几个操作是“连续的”,不会被别的客户端“加塞”,仅此而已。
2025-06-09 22:56:00
328
原创 【Redis】持久化
Redis 提供了两种持久化方案:RDB 和 AOF。RDB 视为内存的快照,产生的内容更加紧凑,占用空间较小,恢复时速度更快。但产生 RDB 的开销较大,不适合进行实时持久化,一般用于冷备和主从复制。AOF 视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩 AOF 文件。RDB 和 AOF 都使用 fork 创建子进程,利用 Linux 子进程拥有父进程内存快照的特点进行持久化,尽可能不影响主进程继续处理后续命令。
2025-06-08 18:11:45
880
原创 【数据结构】 LRU Cache
LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。
2025-06-06 18:07:18
390
原创 【数据结构】跳表
SkipList本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型,SkipList是由William Pugh发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》SkipList,顾名思义,首先它是一个list,实际上,它是在有序链表的基础上发展起来的。如果是一个有序的链表,查找数据的时间复杂度是O(N)。
2025-06-06 17:39:35
730
原创 【数据结构】B树
如果树为空,直接插入新节点中,该节点为树的根节点树非空,找待插入元素在树中的插入位置(注意:找到的插入节点位置一定在叶子节点中)检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)按照插入排序的思想将该元素插入到找到的节点中检测该节点是否满足B-树的性质:即该节点中的元素个数是否等于M,如果小于则满足如果插入后节点不满足B树的性质,需要对该节点进行分裂:申请新节点找到该节点的中间位置将该节点中间位置右侧的元素以及其孩子搬移到新节点中。
2025-06-06 16:34:36
904
原创 【数据结构】图
摘要 图是由顶点集合V和边集合E组成的数据结构,分为有向图和无向图。顶点之间存在多种关系:邻接顶点、路径、完全图等。存储方式主要有邻接矩阵法,用二维数组表示顶点间关系,适合快速查询连通性但浪费空间。图算法需要考虑顶点度、路径长度、连通性等特性,并处理带权图的情况。代码示例展示了用C++实现图的邻接矩阵存储,包括添加顶点、边和打印图结构的功能。 (字数:150)
2025-06-06 15:33:46
1019
原创 【数据结构】并查集
毕业后,学生们要去公司上班,每个地方的学生自发组织成小分队一起上路,于是:西安学生小分队s1 = {0,6,7,8},成都学生小分队s2 = {1,4,9},武汉学生小分队s3 = {2,3,5}就相互认识了,10个人形成了三个小团体。从上图可以看出:编号6,7,8同学属于0号小分队,该小分队中有4人(包含队长0);编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的同学属于2号小分队,该小分队有3个人(包含队长2)。现在0集合有7个人,2集合有3个人,总共两个朋友圈。
2025-06-05 19:43:31
567
原创 【Redis】渐进式遍历和数据库管理
这是因为本身 Redis 并没有为多数据库提供太多的特性,其次无论是否有多个数据库,Redis 都是使用单线程模型,所以彼此之间还是需要排队等待命令的执行。除了 scan 以外,Redis 面向哈希类型、集合类型、有序集合类型分别提供了 hscan、sscan、zscan 命令,它们的用法和 scan 基本类似,感兴趣的读者可以自行做扩展学习。❗ 渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。
2025-06-01 22:44:59
897
原创 【Redis】zset
命令时间复杂度O(k * log(n)),k 是添加成员的个数,n 是当前有序集合的元素个数zcard keyO(1)O(1)O(log(n)),n 是当前有序集合的元素个数O(k * log(n)),k 是删除成员的个数,n 是当前有序集合的元素个数O(log(n)),n 是当前有序集合的元素个数O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数zcount。
2025-05-31 18:53:35
890
原创 【Redis】set
命令时间复杂度O(k),k 是元素个数O(k),k 是元素个数scard keyO(1)O(1)O(n),n 是 countO(n),n 是 countO(k),k 是元素个数O(m * k),k 是几个集合中元素最小的个数,m 是键个数O(k),k 是多个集合的元素个数总和O(k),k 是多个集合的元素个数总和。
2025-05-31 18:34:21
1001
原创 【Redis】List
如下图所示,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储 (2。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发中有很多应用场景。有关列表的命令已经介绍完毕,表2-5是这些命令的作用和时间复杂度,开发人员可以参考。列表类型是用来存储多个有序的字符串。
2025-05-30 18:11:40
579
原创 【Redis】hash
下表是哈希类型命令的效果、时间复杂度,开发人员可以参考此表,结合自身业务需求和数据大小选择合适的命令。命令执行效果时间复杂度设置值O(1)获取值O(1)删除fieldO(k),k是field个数hlen key计算field个数O(1)获取所有的field-valueO(k),k是field个数批量获取field-valueO(k),k是field个数判断field是否存在O(1)hkeys key获取所有的fieldO(k),k是field个数hvals key。
2025-05-30 17:58:28
716
原创 【MySQL】C语言连接
初始化mysql_init()要使用库,必须先进行初始化!如: MYSQL *mfp = mysql_init(NULL)链接数据库mysql_real_connect初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)//建立好链接之后,获取英文没有问题,如果获取中文是乱码://设置链接的默认字符集是utf8,原始默认是latin1。
2025-05-29 19:47:28
777
原创 【Redis】string
由于 Redis 内部存储字符串完全是按照二进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。
2025-05-29 16:59:30
908
原创 【MySQL】视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
2025-05-28 21:17:53
215
原创 【MySQL】事务
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台MySQL中,不需要你的数据,要删除你的所有信息(一般不会:),要删除你基本信息(姓名、电话、籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。
2025-05-28 21:03:58
824
原创 【Redis】基本架构
我们所谓的Redis是采用单线程模型执行命令的是指:虽然三个客户端看起来是同时要求Redis去执行命令的,但微观角度,这些命令还是采用线性方式去执行的,只是原则上命令的执行顺序是不确定的,但一定不会有两条命令被同步执行,如图2 - 3、2 - 4、2 - 5所示,可以想象Redis内部只有一个服务窗口,多个客户端按照它们达到的先后顺序被排队在窗口前,依次接受Redis的服务,所以两条incr命令无论执行顺序,结果一定是2,不会发生并发问题,这个就是Redis的单线程执行模型。客户端同时执行命令。
2025-05-28 18:50:42
599
原创 【Redis】基本命令
Redis命令行客户端使用指南:介绍两种连接方式(交互式和命令式)及基本操作示例。详细讲解5个常用全局命令:KEYS(模式匹配查询key)、EXISTS(判断key是否存在)、DEL(删除key)、EXPIRE/TTL(设置/查看过期时间)、TYPE(返回数据类型)。每个命令包含语法说明、版本要求、时间复杂度和使用示例。帮助文档配有客户端-服务端交互图示,是学习Redis基础操作的重要参考。
2025-05-28 18:30:48
663
原创 【Redis】基本介绍
Redis是一款高性能的键值数据库,具有速度快、数据结构丰富、功能全面等特性。其速度优势源于内存存储、C语言实现、单线程设计和精良的代码;支持5种基础数据结构,并扩展了位图等功能;提供持久化、主从复制、高可用集群等特性,确保数据安全性和扩展性。Redis适用于缓存、排行榜、计数器、社交网络和消息队列等场景,凭借简单稳定的架构和丰富的客户端支持,成为互联网应用的理想选择。
2025-05-28 18:19:53
741
原创 【MySQL】索引
索引是提升数据库查询性能的关键技术,它通过优化数据检索方式显著提高查询速度,但会降低写入操作的效率。本文通过实际案例演示了索引的威力:在800万条数据的表中,无索引查询耗时近9秒,而建立索引后仅需0.01秒。同时解释了磁盘存储原理,说明数据库文件本质上存储在磁盘扇区中,512字节是传统扇区标准大小。索引技术正是通过优化这种磁盘IO操作来提升数据库性能的。
2025-05-27 18:26:06
784
原创 【MySQL】表的内连和外连
本文介绍了SQL中的表连接操作,主要分为内连接和外连接两种类型。内连接通过WHERE子句筛选表间的笛卡尔积,是开发中最常用的连接方式(语法:SELECT...FROM...INNER JOIN...ON)。外连接包括左外连接和右外连接:左外连接会显示左表全部记录(即使无匹配),右外连接则显示右表全部记录。文章通过学生表和成绩表的实例演示了两种外连接的查询结果差异,并提供了部门与员工关联查询的两种实现方法(使用左外或右外连接均可)。
2025-05-27 17:02:54
245
原创 【Redis】Redis安装
本文简要介绍了Redis的安装与基本配置:1)通过apt命令安装Redis;2)修改redis.conf配置文件,将bind地址设置为0.0.0.0并关闭protected-mode以允许远程访问;3)提供Redis服务的管理命令,包括启动、停止和重启服务。配置修改部分特别强调了安全警告,建议谨慎处理网络绑定设置。
2025-05-26 18:20:15
930
原创 【Linux网络】多路转接epoll
按照 man 手册的说法:是。它是在 2.5.44 内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44)它几乎具备了之前所说的一切优点,被公认为 Linux2.6 下性能最好的多路 I/O 就绪通知方法。
2025-05-19 18:36:16
594
原创 【Linux网络】多路转接poll
poll 是 Linux 网络编程中的一种 I/O 多路复用机制,用于在单线程内同时监视多个文件描述符的状态变化,适用于处理多个并发连接。与 select 相比,poll 优化了文件描述符数量限制和参数设置问题,使用 pollfd 结构体数组来指定监视的文件描述符及其事件。poll 函数通过阻塞等待事件发生,支持超时控制和信号中断,返回后通过检查 revents 字段确定事件类型。尽管 poll 在灵活性和超时控制上具有优势,但其在处理大规模连接时存在性能瓶颈,建议在高并发场景下使用更高效的 epoll
2025-05-18 17:17:23
613
原创 【Linux网络】多路转接select
多路转接(多路复用)是一种用于监视多个文件描述符(fd)状态变化的机制,常见的实现方式包括select、poll和epoll。select是其中一种系统调用,允许程序等待多个fd的状态变化,直到其中一个或多个fd就绪。select函数原型包括参数nfds(最大fd值+1)、readfds、writefds、exceptfds(分别表示可读、可写和异常fd集合)以及timeout(超时时间)。fd_set结构用于表示fd集合,通过位图操作来管理fd。select的返回值表示就绪的fd数量,0表示超时,-1表示
2025-05-18 16:12:26
838
原创 【Linux网络】五种IO模型与阻塞IO
在Linux网络环境中,IO(输入/输出)是网络数据传输的核心,涉及数据从网络到系统再到应用程序的传输过程。IO模型主要分为阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO。阻塞IO在数据未就绪时会阻塞进程,而非阻塞IO则通过轮询检查数据状态,避免长时间阻塞。IO多路复用通过select、poll、epoll等系统调用,允许单线程处理多个连接,提升性能。信号驱动IO通过信号通知应用程序数据就绪,而异步IO则完全由内核处理数据传输,通知应用程序结果。同步与异步通信的区别在于调用者是否主动等待结果,而
2025-05-18 15:02:30
810
原创 【Linux网络】DNS与ICMP
如上图所示,域名结构是树状结构,树的最顶端代表根服务器,根的下一层就是由我们所熟知的.com、.net、.cn等通用域和.cn、.uk等国家域组成,称为顶级域。网上注册的域名基本上是二级域名,比如http://baidu.com、http://taobao.com等等二级域名,它们基本上是归企业和运维人员管理。ping命令基于ICMP,是在网络层,而端口号,是传输层的内容。至今,我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。ICMP协议是一个网络层协议。
2025-05-17 20:18:04
673
原创 【Linux网络】内网穿透
内网穿透是连接内网与公网的桥梁,通过合理选择工具和配置,可以在远程办公、个人服务搭建、开发测试等场景中发挥重要作用。但需注意安全风险,优先选择加密传输和权限控制功能完善的方案。随着云计算和边缘计算的发展,未来内网穿透技术可能进一步集成到云服务中,变得更加便捷和安全。内网打洞是P2P通信的核心技术,通过巧妙利用NAT设备的特性,实现了内网设备间的直接通信,在实时交互场景中具有不可替代的优势。尽管受限于NAT类型和防火墙策略,但其与STUN/TURN/ICE的结合已成为现代网络通信的基础设施。
2025-05-17 17:58:20
903
原创 【Linux网络】ARP协议
ARP协议(地址解析协议)是介于数据链路层和网络层之间的协议,用于建立IP地址与MAC地址的映射关系。其工作流程包括发送ARP请求(广播)、接收并响应ARP请求(单播)以及更新ARP缓存表。ARP缓存表存储IP-MAC映射,具有时效性,可通过命令手动管理。ARP协议的扩展包括免费ARP、ARP代理和ARP欺骗,其中ARP欺骗是一种常见的网络攻击手段。此外,ARP与RARP(反向地址解析协议)的区别在于前者已知IP求MAC,后者已知MAC求IP。理解ARP协议有助于排查网络问题并防范安全威胁。
2025-05-17 14:52:51
964
原创 【Linux网络】数据链路层
数据链路层是网络通信中用于设备间数据传输的关键层,以太网作为其核心技术标准,涵盖了数据链路层和物理层的内容,规定了网络拓扑、访问控制方式和传输速率等。以太网帧格式包括源地址、目的地址(MAC地址)、帧协议类型和CRC校验码。MAC地址是识别数据链路层节点的唯一标识,长度为48位。MTU(最大传输单元)是数据链路层对数据包大小的限制,以太网的MTU为1500字节。MTU对IP、UDP和TCP协议有重要影响,可能导致数据包分片和重组失败。MSS(最大段大小)是TCP协议中单个数据报的最大长度,受MTU限制。通过
2025-05-16 21:33:09
1007
原创 【Linux网络】网络层
网络层负责在复杂的网络环境中确定合适的路径,核心协议是IP协议。IP协议通过IP地址(IPv4和IPv6)标识网络中的主机和路由器,并将数据包跨网络转发到目标主机。IP地址分为网络号和主机号,网络号标识不同的子网,主机号标识子网内的具体设备。子网划分通过子网掩码实现,提高了IP地址的利用率。IP协议头部包含版本号、服务类型、总长度、生存时间等字段,用于控制数据包的传输。路由过程通过逐跳转发实现,路由器根据目标地址选择最佳路径。IP地址数量有限,通过动态分配、NAT技术和IPv6缓解地址不足问题。私有IP地址
2025-05-14 17:34:20
1190
原创 【Linux网络】TCP全连接队列
本文通过实验和源码分析探讨了TCP协议中的一些关键概念。首先,通过测试代码验证了listen函数的第二个参数对全连接队列长度的影响,发现当全连接队列满时,新的连接请求会进入SYN_RECV状态而非ESTABLISHED状态。接着,介绍了使用tcpdump工具进行网络数据包捕获和分析的常见方法,包括捕获特定接口、IP地址和端口的数据包,以及保存和读取数据包文件。最后,通过分析socket结构体源码,探讨了socket与文件描述符的关联机制,进一步理解了Linux系统中“一切皆文件”的设计理念。这些内容有助于深
2025-05-14 15:38:05
928
原创 【Linux网络】传输层协议TCP
TCP协议是一种传输控制协议,旨在确保数据传输的可靠性。其核心机制包括确认应答(ACK)和超时重传,通过序列号和确认序号来保证数据的有序性和完整性。TCP还通过三次握手和四次挥手来管理连接的建立和关闭,确保通信双方的全双工通信。在连接关闭时,主动关闭的一方会进入TIME_WAIT状态,等待2MSL(最大报文生存时间)以确保网络中残留的报文消散,避免端口冲突。TCP的这些机制共同保障了数据传输的可靠性和高效性。
2025-05-14 14:29:07
996
原创 【Linux网络】传输层协议UDP
传输层协议UDP(用户数据报协议)是一种无连接、不可靠的传输协议,适用于不需要建立连接或确认机制的应用场景。UDP通过端口号标识不同的应用程序,端口号分为知名端口号(0-1023)和动态分配端口号(1024-65535)。UDP协议的特点包括无连接、不可靠和面向数据报,即数据报在传输过程中不会被拆分或合并。UDP的缓冲区机制简单,接收缓冲区不保证数据报的顺序,且缓冲区满时新数据会被丢弃。UDP协议首部中的16位长度限制了单个UDP数据报的最大长度为64K,超过此限制的数据需要在应用层进行分包处理。基于UDP
2025-05-13 17:45:27
739
原创 【Linux网络】HTTPS
HTTPS协议是在HTTP基础上引入加密层,通过加密技术保障数据传输的安全性。HTTP协议明文传输易被篡改,而HTTPS通过对称加密和非对称加密结合的方式,确保数据在传输过程中不被窃取或篡改。对称加密使用同一密钥进行加密和解密,效率高但密钥传输存在风险;非对称加密使用公钥和私钥配对,安全性高但效率较低。HTTPS采用非对称加密传输对称密钥,后续通信使用对称加密,兼顾安全与效率。为防止中间人攻击,HTTPS引入数字证书,由CA机构验证服务器身份,确保证书中的公钥真实可靠。数字签名基于非对称加密,用于验证数据完
2025-05-13 17:10:37
1078
原创 【Linux网络】 HTTP cookie与session
HTTP Cookie是服务器发送到用户浏览器并保存的一小块数据,用于在后续请求中识别用户。Cookie分为会话Cookie(浏览器关闭时失效)和持久Cookie(有明确过期时间)。服务器通过Set-Cookie字段设置Cookie,浏览器在后续请求中自动携带。Cookie的格式包括名称、值、过期时间、路径、域名等属性,可通过secure和HttpOnly标志增强安全性。Cookie常用于用户认证、会话管理、跟踪用户行为等场景。测试中,Cookie的写入、自动提交、过期时间和路径设置均通过代码实现,确保其功
2025-05-12 16:57:02
775
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人