自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2.链表算法

文章摘要:本文系统梳理了链表相关算法题及解题技巧,主要包括双指针应用(合并/分隔链表、环检测等)、递归与迭代实现(链表反转、K组翻转)、回文链表判断等经典问题。重点分析了虚拟头节点、快慢指针、链表分解、多路归并、虚拟链表和分解问题等6大核心技巧,并对比了递归与迭代的时空复杂度差异。文章强调递归思维训练价值与实际应用中迭代法的效率优势,提出通过分解子问题、明确定义递归函数来解决复杂链表问题的方法论。(149字)

2025-09-07 16:55:09 534

原创 1.框架思维

算法本质与分类摘要 算法本质是穷举,关键在于无遗漏和无冗余。数据结构由数组和链表变换而来,核心在于遍历和访问(增删查改)。穷举方式分为线性(for/while)和非线性(递归)。算法难点可分为两类: 如何穷举:递归类问题(回溯、动态规划)。回溯是遍历思维,动态规划是分解问题思维,如计算叶子数时分解为"当前叶子+剩余叶子"的递归模式。 如何聪明穷举:非递归技巧: 二分搜索(O(logN)优于暴力O(N)) 并查集(O(1)连通性判断) 贪心算法(利用规律减少穷举) 数组技巧:双指针(滑动窗

2025-09-07 16:52:22 653

原创 操作系统启动过程详解

计算机启动过程分为三个阶段:硬件启动阶段完成加电自检、BIOS/UEFI初始化和硬件枚举;引导加载阶段通过MBR或UEFI加载引导程序,切换至保护模式并加载操作系统内核;操作系统初始化阶段完成内核解压、系统服务启动和用户环境配置。现代系统采用UEFI、并行初始化和安全启动等机制优化启动流程,确保系统安全高效地完成启动。这一精密流程展现了计算机系统从硬件初始化到用户界面就绪的完整工作机理。

2025-09-06 18:12:26 729

原创 多维度数据统一线性处理的常见方案

摘要:针对小说推荐系统的热度评分设计,本文分析了直接相加订阅量、搜索量等不同维度指标的弊端(量纲不一致、数值范围差异大、分布长尾等),提出了"Log1p+Min-Max归一化+加权融合"的解决方案。具体步骤包括:对长期累积指标采用Log1p压缩长尾后Min-Max归一化,对短期指标直接Min-Max归一化,最后加权求和。该方法能有效平衡各维度影响力,避免被绝对量级绑架,且具备可解释性和可调参性。(149字)

2025-09-06 11:05:15 298

原创 19.多级缓存

官方网站:<https://openresty.org/cn/>

2025-07-19 11:15:09 690

原创 17.IO 多路复用解析

多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要 select 、 poll 、 epoll 来配合。多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。

2025-07-19 11:10:16 667

原创 16.五大类型底层

但是,新增或者删除是需要把所有索引都更新一遍,为了保证原始链表中数据的有序性,我们需要先找到要动作的位置,这个查找操作就会比较耗时,最后在新增和删除的过程中的更新,时间复杂度也是 O(log n)由于链表,无法进行二分查找,因此借鉴数据库索引的思想,提取出链表中关键节点(索引),先在关键节点上查找,再进入下层链表查找,提取多层关键节点,就形成了跳跃表。也就是说,第 k 级索引的结点个数是第 k-1 级索引的结点个数的 1/2,那第 k 级索引结点的个数就是 n/(2^k)按照我们前面讲的,两两取首。

2025-07-19 11:08:50 802

原创 15.缓存过期淘汰策略

开启惰性淘汰:lazyfree-laze-eviction = yes。

2025-07-19 11:06:28 1030

原创 14.Redlock

先知道什么是容错失败了多少个机器实例后我还是可以容忍的,所谓的容忍就是数据一致性开始可以 OK 的,CP 数据一致性还是可以满足加入在集群环境中,redis 失败 1 台,可接受。2X+1 = 2 * 1+1 =3,部署 3 台,死了 1 个剩下 2 个可以正常工作,那就部署 3 台。加入在集群环境中,redis 失败 2 台,可接受。2X+1 = 2 * 2+1 =5,部署 5 台,死了 2 个剩下 3 个可以正常工作,那就部署 5 台。为什么是奇数最少的机器,最多的产出效果。

2025-07-19 11:03:38 663

原创 13.手写分布式锁

synchronized 单机版 OK,上分布式死翘翘nginx 分布式微服务,单机锁(lock)不行取消单机锁,上 redis 分布式锁 setnx只加了锁,没有释放锁,出现异常的话,可能无法释放锁,必须在代码层面 finally 释放所宕机了,部署了微服务代码层面根本没有走到 finally 这块,没办法保证解锁,这个 key 没有被删除,需要有 lockKey 的过期时间设定为 redis 的分布式锁 key,增加过期时间,此外,还必须要 setnx+过期时间必须同一行。

2025-07-19 11:01:59 1340

原创 12.缓存四件套

没有 100%的过滤,实战可以使用 Guava 过滤 99%,那 1%使用返回缺省值(defaultNull)方法(设置较短过期时间)

2025-07-19 10:59:34 1036

原创 11.BitMap/HLL/GEO

用户在手机 App 上的签到打卡信息:1 天对应 1 系列用户的签到记录,新浪微博、钉钉打卡签到,来没来如何统计?抖音电商直播,主播介绍的商品有评论,1 个商品对应了 1 系列的评论,排序+展现+取前 10 条记录。应用网站上的网页访问信息:1 个网页对应 1 系列的访问点击,淘宝网首页,每天有多少人浏览首页?多个 key 的合并统计,某个门户网站的所有模块的 PV 聚合统计就是整个网站的总 PV。全年中登录的天数共计多少?因为主要的目标高效、巨量地进行计数,所以对存储的数据的内容并不太关心。

2025-07-19 10:55:35 643

原创 10.布隆过滤器(BloomFilter)

使用时最好不要让实际元素数量远大于初始化数量,一次给够避免扩容当实际元素数量超过初始化数量时,应该对布隆过滤器进行重建,重新分配一个 size 更大的过滤器,再将所有的历史元素批量 add 进行。

2025-07-16 12:03:32 1002

原创 9.缓存双写一致性之更新策略

如何选择方案优先使用先更新数据库,再删除缓存的方案(先更库→后删存)。理由如下:先删除缓存值再更新数据库,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力导致打满 mysql。如果业务应用中读取数据库和写缓存的时间不好估算,那么,延迟双删中的等待时间就不好设置。多补充一句:如果使用先更新数据库,再删除缓存的方案如果业务层要求必须读取一致性的数据,那么我们就需要在更新数据库时,先在 Redis 缓存客户端暂停并发读请求,等数据库更新完、缓存值。

2025-07-16 12:00:46 632

原创 8.Redis之BigKey

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。那样一次性返回所有的 key,而是返回一个游标和一批 key,用户可使用返回的游标进行下一次迭代,直到游标返回 0,表示迭代结束。参数,是要一次性吐出所有满足条件的 key,而 Redis 是单线程的,其所有操作都是原子的,命令,它是一个基于游标的迭代器,用于以增量的方式迭代数据库中的 key,不会像。

2025-07-16 11:56:32 599

原创 7.Redis之单线程 VS 多线程(入门)

从 Redis6 开始,就新增了多线程的功能来提高 I/O 的读写性能,他的主要实现思路是将主线程的 IO 读写任务拆分给一组独立的线程去执行,这样就可以使多个 socket 的读写可以并行化了,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),将最耗时的 Socket 的读取、请求解析、写入单独外包出去,剩下的命令执行仍然由主线程串行执行并和内存的数据交互。这种就是 IO 复用模型。但是,从网络 IO 处理到实际的读写命令处理,都是由单个线程完成的。

