自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)

我们在上篇文章中实现了单机模式下的秒杀业务。其中采用了synchronized加锁来解决各种线程安全问题。而synchronized关键字是依赖于单机的JVM,在集群模式下,每个服务器都有独立的JVM,如果此时还采用synchronized关键字加锁,就会导致不同服务器间出现线程安全问题。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊。

2024-12-21 14:19:12 1082 70

原创 【Redis】高并发场景下秒杀业务的实现思路(单机模式)

主要解决了单机情况下秒杀场景中的超卖问题,一人一单问题。实现了一个可用的秒杀功能

2024-12-13 17:02:10 4871 74

原创 【Redis缓存机制】缓存更新、缓存穿透、缓存雪崩、缓存击穿

当缓存区缓存了用户信息后,客户端就都会从redis中访问读取数据了。而如果这时候用户更新了数据库中的值,就会导致数据库存储的数据与redis存储数据不一致,在这之后进行读写操作就会发生各种意想不到的错误了因此,当我们要对数据库数据进行更新时,也要尽可能让edis中的数据也能跟着变化,避免用户读到错误的信息缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样每次查询缓存都不会命中,最后都会对数据库进行查询。就像是缓存被穿透了一样,每次请求都会直接到达数据库。

2024-12-05 16:19:16 1961 76

原创 【Linux】vim编辑器

vim就是命令行模式下的文本编辑器,相当于windows中的记事本,可以用来进行文本编辑。

2024-11-29 17:22:59 1068 100

原创 【Linux】Linux常用命令

主要介绍了Linux一些常用的命令

2024-11-29 16:09:03 2365 81

原创 【spring】参数校验Validation

在实际开发中,我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递,传来的参数长度不符合要求等,这种时候如果放任不管,继续执行后续业务逻辑,很有可能就会出现意想不到的bug。有人可能会说,这不是前端的问题吗,让前端校验去。话是这么说,但我们也不能前端校验百分百不会出现问题。并且有些请求可能也不是正规通过客户端发来的,可能是黑客恶意攻击,又或是通过Postman等发来的,这些请求就不一定会“合法”了。因此,对客户端传来的每个请求都进行必要的参数校验是十分重要的。

2024-11-21 15:18:20 4508 95

原创 【Spring】RESTful设计风格

REST(Representational State Transfer),即“表现层状态转移”,它定义了互联网软件服务的架构原则。如果一个架构的符合 REST 原则,就被称之为 RESTful 架构,这是目前最流行的互联网软件服务架构设计风格之一。REST 并不是一种标准,而更像是一种架构理念和设计原则,目的是为了让 Web API更加简洁、易于理解和使用在开发过程中,后端时常需要向客户端提供API接口进行使用,在设计API接口时我们就需要尽可能让客户端能够快速理解API含义。

2024-11-21 12:36:11 2102 48

原创 【动态规划】买卖股票相关问题

其实一共就只有两种状态,不是处于 持有 状态,就是处于 未持有 状态。2、状态转移方程f[i - 1]在i - 1天的时候「未持有」股票,在第i天买⼊股票。此时最⼤收益为可知 f[i] 就为以上两种情况下的最大值,即对于g[i],也有两种情况能够到达这种状态:在i - 1天「持有」股票,但是在第i天将股票卖出。此时最⼤收益为:f[i - 1],记得⼿续费在i - 1天「未持有」股票,然后第i天啥也不⼲。

2024-11-17 15:22:18 2315 44

原创 【动态规划】打家劫舍类问题

主要介绍了动态规划中“打家劫舍”相关问题的解决方法

2024-11-13 21:58:52 3712 57

原创 【动态规划】斐波那契数列模型总结

主要介绍了动态规划中有关斐波那契数列的一类问题的解决方案

2024-11-11 12:32:30 2012 43

原创 【spring】IOC与DI

DI,即依赖注入(Dependency Injection),是一种实现控制反转(IOC)原则的技术手段。容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。可以这样理解:IOC是一种思想,而DI则是具体实现

2024-11-07 20:54:24 3775 107

原创 【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())

主要介绍了Cookie与Session的设置与获取方法

2024-11-02 15:01:02 4137 122

原创 【Spring】Cookie与Session

SessionId 是由服务器⽣成的⼀个 "唯⼀性字符串",从 Session 机制的⻆度来看,这个唯⼀性字符串称为 "SessionId"。但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为 "token"。上述例⼦中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带⼀些其他信息,⽐如时间、签名等

2024-10-29 16:49:21 3158 100

原创 【Spring】详解SpringMVC,一篇文章带你快速入门

Spring MVC 是 Spring 框架的一个模块,专注于Web应用的表示层。它就是基于 MVC 架构模式的实现,用于构建灵活且松耦合的Web应用程序。总的来说,Spring MVC就是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。

