- 博客(146)
- 收藏
- 关注
原创 一文彻底搞懂 Redis 缓存穿透、击穿、雪崩与熔断机制
缓存穿透指的是用户请求的数据既不在缓存中,也不在数据库中,因此每次请求都会落到数据库。某个高并发热点 key在某一刻过期,造成大量请求同时落入数据库。在同一时间内,大量缓存 key 同时失效,导致数据库雪崩式崩溃。问题触发条件解决方式实践建议穿透数据不存在布隆过滤器、空值缓存非法参数校验、定期清理 null击穿热点数据过期加锁/逻辑过期热点数据隔离设计雪崩大量缓存同时失效TTL 随机化、本地缓存、预热Redis 分区集群化部署熔断Redis 宕机/慢响应。
2025-05-11 18:22:25
914
原创 为什么选择 MongoDB?——红包雨系统中的冷数据存储最佳实践
MongoDB 不是 Redis 的替代,而是它的完美补充。在红包雨系统架构中:Redis 负责“热数据”——缓存、计数、令牌桶、库存控制(毫秒级)MongoDB 负责“冷数据”——中奖日志、行为轨迹、分析记录(秒级或分钟级)两者协同,分别在实时性能与海量持久化方面各司其职。✅ 如果你的系统同时面对“高并发实时判断”和“高频异步数据落库”,Redis + MongoDB 的组合将是 NoSQL 架构中最具性价比的选择之一。
2025-05-11 13:43:14
433
原创 为什么选择 Redis 而不是其他 NoSQL?——基于红包雨系统的实践总结
Redis 是一个开源的基于内存的 Key-Value 数据库,支持丰富的数据结构(String、List、Hash、Set、ZSet 等),具备以下关键优势:🧠全部数据常驻内存,速度极致(<1ms)🔁支持原子命令(INCR、LPOP 等),并发操作数据绝不冲突⏱支持 TTL(Time to Live)机制,活动数据可自动清理🔄支持主从复制、哨兵、集群等高可用架构🧩数据结构丰富,极适合构建控制器如令牌桶、计数器等。
2025-05-11 13:39:39
664
原创 数据结构(大类)
构建2-3-4树的要领:跟非叶子节点比较大小,找到对应的叶子节点,往叶子节点上有序放数据,如果放满,就向上挤中间数,原节点裂成。3节点:包含两个键(数据值)和三个链(三个叉),左子树的值都不大于该节点,中子树的值位于该两个节点值之间,右子树的值都不小。4节点:包含三个键(数据值)和四个链(四个叉),左子树的值都不大于该节点,左中子树的值位于该前两个节点值之间,右中子树的值。2节点 :包含一个键(数据值)和两个链(两个叉),左子树的值都不大于该节点,右子树的值都不小于该节点。红黑树(近似平衡树(AVL))
2025-04-27 18:29:07
352
原创 Maven从无到有
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。配置项目 pom.xml,配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。
2025-04-27 18:28:13
697
原创 SpringBoot中html引入照片404失败解决方法(通配符)
通配符和**在Spring Boot中具有不同的用途,了解它们的区别可以帮助我们更好地管理包名和资源文件的匹配。:匹配一个层级,常用于包名匹配,限制较多。**:匹配多个层级,灵活性更高,适用于资源路径的匹配。通过正确使用这些通配符,我们可以更高效地组织和管理Spring Boot项目中的包结构和资源文件。这不仅提高了代码的可读性,也使得项目的维护变得更加方便。希望本文能够帮助你更深入地理解Spring Boot中的通配符用法!如果你有任何问题或想法,欢迎在下方评论区分享。
2025-04-26 21:31:31
987
原创 # 深入了解SQL基础语句及其使用案例
随着对SQL的深入学习,你将能够进行更复杂的数据分析和管理。使用`BEGIN TRANSACTION`、`COMMIT`和`ROLLBACK`来管理事务。通过本篇博客,你应该对SQL的基本操作有了更深入的了解,包括数据库和表的创建、数据的。常见的连接方式有`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`等。插入、查询、更新和删除、数据的排序与分组、聚合函数、连接、约束、视图、事务、存储过程和索引等。如果在事务中发生错误,可以使用`ROLLBACK`回滚到事务开始之前的状态。
2025-04-26 21:30:43
409
原创 SSM框架整合详细指南
为了支持MyBatis的SQL映射,创建一个Mapper XML文件。// 重定向到用户详情。使用MySQL创建一个简单的用户表。确保你的系统中安装了JDK(建议使用Java 8或以上版本)和Maven。确保安装Java和Maven插件。在IDE中右键点击项目,选择“更新Maven项目”以下载所需的依赖。- **maxWait**: 获取连接时最大等待时间(单位:毫秒)。
2025-04-26 21:29:57
1027
原创 Nginx 的轮询机制详解
轮询机制(Round Robin)是一种简单的负载均衡算法,它通过依次将客户端请求分发到后端服务器。假设有多个后端服务器,Nginx 会按顺序将每一个新请求分配给下一个服务器,当到达最后一个服务器时,循环回到第一个服务器重新分配请求。这种机制的优点在于其简单性和均衡性,适合负载较为均衡的场景,尤其是在后端服务器配置相似且无明显性能差异的情况下。Nginx 的轮询机制是其负载均衡功能的基础,尤其适合简单的均衡负载场景。
2025-04-23 14:48:02
544
原创 运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )
MinIO提供了多种语言的SDK供开发者使用,本项目需要用到Java SDK,下面通过一个简单案例熟悉一下其基本用法,具体内容可参考[官方文档](https://www.minio.org.cn/docs/minio/linux/developers/java/minio-java.html#)。对象URL为MinIO的`Endpoint`+`对象的存储路径`,例如下图中的图片对象的URL为http://211.159.166.206:9000/doctorimg/37.jpg]
2025-04-23 14:47:27
397
原创 运用MinIO技术服务器实现文件上传——在Linux系统上安装和启动(一)
随着大数据时代的到来,数据存储的需求日益增大,如何有效地存储和管理大规模的非结构化数据成为许多企业和开发者面临的挑战。MinIO 作为一个高性能、分布式对象存储系统,致力于为用户提供简单、快速、可扩展的存储解决方案。它的设计与 Amazon S3 兼容,用户可以无缝切换到 AWS 生态系统,并充分利用 S3 提供的丰富功能。MinIO 是基于 Go 语言开发的,因而其执行效率极高,并且可以灵活地支持各种非结构化数据的存储,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
2025-04-23 14:46:56
326
原创 深入剖析:Java多线程,让你的程序飞起来!
**ReentrantLock**:相比 `synchronized`,`ReentrantLock` 提供了更灵活的锁机制,允许中断锁的等待、尝试获取锁和设置公平锁等功能。通过实现 `Runnable` 接口,把线程的执行逻辑写在 `run` 方法里,再通过 `Thread` 类实例化并启动线程。启动线程时,调用 `start()` 方法。在这个例子中,`t1` 线程先获得 `lock1`,而 `t2` 线程先获得 `lock2`,并且双方都在等待对方持有的锁,从而发生死锁。
2025-04-23 14:46:17
412
原创 “深入浅出:搞懂 Cookie、Token 和 Session 的区别与应用,秒变认证达人!“
当你进入电影院时,工作人员会给你一张门票,上面写着你的“座位号”。- 每次你返回座位时,工作人员通过门票确认你的位置。- 同样,Cookie 是由服务器发给浏览器的小文件,存储在客户端,每次访问网站时会自动发送到服务器,让服务器识别出“这是你”。- 比如说,你进入大楼工作,安保部门给你一张“临时通行证”,每次进出都要出示,安保人员根据通行证判断你的权限。- Token 是一种包含用户身份的加密数据,通常包含有效期,过期后需重新获取。
2025-04-23 14:45:47
410
原创 http协议
(1)URL格式:http://hostName:portId/webAppName/[otherName/]fileName.filetype.(2)/WebAppName/fileName.filetype:用于描述资源路径,表示浏览器请求的目标:即请求的是哪个web应用的哪个资源文件。(1)发起方式:适用于请求的两种发起方式即url输入法和form元素提交法。(2)200:状态码,三位数字组成,表示服务器对请求处理的结果。(1)HTTP/1.1:表示响应所遵循的遵循的协议和版本。
2025-04-23 14:45:15
355
原创 servlet开发
当浏览器向服务器发请求访问某一资源A时,资源A无法处理响应,而是通知浏览器需要再进一步请求别的资源B才能获取对应的资源,浏览器再次请求服务器中的资源B,最终由资源B响应浏览器的过程就叫重定向。参数将被封装成request的域map集合的某个元素,需要通过request的getAttibute()方法获取。参数值是由程序员自定义的。(2)request域对象:request在实现转发时,通过request对象中的map集合共享数据,该request对象上map集合民及request对象所在的范围称为域对象。
2025-04-23 14:44:32
380
原创 MySQL数据库开发入门指南:从零开始掌握数据管理技能
如果有新的读取请求,则被延迟的行被延缓执行,直到表再次空闲时为止。关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。char(n)在保存数据时,如果存入的字符串长度小于指定的长度n,后面会用空格补全,因此可能会造成空间浪费,但是char类型的存储速度较varchar和text快。
2025-04-23 14:43:58
249
原创 《深入浅出JDBC:从连接到数据安全的全流程实战指南》
使用PreparedStatement对象是先将SQL语句的骨架发送给服务器编译并确定下来,编译之后,SQL语句的骨架和语义就不会再被改变了,再将SQL语句中的参数发送给服务器,即使参数中再包含SQL关键字或者特殊符号,也不会导致SQL语句的骨架或语义被改变,只会被当作普通的文本来处理.方法名中的BaseType指的是不同类型的数据要使用对应类型的set方法,如类型int数据,则使用setInt方法构造实参。示例:select?1.存在的隐患的现象:通过拼接特殊字符改变传送的sql语句的语义改变。
2025-04-23 14:43:17
353
原创 “Linux探秘者” - 引导读者深入探索Linux系统的内部结构和高级操作
media:Linux系统会自动识别一些设备,如:U盘光驱等,当识别后,Linux会把识别的设备挂载到该目录下。/usr:该目录存在用户很多应用程序和文件都放在该目录下,类似windows下的program files目录。/misc:该目录可以用来存放杂项文件或目录,即那此用途或含义不明确的文件或目录可以存放在该目录下。/proc:该目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问该目录获取系统信息。/var:该目录存放不断扩充着的文件,经常把被修改的目录放在该目录下,包括各种日志文件。
2025-04-23 14:42:09
318
原创 “揭开Ajax:实现无缝客户端与服务器通信的秘密”
所有Ajax请求的基于都是Html标签事件(Javascript的DOM事件),通过Javascript,调用XMLHttpRequest对象,完成与服务器端请求,并将各应结果输出到浏览器特定的Html标签,完成对网页的局部渲染更新。Ajax可以仅向服务器发送请求,在客户端使用JavaScript处理服务器端响应,取回必要的数据,因此,客户端与服务器端交换数据少,服务器端响应速度,及JavaScript处理速度都更快。因此,客户端局部所需的数据需要改变,且又不影响客户端其它操作时,则可以使用Ajax技术。
2025-04-23 14:41:35
331
原创 Spring 框架精髓:从基础到分布式架构的进阶之路
所谓耦合:在项目开发时,经常会遇到在一个程序中会new另外一个类的对象,而在new对象时,会造成当前这个程序,严重的依赖于其它对象,会造成程序之间的依赖程度提升,而程序和程序之间的依赖关系被称之为耦合。所描述的方法与装配的xml文件中的bean元素类似,区别在于:方法中的存入bean池中的对象是new的,而bean元素描述的类的对象是通过框架创建的。作用:用于指定所描述类的对象的作用域。如果有该接口的实现类,且只有一个,就会使用该实现类的对象注入@Autowired描述的对象。如下所示:。
2025-04-23 14:41:02
305
原创 “高效开发之路:用Spring MVC构建健壮的企业级应用”
A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String--> 简单类型的转换操作由ConversionService配置的转换器来完成);不需要定义|也无法定义map集合中的key,map中的key是前端的实参名,map中的value是前端的实参值。如果前端传参为多个参数,后端使用自定义类接收参数时,自定义类的属性名必须与传递的参数必须一致,属性的类型必须与实参类型相同或实参值能够转换成的类型。
2025-04-23 14:40:04
319
原创 “掌握Java集合:ArrayList、LinkedList与Vector的特性、方法与最佳实践
get(i)==null : o.equals(get(i)))条件的最低索引i的元素时才会返回true。while(ite.hasNext()) //hasNext()判断当前“指针”下面是否还有元素的方法,java中没有指针,这只是举个例子。//size()用于获取集合中有多少个元素。System.out.println("是否出现过元素1:"+linkedList.contains(1));System.out.println("链表的第一个元素:"+linkedList.getFirst());
2025-04-23 14:39:25
329
原创 “玩转Java Map集合:理解HashMap与TreeMap的结构与使用场景”
②.get(Object key) 返回指定键所映射的值,没有该key对应的值则返回 null,即获取key对应的value。⑥:remove(Object key) 删除Map集合中键为key的数据并返回其所对应value值。①.put(K key, V value) 将键(key)/值(value)映射存放到Map集合中。③. size() 返回Map集合中数据数量,准确说是返回key-value的组数。⑨:Hashmap添加另一个同一类型的map下的所有数据。④:clear() 清空Map集合。
2025-04-21 16:53:17
190
原创 Java Set 集合详解:HashSet、LinkedHashSet 和 TreeSet 的特性与应用场景分析
且向HashSet集合中添加元素,HashSet add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key不允许,所以HashSet添加的元素也不允许重复。HashSet:HashSet的性能基本上比LinkedHashSet和TreeSet要好,特别是添加和查询,这也是用的最多的两个操作。③.remove(Object o): 删除Set集合中的obj对象,删除成功返回true,否则返回false。②:size():返回Set集合中的元素个数。
2025-04-21 16:52:37
419
原创 深入理解 Spring AOP:面向切面编程的原理与应用
该类型的对象只能作为@Around注解描述的方法的形参。@Before:如果存在该注解描述的方法,则在@Around描述的方法中,调用(ProceedJoinPoint)jp.proceed()方法(即目标方法)之前调用该注解描述的方法。@After:如果存在该注解描述的方法,@AfterReturning|@AfterThrowing描述的方法执行之后执行该注解描述的方法。当@After注解描述的方法执行之后,程序会将控制权交还于@Around描述的方法,继续执行@Around描述的方法后续语句。
2025-04-21 16:52:04
858
原创 深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架
第二步:重写认证方法doGetAuthenticatingInfo方法,返回一个AuthenticationInfo的实现类SimpleAuthenticationInfo对象。2.重写Realm中的doGetAuthorizationInfo方法,用于封装数据库的保存的该用户拥有的所有授权标识以供SecurityManager授权校验时使用。(三)数据库获取用户认证信息交给Shiro框架的SecurityManager。(二)提交用户登录信息给Shiro框架的securityMananger。
2025-04-21 16:51:09
761
原创 “代码世界的必修课:Git完整指南“(3)
Gitlab的rpm包集成了它需要的软件,简化了安装步骤,所以直接安装rpm包即可,rpm包的获取从官方网站或者国内镜像源(如:清华https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/)获取,gitlab又分为社区版和企业版(收费),这里部署的是社区版本10.8.4。跟添加公钥的步骤完全一致。-rw-r--r-- 1 rlsl180506 197121 4529 2月 19 11:26 import-into-eclipse.bat。
2025-04-21 16:50:32
346
原创 “代码世界的必修课:Git完整指南“(2)
1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
2025-04-21 16:48:06
825
原创 “代码世界的必修课:Git完整指南“(1)
首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。这时候你当前testgit目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。
2025-04-21 16:47:35
599
原创 使用 JWT 实现安全认证的技术详解
**Token 的存储**:在前端,应将 JWT 安全地存储在 `LocalStorage`、`SessionStorage` 或 `HttpOnly Cookie` 中。3. **验证 Refresh Token**:服务器验证 Refresh Token 的合法性,如果有效,则重新生成新的 Access Token 并返回给客户端。- **基于 IP 地址或设备 ID**:Token 的生成和验证可以基于用户的 IP 地址、设备 ID 等信息,确保 Token 只能在特定设备或网络环境下使用。
2025-04-21 16:47:00
835
原创 “Java面试必看:从基础到进阶的全方位准备指南“(1)
**128陷阱**:Java中的`Integer`类缓存了-128到127范围内的整数对象。由于缓存机制,当创建范围内的整数时,不会创建新的对象,而是直接返回已有的对象,这一现象被称为“128陷阱”。对于`-128到127`之间的整数,Java不会新建对象,而是直接复用缓存对象。例如:// 输出false,a和b是不同的对象// 输出true,c和d指向缓存中的同一个对象- **装箱**(Boxing):将基本数据类型(如`int`)转换为对应的包装类对象(如`Integer`)。
2025-04-21 16:46:10
824
原创 博客一:深入理解Java异常处理机制:try-catch-finally背后的原理与最佳实践
Java的异常处理机制提供了强大的错误恢复能力,但这并不意味着开发者可以不加思考地使用异常。合理的异常处理应该能提高代码的可维护性和可读性,且不会成为程序逻辑的负担。
2025-04-21 16:45:25
735
原创 日志相关问题
MySQL 在完成一条更新操作后,Server 层还会生成一条 binlog,等之后事务提交的时候,会将该事物执行过程中产生的所有 binlog 统一写 入 binlog 文件,binlog 是 MySQL 的 Server 层实现的日志,所有存储引擎都可以使用。不行,binlog是 server 层的日志,没办法记录哪些脏页还没有刷盘,redolog 是存储引擎层的日志,可以记录哪些脏页还没有刷盘,这样崩溃恢复的时候,就能恢复那些还没有被刷盘的脏页数据。这样可以减少磁盘的随机I/O操作,提高写入性能。
2025-04-21 16:42:26
646
原创 用redis怎么实现分布式?
锁变量的值需要能区分来自不同客户端的加锁操作,以免在释放锁时,出现误释放操作,所以,我们使用 SET 命令设置锁变量值时,每个客户端设置的值是一个唯一值,用于标识客户端;可以看到,解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性,因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,保证了锁释放操作的原子性。然后判断当前创建得节点是不是/locks路径下面最小的节点,如果是,获取锁,不是,阻塞线程,同时设置监听器,监听前一个节点。
2025-04-21 16:38:25
665
原创 什么是ddos攻击?怎么防范?
应用层攻击:比较典型的攻击类型包括DNS flood攻击、HTTP flood攻击、游戏假人攻击等,这类攻击占用服务器的应用处理资源极大的消耗服务器处理性能从而达到拒绝服务的目的。网络层攻击:比较典型的攻击类型是UDP反射攻击,例如:NTP Flood攻击,这类攻击主要利用大流量拥塞被攻击者的网络带宽,导致被攻击者的业务无法正常响应客户访问。传输层攻击:比较典型的攻击类型包括SYN Flood攻击、连接数攻击等,这类攻击通过占用服务器的连接池资源从而达到拒绝服务的目的。
2025-04-21 16:33:26
338
原创 打开百度首页后发生的网络过程
然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相结合,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 ARP 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
2025-04-21 16:24:03
400
原创 JWT 令牌为什么能解决集群部署,什么是集群部署?
而JWT令牌通过在令牌中包含所有必要的身份验证和会话信息,使得服务器无需存储会话信息,从而解决了集群部署中的身份验证和会话管理问题。但在集群部署中,不同服务器之间没有共享的会话信息,这会导致用户在不同服务器之间切换时需要重新登录,或者需要引入额外的共享机制(如Redis),增加了复杂性和性能开销。客户端收到服务器返回的 JWT,可以储存在 Local Storage 里面,也可以储存在Cookie里面,还可以存储在Session Storage里面。另外,持久层万一挂了,就会单点失败。
2025-04-21 16:21:36
718
原创 DNS 基于什么协议实现?UDP 还是 TCP?
UDP负责快速查询,适合常规的小数据包传输。TCP负责可靠传输,适合大数据包和区域传输。因此,DNS 是UDP 和 TCP 协议的结合体,共同保证了域名解析的效率与可靠性。
2025-03-16 13:53:02
1026
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人