2025-07-16 11:54:56 632

原创 一文讲清反射&动态代理&AOP

反射机制是 JVM 在运行时借助Class 元数据(运行时常量池、方法表、字段表等)提供的自省(introspection)能力:通过及API,先定位并解析目标类的Class对象,再按需获取其MethodField等元数据对象,最后绕过编译期绑定,在解释器或 JIT 生成的适配 stub中动态完成成员访问或方法调用。在动态代理场景下,这一过程使框架能够在运行期为接口生成$Proxy0代理类,并将接口方法统一路由到用户提供的,实现横切逻辑的织入。

2025-07-16 11:53:33 1092

原创 4.easypan-下载分享

为了避免第三方下载和分享资源链接无法通过登录鉴权,我们拆分了下载文件这个接口。把下载文件接口拆分成为:生成下载 URL 和根据 URL 下载指定文件两个接口。并且在生成下载 URL 的时候进行登录鉴权。为了避免 URL 过于简单,可以被用户暴力破解,我们构造了一个 50 长度的字符串,以这个字符串为 Key,文件地址和文件名称为 value 存储在 Redis 中,并且设置有效期为五分钟。当用户下载的时候,我们根据 URL 传递的字符串在 Redis 中读取指定的文件地址,进行下载。

2025-07-15 20:20:46 321 1