2024-10-26 17:10:06 5597 89

原创 【网络原理】网络地址转换----NAT技术详解

NAT(Network Address Translation,网络地址转换)是一种用于重新映射一个IP地址空间到另一个IP地址空间的技术,通常用于将多个私有或内部IP地址转换为单一的公有或外部IP地址。这使得使用私有IP地址的设备可以连接到互联网上。

2024-10-24 10:06:04 3319 99

原创 【网络原理】数据链路层协议与DNS

DNS(Domain Name System,域名系统)是一种用于将人类可读的域名转换为计算机可识别的IP地址的分布式数据库系统。DNS协议的主要作用是在互联网上实现域名解析,即通过查询DNS服务器来获得特定域名对应的IP地址。

2024-10-21 12:28:44 1585 92

原创 【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

IP 地址,是用来标识网络上的某一个设备,相当于互联网中的 “身份证”。这样,我们当然希望每个设备的 IP 地址都是唯一的。这样在网络通信中就能更方便地找到每一个设备了。而上文中我们谈到,IP 地址是 32 位的整数。而 32 位表示的数据范围是 “0=>42亿9千万”。这个数字放在几十年前 IPv4 刚提出时还是个天文数字。那时候能网络上的设备数是远远达不到这个数字的,可以说绰绰有余。

2024-10-19 15:39:44 4740 84

原创 【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏

在收到数据时,先等一小会儿,缓冲区内的数据可能就会被消费而少掉很多,此时再返回给发送端 ACK时,返回的窗口大小就大概率会比立即返回更大。而窗口越大,网络吞吐量就越大,传输效率也越高。因此延迟应答在一定程度上就能提高网络传输的效率。但难道能一直延迟下去吗?延迟的时间过久也是会导致接受缓冲区爆满,引发丢包等一系列问题的。因此TCP会对延迟时间做出一些限制:

2024-10-12 18:47:24 6040 102

原创 【寻找one piece的算法之路】前缀和(一)

通过预先计算数组或矩阵的前缀和,来快速查询子数组或子矩阵的和。这种算法可以用空间换时间,提高查询效率。概念给定一个数组 A,前缀和数组 PP 定义为:P[i]=A[0]+A[1]+⋯+A[i]P[i]=A[0]+A[1]+⋯+A[i]即 P[i]P[i] 是从数组开头到位置 ii 所有元素的和计算前缀和初始化:前缀和数组的第一个元素等于原数组的第一个元素,即P[0]=A[0]。迭代计算:对于每一个i>0,计算P[i]=P[i−1]+A[i]P[i]=P[i−1]+A[i]。

2024-10-12 18:35:30 1161 21

原创 【网络原理】TCP协议提高效率的秘密-滑动窗口机制

滑动窗口机制的出现就是为了缓解TCP协议可靠传输带来的性能损失,用于在发送端和接收端之间管理数据流动的速度,通过 流量控制 与 拥塞控制 使窗口大小控制在一个合理的范围内,以避免接收端因处理能力不足而导致数据丢失或发送端因发送过快而导致网络拥塞,又通过 快速重传 产生了一种滑动的效果,尽可能的提高了传输的效率。

2024-10-11 17:35:42 3634 76

原创 【寻找one piece的算法之路】滑动窗口

滑动窗口算法是一种常用的算法模式,通常用于字符串匹配、数组操作等问题中,特别是需要在一段连续的数据中寻找满足特定条件的子序列问题。它通过维护一个窗口(一段连续的子数组或子串),并在数据结构上滑动(移动)这个窗口,来寻找最优解或者满足特定条件的子序列。

2024-10-08 21:13:36 1637 32

原创 【网络原理】面试高频考点!!TCP协议“三次握手,四次挥手”,保姆级详解,建议收藏!

第一次握手:客户端向服务器发送一个SYN(同步序列号)段(即报头中的标志位“syn”值为1),表示客户端请求建立连接。这个段落包含一个初始序列号x,用于后续的数据确认。第二次握手:服务器接收到SYN段后,向客户端发送一个SYN+ACK(确认)段作为响应。这表示服务器同意建立连接,并且告知客户端它的序列号y,同时也确认了客户端的序列号。第三次握手:客户端接收到SYN+ACK后,向服务器发送一个ACK段,确认服务器的序列号。至此,TCP连接建立完成,客户端和服务器可以开始数据交换。

2024-10-08 16:53:36 2407 57

原创 【网络原理】TCP保持“可靠传输”的秘密--确认应答与超时重传机制

