自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 IO模型 之阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO

信号驱动式I/O模型:只点一个菜,然后给服务员留下手机,告诉他菜准备好了打个电话给你,先不要上菜,然后你就出去玩耍了,等到菜好了,服务员手机通知你,你立马回到了餐厅,对服务员说“你现在可以上菜了”,于是你在餐桌上等待服务员把菜送上来,然后吃饭。如上图所示,当需要等待数据的时候,首先用户态会向内核发送一个信号,告诉内核我要什么数据,然后用户态就不管了,做别的事情去了,而当内核态中的数据准备好之后,内核立马发给用户态一个信号,说”数据准备好了,快来查收“,用户态进程收到之后,立马调用。

2024-05-23 16:59:25 814

原创 HTTPS 从懵懵懂懂到认知清晰、从深度理解到落地实操

在现代互联网应用中,网上诈骗、垃圾邮件、数据泄露的现象时有发生。为了,我们都会选择采用https技术。甚至iOS开发调用接口的时候,必须是https接口,才能调用。现在有部分浏览器也开始强制要求网站必须使用https,网站网页基于https已经势不可挡。https的时代已经到来。TLS(Transport Layer Security) 是 SSL(Secure Socket Layer) 的后续版本。

2024-03-26 09:14:40 1204 2

原创 Java网络编程-Socket编程(五AIO模型的简版客户端-服务器)

这里实现一个很简单的客户端-服务器,客户端连接服务器后,发送消息给服务器,服务器直接返回该消息给客户端即可,这只是个尝鲜版,以后也会用AIO模型来实现多人聊天室。的实现类AcceptHandler来实现异步调用,因为有回调机制),使用System.in.read()来减少while循环中频繁异步调用accept。实例,再调用该实例的get方法会阻塞,等待该方法调用完成,阻塞便解除(具体看代码吧,客户端比较简单,注释还是比较全的)。的回调函数),在回调函数里面再异步调用read。方法实现异步调用(通过。

2024-05-23 17:30:36 563

原创 Java 网络编程模型(新)AIO原理

和多路复用的Java NIO相比较,可以发现,异步IO是在数据读取或者写入调用已经完成的时候,再通知调用者,而非阻塞多路复用IO则是在有数据就绪,可以读写的时候通知调用者,读写仍然是由调用者执行,并且是阻塞的(这意味着如果要同时进行其他工作,要控制读写操作不能阻塞太长时间或者需要将其放去单独的IO线程执行)。因为AIO的实现需要充分调用OS,IO需要操作系统支持、并发也同样需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。除了CompletionHandler。目前为止,Java共支持3种。

2024-05-23 17:09:10 874

原创 Java 网络编程-Socket编辑(四NIO模型的简版多人聊天室)

像BIO模型和伪异步I/O模型实现的服务器,当有客户端连接服务器后,服务器需要创建一个线程来与用户进行通信,当客户端连接请求并发数很大时,服务器需要创建的线程就非常多了,这样带来的上下文切换、内存开销都非常大,并且创建的线程还是阻塞式的,性能较差。事件触发后,也就意味着有客户端连接上了服务器,所以需要创建一个线程来监听用户的输入(这个实现不需要变),并且还需要将。即可,用户发送消息给服务器就会触发该事件,而不需要创建线程去一直阻塞式的监听用户发送过来消息,有了。事件,所以服务器可以很方便的拿到用户的。

2024-05-22 11:36:58 622

原创 Java IO与NIO来Copy文件的四种方法实现以及性能对比

利用缓冲区,会大大提升性能,因为避免了频繁的打开、关闭文件,有了缓冲区,我们每次对文件进行读、写操作,都可以读、写更多字节数据,减少了打开、关闭文件等操作的次数。的,read()的源码注释很清楚的写出来了,所以这种方法的性能特别差,等下用较大文件测试时,我们选择跳过这种方法(因为太久了),内部逻辑应该很简单吧,从。我测试了很多次,需要缓冲区的方法,性能跟文件大小、缓冲区大小都有关系。的返回值是介于0-255的值,其实就是读取的一个字节(8位)来进行文件的Copy,它们会产生一个缓冲区,默认大小都是。

2024-05-17 17:35:36 1055

原创 Java 网络编程-NIO原理概述

,Server为每个Client连接创建一个处理线程,每个处理线程阻塞式等待可能达到的数据,一旦数据到达,则立即处理请求、返回处理结果并再次进入等待状态。但当系统负载增大(并发请求增多)时,Server端需要的线程数会增加,对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存)。它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。因此,单个的线程可以监听多个数据通道。