原创 3.easypan-文件预览

根据源文件的 id 查询出一个文件集合,可能是分享的视频,直接根据 fileId 查视频文件,然后获取这个 file 信息。因为:如果是文件的话,我们就需要先发送 m3u8 文件,然后根据需要选择发送哪一个 ts 视频文件。这里的 sql 是获取多层级的文件夹信息,有排序,保证获取的文件多级目录顺序正确用于前端展示。而移动文件的逻辑可以分为四部分。好吧,前端也有错的,前端关于创建文件夹模块,传参父目录那里错了,没有获取正确值。检查当前待移动的文件夹或者文件是否与目标文件夹中的文件夹或文件命名重复。

2025-07-15 20:15:46 323

原创 2.easypan-文件上传

点播场景直播场景HLS,全称是,是由苹果公司开发的一种用于流媒体传输的协议。它是一种基于HTTP的自适应码流协议,旨在通过标准的 Web 服务器提供高质量的流媒体内容。简单来说,HLS 是一种将音视频内容通过 HTTP 协议分发给用户的技术,并且能够根据用户的网络状况动态调整视频质量,以提供流畅的观看体验。HLS 的核心思想是将一个完整的音视频流分割成许多小的、独立的媒体片段(通常是.ts文件),并生成一个 播放列表文件(通常是.m3u8文件),该文件包含了这些媒体片段的 URL 和其他相关信息。

2025-07-15 20:08:21 385

原创 1.easypan-登录注册

而黑马点评是在登录后生产随机 token 返回给前端,并将用户信息作为 value,token 作为小 key 存入 redis 的 hash 中,以后请求携带 token,拦截然后去 redis 中做校验,将用户信息存入 ThreadLocal 中。因为这里采用的是 session 认证,要根据 session 去内存中获取用户信息,所以单独封装了 ABaseController 里面封装了获取用户信息的方法,方便多个接口调用获取。使用第三方库:Kaptcha 库,简单易用,功能丰富,支持多种干扰效果。

2025-07-15 20:07:03 280

原创 6.Redis之集群模式