重传并不会无休止地进行,当重传达到一定次数后TCP就会认为这个连接已经失效了,不会再尝试重传了。此时TCP会尝试进行“重置/复位 连接”,发送一个特殊的数据包“复位报文”,如果此时网络恢复了,复位报文就会重置连接,使通信可以继续进行。如果此时网络还是有严重问题,复位报文也没有得到回应,此时TCP就会单方面断开连接,即删除之前保存的接收方的相关信息。

2024-10-06 11:59:05 2859 70

原创 【网络原理】Udp报文结构,保姆级详解,建议收藏

UDP报头结构源端口(Source Port):16位,标识发送方的应用程序端口号。目的端口(Destination Port):16位,标识接收方的应用程序端口号。长度(Length):16位,表示整个UDP数据报的长度,包括头部和数据部分。校验和(Checksum):16位,用于检测数据报在传输过程中是否发生了损坏。此字段在某些情况下(如IPv4中)可能是可选的。

2024-10-03 20:50:41 2862 44

原创 【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?

双指针算法是一种常用的编程技巧,尤其在处理数组和字符串问题时非常有效。这种方法的核心思想是使用两个指针来遍历数据结构,这两个指针通常分别位于数据结构的起始位置或某些特定位置,通过移动这两个指针来达到解决问题的目的。双指针算法可以显著减少时间复杂度,使其从O(n2)O(n2)降低到O(n)O(n),甚至在某些情况下可以达到O(log⁡n)O(logn)。常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。对撞指针:⼀般⽤于顺序结构中,也称左右指针。对撞指针从两端。

2024-10-03 16:56:00 1411 45

原创 【网络基础】网络常识快速入门知识清单,看这篇文章就够了

TCP/IP五层协议各协议的功能:应⽤层:有开发人员自行定义,主要关注数据用来做什么,具体的功能传输层:负责两台主机之间的数据传输。主要关注数据传输的起点与终点。但并不关注数据传输的中间过程⽹络层:负责地址管理和路由选择。主要关注于传输时的路径规划数据链路层:负责设备之间的数据帧的传送和识别。关注数据在相邻两个节点间传输的具体过程物理层:负责光/电信号的传递⽅式。一般指硬件设备,如网络驱动等……

2024-10-01 20:04:02 1443 53

原创 【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!

虽然有线程安全的Hashtable或Collections.synchronizedMap(),但它们加锁的方式比较“粗暴”,运行效率往往不高。JUC中就提供了一个 ConcurrentHashMap 类,它在多线程环境下就有更高的性能,因为它采用了分段锁(segmentation)技术,而不是在整个映射上加锁。这意味着多个线程可以同时进行读取操作,甚至在某些条件下可以同时进行写入操作。

2024-09-25 21:06:35 1530 69

原创 【多线程】CAS的原理及应用,看这篇文章就够啦

CAS(Compare and Swap),中文译为“比较并交换”,是一种无锁算法中常用的原子操作。CAS通常用于实现线程之间的同步,特别是在多线程环境下需要保证原子性的场景下。CAS操作涉及三个操作数:内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置的值更新为新值。否则,操作失败,处理器不做任何事情。简单来说就是以下三步:1.⽐较 A 与 V 是否相等。(⽐较)2.如果⽐较相等,将 B 写⼊ V。(交换)3.返回操作是否成功。

2024-09-21 09:13:42 1487 73

原创 【多线程】常见的锁策略

多线程之间,数据的读取⽅之间不会产⽣线程安全问题,但数据的写⼊⽅互相之间以及和读者之间都需要进⾏互斥。如果两种场景下都⽤同⼀个锁,就会产⽣极⼤的性能损耗。所以读写锁因此⽽产⽣。读写锁(readers-writer lock),看英⽂可以顾名思义,在执⾏加锁操作时需要额外表明读写意图,重复读者之间并不互斥,⽽写者则要求与任何⼈互斥。⼀个线程对于数据的访问,主要存在两种操作:读数据 和 写数据.

2024-09-18 11:40:41 1399 78

原创 【多线程】深入剖析线程池的应用

线程池亦是如此,它预先创建了一组可重用的线程,当有新的任务提交给线程池时,线程池就会从池中取出一个空闲的线程来执行这个任务;而当线程完成任务后,它并不会被销毁,而是再次返回到线程池中等待下一个任务。从而大幅提高线程利用率,提升效率。

2024-09-16 18:24:26 819 54

原创 【多线程】深入剖析定时器的应用

定时器是软件开发中的⼀个重要组件. 类似于⼀个 "闹钟".使其能够在未来的某个时间点或按照预定的时间间隔执行某个指定好的代码。是⼀种实际开发中⾮常常⽤的组件。常见作用:1. 计划任务:定时器可以用于执行定期任务,比如数据备份、日志清理、定时发送邮件等。2. 延迟操作:可以设置一个任务在一段时间后执行,例如,实现一个倒计时功能,在特定时间后触发事件。3. 定时刷新:在Web应用中,定时器可以用于定时刷新页面或数据,保持与服务器同步的状态。