2024-05-17 17:12:47 1008

原创 Java网络编程-Socket编程(三伪异步I/O模型的简版多人聊天室)

只需要改动服务器端的代码,将每次客户端连接成功后都创建新线程来与客户端进行数据交互,改进成由线程池来管理线程去与客户端进行数据交互。由改进的代码可以知道,当大量客户端向服务器发出连接请求后,服务器虽然可以与这些客户端进行连接,但最多只有。模型是每次客户端的连接请求成功后,都创建新的线程去与客户端进行数据交互,虽然差别不大,但。两个模型差别不大,也就意味着需要改动代码的地方很少,如果需要代码解释,请看下面这篇博客。关于线程池的使用,这里也只是涉及皮毛,也不打算多讲,相信大家都看得懂。ChatServer类(

2024-05-17 17:02:54 249

原创 Java 网络编程-Socket编程(二基于BIO模型的简版多人聊天室)

UserInputHandler类,是客户端创建线程用于监听用户的控制台输入,所以它也实现了Runnable接口,方便创建线程,当它监听到用户在控制台输入信息后,会将用户输入的信息发送给服务器,服务器当然也会将该信息转发给其他的用户。有用户连接后,就创建一个新的线程用于与该用户进行数据交互,主线程依然等待用户连接请求,新开的线程,会将用户添加到存储在线用户的容器中,并且一直读取用户发送过来的消息,再将该消息转发给其他用户,直到该用户退出,当该用户退出时,就将该用户在存储在线用户容器中移除,再关闭资源。

2024-05-17 16:51:21 835

原创 Java 网络编程-“BIO”模型与 -“伪异步I/O”模型

为了改进这种一连接一线程的模型,我们可以使用线程池来管理这些线程,实现一个或多个线程处理多个客户端请求的模型(服务端的线程个数和客户端并发访问数呈M:N的关系,N可以远远大于M,但是底层还是使用的同步阻塞I/O),通常被称为。该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,Java中的线程也是比较宝贵的系统资源,采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后,为。

2024-05-17 16:38:07 167

原创 Java 网络编程-Socket编程(一、简易客户端-服务器)

很显然,客户端调用Socket构造器,创建了Socket,并且连接了服务器(服务器已经运行的情况下)。上面是服务器读取客户端发送的消息的代码,一行一行的读取消息,并且只有当客户端发送“quit”给服务器时,才表示此客户端要退出,并且在这个过程中其他客户端是不能与服务器进行连接的,因为服务器一直在while里面读取此客户端发送的数据,不过,这只是一个体验版,以后会一步一步进行升级的,毕竟学习也是一步一步学出来的。向服务器发送消息,并且接收服务器的回复,也是一行一行的读取。大家也自己进行测试,应该是没问题的。

2024-05-17 16:27:50 1054

原创 Java 网络编程-Socket介绍

客户端申请连接,服务器接受申请,并且回复申请许可(这里要涉及TCP三次握手连接),然后发送数据,最后关闭连接,这是一次交互过程。在插座这边的是“客户端”,电线那边提供电的发电厂是“服务器”。如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”电器使用的电可以看做是网络资源或者是各种“流”,电是由电线传输过来的,所以插座需要连接电线,这里电线也就是服务器和客户端连接 “connection”

2024-05-17 16:11:37 285

原创 Java IO体系学习总结

不仅如此,传统的输入流、输出流都是通过字节的移动来处理的(即使我们不直接处理字节流,但底层实现还是依赖于字节处理),也就是说,面向流的输入和输出一次只能处理一个字节,因此面向流的输入和输出系统效率通常不高。从图15.4可以看出,当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入和输出节点连接。使用处理流的一个明显的好处是,只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装的节点流的变化,程序实际所访问的数据源也相应的发生变化。

2024-05-17 16:03:29 786

原创 一次读懂:一台计算机是如何把数据发送给另一台计算机

当发送时,计算机 A 是通过广播的方式发送的,这时同一个子网中的计算机 C, D 也会收到这个数据包的,然后收到这个数据包的计算机,会把数据包的 MAC 地址取出来,与自身的 MAC 地址对比,如果两者相同,则接受这个数据包,否则就丢弃这个数据包。其实在询问MAC地址的数据包中,在对方的MAC地址这一栏中,填的是一个特殊的MAC地址,其他计算机看到这个特殊的MAC地址之后,就能知道广播想干嘛了。假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个子网的,我们就会把数据发给。

2024-05-17 15:14:29 953

原创 同步异步(java交互方式)

Java 数据交互方式 同步与异步

2024-05-17 14:17:13 267

原创 虽然工作好久好久了,Spring 框架还是很有必要反复的去思考去理解

spring

2024-05-14 10:19:17 98

原创 加密、解密、签名、验签之RSA的原理及方法 , 使倒推法来捋

RSA 加密、解密、签名、验签

2024-03-28 14:06:36 764 1

原创 当Java程序员拿到一个新的需求时,应该做些什么事情!小板凳坐好发车了

通过与他们交流,可以澄清疑惑,获取更多的信息和解释,确保对需求的理解是准确无误的。同时,也可以进行技术评估和试验,对不同的技术方案进行比较和验证,选择最适合项目的技术和框架。此外,与团队成员进行充分的讨论和沟通,权衡各种因素,能够确保技术选型的合理性和可行性。编码实现阶段是项目的具体实施阶段,注重代码质量和规范能够提高代码的可维护性、可扩展性和可读性,减少错误和维护成本。在整个过程中,良好的沟通和团队协作至关重要,及时与团队成员、项目经理和其他相关人员进行沟通,确保需求的实现符合预期。

2024-03-26 12:50:12 831

原创 怎么根据浏览器页面和后台代码, 倒退系统业务流程的方案与步骤

通过以上步骤,你可以逐步倒退系统的业务流程,并更好地理解系统的工作方式和各个部分之间的关系。通过查看 HTTP 请求的参数、URL、头部信息等,以及后台代码中对这些请求的处理逻辑,了解数据的传递和业务逻辑的触发。通过模拟用户在前台浏览器页面上的操作,结合后台代码的执行情况,逐步推导和理解系统的业务流程。了解数据库表的设计、对象之间的关联以及数据的操作方式,这将有助于理解业务数据在系统中的流转和处理。查阅系统的相关文档和代码中的注释,它们可能包含对业务流程的解释和说明,这对于理解系统的设计和功能非常有帮助。

2024-03-26 10:09:58 843

原创 坐好小板凳,让你一次性搞定 “传说中的--系统调用“

*本篇文章主要讲述以下两部分:**1.什么是系统调用?2.系统调用的实现?主要以Linux 操作系统和IA-32处理器举例,高级语言以C语言为例,同时也会掺杂一些其它操作系统和处理器。什么是系统调用?对于现代的操作系统来说,应用程序运行的时候是没有权限去访问系统资源的,操作系统为了防止各类应用程序可能会破坏系统资源,对系统资源做了保护,阻止应用程序直接去访问这些资源,而应用程序又有访问这些系统资源的需求,因此操作系统提供了系统调用,让所有的应用程序统一通过系统调用来访问系统资源。

2024-03-22 17:31:32 998

原创 老司机们请上车! 坐好小板凳 干货来了-CPU 中的registers 、pc 、alu ,cu、mmu、cache 深度理解 概念和它们的工作原理

总体而言,这些组件相互协作,共同构成了计算机系统的硬件基础,实现了数据处理、存储和设备通信等功能。寄存器、ALU、CU、MMU 等组件构成了 CPU 的核心部分,协同工作以执行指令和处理数据。Cache 是一种高速的内存,位于 CPU 和主存储器之间,用于存储经常访问的数据和指令。ALU 是 CPU 的核心组件之一,负责执行算术运算(如加、减、乘、除)和逻辑运算(如与、或、非)。在每个时钟周期,PC 会递增,指向下一条指令的内存地址,CPU 根据 PC 中的地址从内存中读取指令并执行。

2024-03-21 15:02:49 646

原创 一次性捋清楚 用户、部门、 角色、 权限 、 菜单权限、 数据权限 的关系

而菜单权限可以让不同角色的用户看到不同的功能模块,如采购部门的用户可能只能看到与采购相关的菜单,而看不到财务模块。总的来说,数据权限和菜单权限都是系统安全和访问控制的重要组成部分,它们共同作用确保用户只能进行与其权限相匹配的操作,保护数据的完整性和安全性,同时提供了良好的用户体验和系统功能的合理分配。通过明确用户、部门、角色、权限、菜单权限和数据权限之间的关系,可以建立一个结构清晰、权限合理的系统,满足公司的管理需求。通过这样的表设计,可以清晰地表达用户、部门、角色、权限、菜单权限和数据权限之间的关系。

2024-03-21 11:50:13 2752 1

原创 Spring Security、OAuth2 、 JWT的认证授权 , 解决了什么问题,和应用场景 (一) 老司机们请上车

这些技术的组合使用可以提供一种安全、灵活和可扩展的认证授权解决方案。通过使用 Spring Security、OAuth2 和 JWT,开发人员可以更好地保护系统的安全性,控制用户的访问权限,并提供便捷的认证和授权体验。综上所述,使用 Spring Security、OAuth2 和 JWT 可以构建一个安全、灵活和可扩展的认证授权系统,保护应用程序的资源不被未授权的访问,并提供了方便的授权管理和用户体验。Spring Security 提供了强大的认证和授权机制,确保只有授权的用户能够访问系统的资源。

2024-03-20 10:37:01 1087 1

原创 Stream 较全套的,整理出来了!老司机们

Java 8 的 Stream API 提供了丰富的方法来处理流。以下是一些常见的 Stream API 方法示例,但这并不是完整的列表,具体的方法可能因 Java 版本和类库的不同而有所差异。

2024-03-19 16:01:47 348 1

原创 盘点 Java Code 中 Apache HttpClient、OkHttp、Retrofi、Spring RestTemplate、Jersey/JAX-RS 发送请求,以及他们的xxxUtils

请注意,这只是一个简单的工具类示例,可能需要根据你的具体需求进行更多的错误处理、响应解析和扩展。例如,根据响应的状态码进行不同的处理,或者将响应内容转换为特定的对象。请注意,这只是一个简单的工具类示例,可能需要根据你的具体需求进行更多的错误处理、配置和扩展。例如,根据响应的状态码进行不同的处理,或者将响应内容转换为特定的对象。还要注意,根据你的具体环境和项目设置,可能需要引入 Apache HttpClient 的相关依赖,并在构建工具(如 Maven)中进行配置。执行请求,并根据响应的状态码处理结果。

2024-03-19 15:34:42 1037 1

原创 盘点 java中高并发场景与解决方案

数据分片可以使用水平分片和垂直分片,水平分片是将数据按照一定的规则分割到不同的表或数据库中,垂直分片是将数据按照不同的列分割到不同的表中。这些技术手段可以提高系统的并发处理能力、降低系统的响应时间、提高系统的可用性和扩展性。在高并发场景中,常见的技术点有很多,比如分布式系统中的数据一致性问题、缓存中的雪崩问题、消息队列中的消息丢失问题、负载均衡中的请求分配问题等。在这些场景下,会有大量的用户同时访问同一个系统或服务,导致系统的负载急剧增加,可能会出现响应时间变慢、系统崩溃等问题。

2024-01-13 11:51:25 1844 3

原创 对上篇一口气看完java多线程(全)的补充

然后提交了 10 个任务到线程池。如果队列已满,并且线程池中的线程数尚未达到最大线程数,那么线程池会创建新的线程来执行任务。如果队列已满,并且线程池中的线程数已经达到最大线程数,那么线程池会拒绝新的任务,并抛出 RejectedExecutionException 异常。1. 提交任务:当调用 execute() 方法提交任务时,线程池会根据当前线程池的状态和核心线程数来决定是否创建新的线程来执行任务。- STOP:线程池处于停止状态,不能接受新任务,也不能执行已提交的任务,并且会尝试停止正在执行的任务。

2024-01-13 09:26:52 347 1

原创 一口气看完系列 java多线程(全)

比如说,线程池是一种线程管理机制,它可以在程序启动时创建一组线程,并将它们放在线程池中,当任务到达时,线程池会从池中选择一个线程来执行任务,执行完任务后,线程会返回线程池,等待下一个任务的到来。后台线程是指在后台执行一些与用户交互无关的任务的线程,它们与程序的主线程并发执行,但是当主线程结束时,后台线程也会自动结束。最后,启动了用户线程和守护线程,并等待用户线程执行完毕。请注意,由于线程池的大小是固定的,因此如果提交的任务数量超过了线程池的大小,那么任务会被阻塞,直到线程池中的线程空闲为止。

2024-01-13 09:00:22 484 1

原创 一口气看完 java分布式锁的实现方案

如果获取锁成功,我们输出“获取锁成功”,并执行需要互斥访问的代码,最后释放锁。嗯,当多个进程同时尝试获取锁时,只有第一个成功向分布式协调服务发送请求的进程才能获得锁,其他进程会等待或者返回失败。嗯,当多个进程同时尝试获取锁时,只有第一个成功插入记录的进程才能获得锁,其他进程会等待或者返回失败。嗯,当多个进程同时尝试获取锁时,只有第一个成功向分布式协调服务发送请求的进程才能获得锁,其他进程会等待或者返回失败。在代码中,我们只需要调用分布式协调服务的 API 来获取锁和释放锁,不需要关心锁的具体实现细节。

2024-01-12 21:25:48 370 1

原创 Redis 持久化方案详细版

不过,如果你只想使用 RDB 持久化,也可以在配置文件中把 aof-use-rdb-preamble 参数设置为 no,这样 Redis 就只会使用 RDB 持久化了。具体来说,RDB 文件的默认位置是 Redis 安装目录下的 dump.rdb,AOF 文件的默认位置是 Redis 安装目录下的 appendonly.aof。这样,在 Redis 重启的时候,就可以先加载 RDB 文件,然后再重放 AOF 文件中的增量命令,来恢复数据。如果你需要更详细的信息,可以参考 Redis 的官方文档。

2024-01-12 15:11:06 359 1

原创 一口气看完 Mysql高阶扩充

雪花算法是一种生成全局唯一标识符的算法,它可以保证生成的标识符在分布式系统中是唯一的。这样可以减轻数据库的负载,提高数据库的性能和并发处理能力。分表分库的主要目的是提高数据库的查询性能和并发处理能力,同时降低数据库的负载和提高系统的可用性。雪花算法的具体实现方式可能会因编程语言和应用场景的不同而有所差异,但其核心思想是通过一定的规则生成一个 64 位的整数,其中包含了时间戳、机器标识符和序列号等信息。7. 将时间戳的高位部分、机器 ID 的高位部分和序列号的高位部分进行或运算,得到最终的 ID。

2024-01-12 13:08:58 390 1

原创 一口气盘点 Myaql底层原理(高阶)

还有,如果你在查询中使用了联合索引,但是没有按照索引的顺序进行查询,像这样 WHERE column_name = 'value' AND column_name2 = 'value2' ,但是联合索引的顺序是 (column_name1, column_name2) ,那么索引也会失效。回表:是指在使用索引进行查询时,如果查询条件没有利用到索引的最左列,或者需要获取索引列之外的数据行信息,就会导致 MySQL 需要在索引树中查找对应的值,并通过书签查找来获取实际的数据行,这个过程就称为回表。

2024-01-12 12:49:43 547 1

原创 一口气盘点 mysql涉及的知识点(一)

隔离性是指事务之间相互隔离,互不干扰;如果该行的版本号小于 ReadView 中的最小版本号,或者该行的版本号大于 ReadView 中的最大版本号,或者该行的版本号等于 ReadView 中的某个版本号,并且事务 ID 不在 ReadView 中的活跃事务 ID 列表中,那么该行就是可见的。例如,有两个事务 T1 和 T2,T1 对表中的数据进行了修改,但还没有提交事务,此时 T2 读取了表中的数据,T2 读取到的就是 T1 未提交的数据,如果 T1 后来回滚了事务,那么 T2 读取到的数据就是脏数据。

2024-01-12 12:08:17 333 1

原创 java 并发包中基于AQS实现的锁的原理与各种锁的使用

ReentrantLock 的内部实现使用了 AQS,它维护了一个线程的计数器,用于记录当前持有锁的线程的数量。公平锁是指按照线程请求锁的顺序来分配锁,而非公平锁是指可能会优先分配锁给已经等待了较长时间的线程。当线程释放资源时,就会增加计数器的值。AQS 的机制是通过队列来管理等待锁的线程,当一个线程获取不到锁时,就会被加入到队列中,并在合适的时候被唤醒尝试获取锁。AQS 的核心思想是使用队列来管理等待锁的线程,当一个线程获取不到锁时,就会被加入到队列中,并在合适的时候被唤醒尝试获取锁。

2024-01-11 18:59:18 343 1

原创 总结java中常用数据结构和实现原理

哈希表-的实现原理是用数组和链表来实现,它在代码中的体现是使用一个数组来存储哈希值,然后使用链表来存储具有相同哈希值的元素,通过哈希函数来计算元素的哈希值,并根据哈希值来确定元素的存储位置。二叉树-的实现原理是用节点来存储数据,每个节点最多有两个子节点,它在代码中的体现是使用结构体来表示节点,然后通过指针来连接节点,通过递归的方式来遍历二叉树。数组-的实现原理是用连续的内存空间来存储数据,它在代码中的体现是使用一个整数类型的指针来指向数组的首地址,然后通过索引来访问数组中的元素。

2024-01-11 12:08:16 387 2

原创 java 四类-集合与其子类的数据结构

HashSet 呢,是基于哈希表实现的,不保证元素的顺序,查找快。TreeSet 呢,是基于红黑树实现的,可以保证元素的排序,查找慢。HashMap 呢,是基于哈希表实现的,不保证键值对的顺序,查找快。TreeMap 呢,是基于红黑树实现的,可以保证键值对的排序,查找慢。LinkedHashMap 是基于哈希表和链表实现的,它保证键值对的插入顺序,并且不允许键值对重复。总的来说, Queue 接口及其子接口和实现类提供了多种不同的数据结构和线程安全性的队列,你可以根据具体的需求选择合适的队列来使用。

2024-01-11 11:26:07 746 1

原创 CAP定理的一致性、可用性、分区容错性理解

这是因为在分布式系统中,网络延迟、节点故障、数据复制等因素都会导致数据的不一致性,如果要保证一致性,就需要在某些情况下牺牲可用性或者分区容错性。嗯,CAP 定理在分布式系统的设计和实现中有着重要的指导意义,它告诉我们在选择系统的架构和策略时,需要根据业务需求和场景来权衡这三个属性之间的关系。CAP 定理: 它是分布式系统中的一个重要理论,它指出了在分布式系统中,一致性、可用性和分区容错性这三个属性之间的 trade-off 关系。一致性是指所有节点在同一时间看到的数据是一致的;

2024-01-10 18:44:12 516

原创 缓存Redis概念 与雪崩、击穿、穿透问题的解决方案

嗯,布隆过滤器里面的数据是在插入的时候加载进去的,它不存储具体的数据,只存储数据的哈希值。一种是在缓存失效的时候,加一个随机的延迟,这样可以错开缓存失效的时间,减少对数据库的压力。另外,也可以使用缓存预热,在系统启动的时候,把一些常用的数据预先加载到缓存中,这样可以减少缓存失效的次数。一种是使用互斥锁,就是在缓存失效的时候,加一个锁,只有一个线程可以访问数据库,其他线程等待。比如说,可以使用二级缓存,在一级缓存失效的时候,先去查询二级缓存,嗯,除了上面说的方法,还有一些其他的方法可以解决缓存雪崩的问题。

2024-01-10 18:16:30 537

原创 什么是幂等性与实现方案

在电商系统中,为了保证幂等性,通常会生成一个唯一的订单号,并将其与订单信息关联起来。当一个请求被处理后,系统会记录下这个请求的唯一标识符,并且在后续的请求中检查是否已经处理过相同的标识符。这确实是个容易忽视的问题😔 这种情况下,第二次请求会覆盖第一次请求的订单信息,导致第一次请求的订单信息丢失。需要注意的是,为了保证订单号的唯一性,通常会使用一些生成唯一标识符的算法,例如 UUID、Snowflake 等。也就是说,不管这个请求被执行了多少次,它的影响都是相同的,不会因为多次执行而产生不一致或错误的结果。

2024-01-10 13:24:46 452

原创 java 中的双删理解

但是,如果在用户 A 修改订单信息的过程中,系统出现了故障,比如说停电了,那么用户 A 的修改操作就没有完成。如果这个时候,有另一个用户 C 要读取这个订单信息,他会先去缓存中查找,由于缓存中没有,他就会去数据库中查找,并且把数据库中的订单信息读取出来,然后更新到缓存中。比如说,有一个用户 A 要修改他的订单信息,这个时候,系统会先把缓存中的订单信息删除,然后再去修改数据库中的订单信息。如果这个时候,有另一个用户 B 要读取这个订单信息,他会先去缓存中查找,如果缓存中没有,他就会去数据库中查找。

2024-01-09 16:46:51 380

空空如也

空空如也

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

TA关注的人

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