命令中前 3 个节点(

2025-07-15 19:46:06 606

原创 5.Redis之哨兵

上述的failover操作均由sentinel自己独自完成,完全无需人工干预。

2025-07-15 19:41:14 862

原创 4.Redis之复制(replica)

由于所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave 机器数量的增加也会使这个问题更加严重。上一个 slave 可以是下一个 slave 的 master,slave 同样可以接收其他 slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的 master,可以有效减轻主 master 的写压力。那每次都要人工干预?无人值守安装变成刚需 ---->>>

2025-07-13 11:39:32 1102 2

原创 CORS 详解:原理、机制与解决方案

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种基于HTTP 头的机制,允许服务器标识哪些外部源(域、协议或端口)可以访问其资源。通过浏览器与服务器的配合,CORS 打破了浏览器默认的 同源策略(Same-Origin Policy),实现了安全的跨域通信。

2025-07-09 18:19:41 1061

原创 3.事务-管道-发布订阅

开启:以 MULTI 开始一个事务入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面执行:由 EXEC 命令触发事务原生批量命令是原子性(mset、mget),pipeline 是非原子性原生批量命令一次只能执行一种命令,pipeline 支持批量执行不同命令原生批量命令是服务端实现,而 pipeline 需要服务端与客户端共同完成。

2025-07-09 10:33:11 659

原创 2.Redis之持久化

RDB(Redis Database):RDB 持久化以指定得时间间隔执行数据集得时间点快照。实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。恢复时再将硬盘快照文件直接读回到内存中。这个快照文件就称为 RDB 文件(dump.rdb),其中,RDB 就是 Redis DataBase 的缩写。

2025-07-06 11:44:47 691

原创 1.Redis十大数据类型

本文介绍了Redis支持的多种数据类型及其特性:String(二进制安全,最大512M)、List(双端链表,40亿元素)、Hash(键值映射表,适合存储对象)、Set(无序唯一集合,O(1)复杂度)、ZSet(有序集合,按分数排序)、GEO(地理位置存储与计算)、HyperLogLog(基数统计,12KB固定内存)、BitMap(二进制位数组)、Bitfield(多比特位操作)、Stream(消息队列,支持持久化)。最后通过图表形式对比总结了各数据类型特点。(149字)

2025-07-05 11:37:50 1025

原创 搞了一下家里的网络,还挺复杂的

家中网络采用双路由器独立运行模式,H3C和TP-LINK分别通过不同网线接入光猫,形成两个独立局域网(192.168.10.X和192.168.0.X)。关闭TP-LINK后,仅H3C工作,其DHCP正常分配192.168.10.X地址。重置H3C路由器后,由于运营商定制固件特性,局域网IP变更为192.168.1.X,管理界面转为移动APP控制。该网络结构属于"双线入户",两个路由器各自进行NAT转换和DHCP分配,彼此网络不互通。文中还详细解释了NAT和DHCP的工作原理,帮助理解家

2025-07-05 11:24:13 810

原创 Hash 类型之 Hashtable&Listpack

另外,这里还跟你提一下,dictEntry 结构里键值对中的值是一个「联合体 v」定义的,因此,键值对中的值可以是一个指向实际值的指针,或者是一个无符号的 64 位整数或有符号的 64 位整数或 double 类的值。另外,这里还跟你提一下,dictEntry 结构里键值对中的值是一个「联合体 v」定义的,因此,键值对中的值可以是一个指向实际值的指针,或者是一个无符号的 64 位整数或有符号的 64 位整数或 double 类的值。缩容也和负载因子有关,当负载因子小于 0.1 的时候,就会进行缩容操作。

2025-07-05 11:23:05 575

原创 Zset 类型之 Skiplist

Redis选择使用跳表(Skiplist)而非红黑树实现Zset类型,主要原因在于跳表在保持高效查询(O(logN))的同时,更易于实现和维护。跳表通过多层有序链表结构,支持快速范围查询和插入/删除操作,且实现复杂度低于平衡树。此外,跳表的层级采用概率性随机生成(25%概率增加层数),避免了严格的平衡调整开销,使其在性能和实现复杂度之间取得了更好的平衡。

2025-07-05 11:21:51 886

原创 Ziplist&Quicklist&Listpack

Redis List 底层数据结构经历了从双向链表到Ziplist,再到Quicklist和Listpack的演变。最初的双向链表虽然操作高效,但存在内存不连续导致的CPU缓存利用率低、内存开销大等问题。Ziplist作为连续内存结构解决了缓存问题,但动态扩容和数据类型多样性支持不足。Quicklist结合了链表和Ziplist的优点,而Redis 7.0引入的Listpack进一步优化了内存效率和操作性能。这些改进体现了Redis在内存优化和性能提升上的持续演进。

2025-07-05 11:20:56 895

原创 String类型之SDS

Redis采用SDS(简单动态字符串)而非C原生char[]的原因在于:1)SDS通过预分配和惰性释放策略减少内存重分配开销;2)内置len字段实现O(1)复杂度获取字符串长度;3)支持二进制安全,允许存储包含'\0'的数据;4)兼容C字符串函数的同时通过结构体封装元数据。这种设计有效解决了char[]在频繁修改、长度获取和二进制存储方面的缺陷,特别适合Redis作为高性能数据库对字符串操作的需求。SDS通过空间预分配和元数据维护,在内存效率和操作性能上取得了最佳平衡。

2025-07-05 11:18:57 701

原创 IP 限流 vs. URI 限流