2024-09-12 09:43:55 605 55

原创 【多线程】深入剖析生产者-消费者模型

⽣产者消费者模式就是通过⼀个容器来解决⽣产者和消费者的强耦合问题。⽣产者和消费者彼此之间不直接通讯,⽽通过阻塞队列来进⾏通讯,所以⽣产者⽣产完数据之后不⽤等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取.

2024-09-05 09:57:12 1575 51

原创 【多线程】设计模式之单例模式

设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路. 按照套路来⾛局势就不会吃亏.软件开发中也有很多常⻅的 "问题场景". 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这个套路来实现代码,就可以保证代码不会太差按照设计模式编写代码能让代码更加“死板”一些。代码太过“灵活”也不见得是件好事,反而容易出现难以预料的bug。“死板”一些能一定程度上提高代码的规范性,减少bug的产生设计模式与框架:设计模式。

2024-08-31 16:02:37 1061 54

原创 【多线程】线程的等待通知机制-wait与notify

我们都知道,线程在系统调度上是随机的,因此线程之间执⾏的先后顺序难以预知。但在实际开发中有时我们希望控制多个线程执行某个逻辑的先后顺序,就可以让后执行的逻辑使用wait,先执行的线程完成某些逻辑后,再通过notify唤醒对应的线程,从而使多个线程以一定的顺序进行运行。那么本篇文章就让我们深入地去探讨wait与notify的特点与应用吧一、wait()wait 做的事情:使当前执⾏代码的线程进⾏等待. (把线程放到等待队列中)释放当前的锁。

2024-08-29 13:45:35 1299 33

原创 【多线程】深入剖析线程安全问题

主要是由于一些程序员写出的代码过于低效,为了降低程序员的门槛,即使代码水平一般,最终的运行速度也不至于太低,因此,主流编译器都会引入优化机制优化编译器会自动调整你的代码,保持在原有逻辑不变的前提下,提高代码的执行效率。在一般情况下,代码优化的效果是非常好的。但是,编译器的优化是一个非常复杂的问题,某个代码,何时优化,优化到什么程度都是不好确定的。对于程序员来说,很难确定某个代码是否会优化,并且代码稍微变化一点,优化结果可能都截然不同

2024-08-26 21:07:56 1380 29

原创 【多线程】初步认识Thread类及其应用

操作系统针对多个线程的执行,是一个“随机调度”,抢占式执行的过程。线程的调度执行是随机的,我们无法确定两个线程的调度顺序,但是可以控制谁先结束谁后结束。线程等待就是确定两个线程的结束顺序,通过让后结束的线程等待先结束的线程执行,进入阻塞状态,直到先结束的线程执行完毕,此时阻塞解除,后结束的线程开始执行。这样就能使两个线程的结束顺序得以确定

2024-08-18 16:24:30 995 31

原创 【多线程】初识进程和线程

进程是计算机中正在运行的程序的实例。它是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间、代码、数据和执行状态。进程可以独立运行,相互之间不会干扰。操作系统可以同时运行多个进程,通过分配时间片轮流执行它们,从而实现多任务处理。进程可以与其他进程进行通信和协作,共享资源和数据。

2024-08-12 14:04:47 1022 27

原创 【数据结构】Map与Set

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:1. 纯 key 模型,比如:有一个英文词典,快速查找一个单词是否在词典中快速查找某个名字在不在通讯录中2. Key-Value 模型,比如:统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号而Map中存储的就是key-value的键值对,Set中只存储了Key

2024-08-09 10:53:15 1265 17

原创 【数据结构】哈希表

虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的,也就是每个桶中的链表的长度是一个常数,所以,通常意义下,我们认为哈希表的插入删除查找时间复杂度是O(1)。因此,在频繁查找的场景中哈希表的效率是相当高的。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊。

2024-08-08 18:39:13 691 12

原创 【数据结构】二叉搜索树binarySearchTree

二叉搜索树的优点很明显,就是在查找元素时的速度能够达到,可以说查找效率非常之高了。但其也存在着缺点,就是在构成单支树是效率会递减至O(n),也就是说它的查找效率是不稳定的。为了弥补这一缺陷,努力让树的层数尽可能少,分布尽可能均衡是提升二叉树效率的关键,也就有了后来的AVL树和红黑树,不过他们的基础都是二叉搜索树,所以一定要先好好理解二叉搜索树的原理。

2024-08-07 15:09:11 859 8

空空如也

空空如也

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

TA关注的人

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