摘要: 作者在调试程序时遇到前端传文件失败的问题,后端报EOFException。排查发现,因前端服务器带宽1Mbps,后端3Mbps,导致TCP链路限流,后端Tomcat长时间未收到数据而超时报错。借此分析了云厂商的带宽限制机制:通过边缘路由器或虚拟网络设备进行流量整形,在数据包到达时根据IP关联的带宽配置缓存或延迟发送,实现限流。对比了云主机限流(IP级)与微服务限流(如Sentinel的接口级)的区别,指出前者作用于网络层,后者在应用层实现更细粒度控制。文章浅析了网络限流原理,并邀请读者进一步探讨网络

2025-07-02 14:42:05 1063

原创 sychronized原理(嚼碎了喂版)

调用了对象的 hashCode,但偏向锁的对象 MarkWord 中存储的是线程 id,如果调用 hashCode 会导致偏向锁被撤销,(轻量级锁会在锁记录中记录 hashCode,重量级锁会在 Monitor 中记录 hashCode)如果成功,当前线程获得锁,如果失败,表示 MarkWord 已经被替换成了其他线程的锁记录,说明在与其它线程竞争锁,当前线程就尝试使用自旋来获取锁。当有另外一个线程逐步来竞争锁的时候,就不能再使用偏向锁了,要升级为轻量级锁,使用的是等到竞争出现才释放锁的机制。

2025-05-16 19:57:29 686

原创 8.大总结

8.2.1 短信登录首先是用户提交手机号,后端将生成的验证码以及用户信息存入 session 中,用户登录时进行拦截并从 session 中拿出来信息校验,并把用户信息存入 ThreadLocal 中每个 tomcat 有自己的一份 session,分布式、微服务下有多个 tomcat 实例,之间的 session 无法共享负载均衡器通过特定算法如 IP 哈西,保证同一用户的请求始终路由到同一服务器。(失去负载均衡的灵活性)session 复制,所有服务器同步 session 变更。(带宽消耗大)

2025-05-10 17:04:37 867

原创 7.探店/好友/附近/签到/UV

探店笔记类似点评网站的评价,往往是图文结合。

2025-05-10 17:01:46 1058

原创 6.秒杀优化

秒杀业务的优化思路是什么?先利用 Redis 完成库存余量、一人一单判断,完成抢单业务再将下单业务放入阻塞队列,利用独立线程异步下单基于阻塞队列的异步秒杀存在哪些问题?内存限制问题:一直往阻塞队列中放,容易 OOM数据安全问题:数据全在 JVM 内存中(阻塞队列中),挂了全没了问题 1-全局唯一 IDid 不能具有明显的规则mysql 的自增 id 无法保证以后的业务解决方案:采用全局 ID 生成器,组成为:符号位(永远为 0),时间戳(31bit),序列号(32bit)

2025-05-10 16:58:41 1169

原创 2.商户查询缓存

例1:Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>();本地用于高并发例2:static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build();用于redis等缓存例3:Static final Map<K,V> map = new HashMap();本地缓存。

2025-05-10 16:53:20 1303

原创 5.Redission

基于 setnx 实现的分布式锁存在下面的问题:重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如 HashTable 这样的代码中,他的方法都是使用 synchronized 修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的 synchronized 和 Lock 锁都是可重入的。

2025-05-10 16:46:22 1262

尚硅谷家的尚医通项目所有资料

包含笔记、代码、资料,教案、分析图、架构图、流程图、前端代码、后端代码、更具软件、工具类、sql脚本等等

2025-03-15

黑马家苍穹外卖所有资源

苍穹外卖,包含md讲义、sql脚本、前端代码、后端代码、数据库设计、产品原型、项目接口(json格式)

2025-03-15

百度网盘加速补丁(10Mb/s)

百度网盘加速补丁(10Mb/s)

2025-02-03

vue3小兔鲜电商项目

vue3小兔鲜电商项目,适合学完vue3知识练手的项目

2025-01-18

vue3大事件管理系统

前端vue3项目-大事件管理系统,适合学习后vue3知识的道友练手,此源码为自己跟着“黑马程序员"学习时实现的项目源码,内含有黑马家的文档笔记

2025-01-18

python入门-外星人小游戏

此文件为python+pygame开发的一个python入门小游戏,可以帮助大家打开开发的大门!

2025-01-15

空空如也

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

TA关注的人

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