- 博客(36)
- 收藏
- 关注
原创 JWT的双token(access_token+refresh_token)授权和续期
当用户登出或检测到潜在的安全风险时,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_toke。通常包含用户敏感信息且为了安全考虑设置较短的过期时间,这可能导致用户在长时间使用应用时频繁遇到登录过期的问题,特别是在进行长时间操作如填写复杂表单时,如在线考试。微服务架构中,JWT认证方案中,用户登录成功后,后端会生成一个JWT格式的。过期的错误码后,在用户无感知的情况下,使用。的使用应受频率限制,防止滥用。
2024-10-22 13:56:50
2125
1
原创 Redis 的三种集群模式
首先,你会知道有三种集群模式然后对每种集群模式的原理有个大概了解当然还能看到集群演变的影子最后还会有手把手的实操Redis 支持三种集群方案主从复制模式Sentinel(哨兵)模式Cluster 模式。
2024-10-20 14:20:18
1399
1
原创 这几招轻松解决空指针
相信不少小伙伴已经被java的NPE()所谓的空指针异常搞的头昏脑涨,有大佬说过 防止 NPE,是程序员的基本修养。但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性Optional来尽量简化代码同时高效处理NPE(空指针异常)
2024-10-15 17:29:05
1045
原创 JAVA 泛型中的通配符 T,E,K,V
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
2024-10-12 16:18:42
671
原创 Java泛型
1、泛型的本质是为了参数化类型,也就是在在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型,很明显这种方法提高了代码的复用性。2、泛型的引入提高了安全性,泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。。3、在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。
2024-10-12 16:06:53
1038
原创 RabbitMQ安装
下面给admin赋权,用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限。上传到/usr/local/software 目录下(如果没有 software 需要自己创建)rabbitmq提供的有web版的管理系统,地址。出现权限问题,需要创建一个用户,如何整?用默认账号密码(guest)访问地址。
2024-10-11 10:20:25
417
原创 RabbitMQ介绍
Broker:接收和分发消息的应用, RabbitMQ Server 就是 Message Broker:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/ queue 等Connection: publisher/ consumer 和 broker 之间的 TCP 连接。
2024-10-11 10:15:48
557
原创 MQ 的相关概念
MQ(message queue),从字面意思上看,本质是个队列, FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中, MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
2024-10-11 10:14:33
910
原创 Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)
为了确保分布式锁可用,我们至少需要确保分布式锁的实现同时满足以下四个条件互斥性,在任意时刻只能有一个客户端能够持有锁不糊发生死锁,即使有一个客户端在持有锁期间崩溃而没有释放锁,也能够保证后续其他客户端能够加锁解锁还需寄铃人,加锁和解锁必须是同一个客户端,客户端不能把别人的锁给解了加锁和解锁必须有原子性。
2024-10-11 10:09:21
1122
原创 Redis持久化之AOF(Append Only File)
AOF文件是一个只进行追加的日志文件Redis可以在AOF文件体积变得过大时,自动地在后台对AOF文件进行重写AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松。对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积根据所使用的fsync策略,AOF的速度可能会慢于RDB官方推荐2个都启用。如果对数据不敏感,可以单独用RDB。不建议单独使用AOF,因为可能会出现BUG。
2024-10-11 10:05:14
1084
原创 Redis持久化之RDB(Redis DataBase)
Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。Redis的数据也支持写到硬盘中,这个过程就叫做持久化。Redis提供了2种不同形式的持久化方式。
2024-10-11 10:01:24
1141
原创 Redis 5大数据类型
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M单键多值redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
2024-10-10 15:52:27
1552
原创 Redis概述和安装
默认端口6379默认16个数据库,类似数组的下标从0开始,初始默认使用0号库使用select <dbid>来切换数据库,如:select 1,切换到第2个库统一密码管理,所有的库密码相同dbsize:查看当前数据库的key的数量flushdb:情况当前库flushall:清空全部库redis是单线程+多路IO复用技术。
2024-10-10 15:14:21
864
原创 Spring声明事务
所谓声明式事务,就是通过配置的方式,比如通过配置文件(xml)或者注解的方式,告诉spring,哪些方法需要spring帮忙管理事务,然后开发者只用关注业务代码,而事务的事情spring自动帮我们控制。比如注解的方式,只需在方法上面加一个注解,那么方法执行之前spring会自动开启一个事务,方法执行完毕之后,会自动提交或者回滚事务,而方法内部没有任何事务相关代码,用起来特别的方法。
2024-10-10 10:53:54
1415
原创 Spring中编程式事务怎么用
通过硬编码的方式使用spring中提供的事务相关的类来控制事务。大家看了之后,会觉得这样用好复杂啊,为什么要这么玩?的确,看起来比较复杂,代码中融入了大量spring的代码,耦合性比较强,不利于扩展,本文的目标并不是让大家以后就这么用,主要先让大家从硬编码上了解spring中事务是如何控制的,后面学起来才会更容易。我们用的最多的是声明式事务,声明式事务的底层还是使用上面这种方式来控制事务的,只不过对其进行了封装,让我们用起来更容易些。下篇文章将详解声明式事务的使用。
2024-10-10 10:45:38
1114
转载 Aop概念详解
先看一下传统程序的流程,比如银行系统会有一个取款流程我们可以把方框里的流程合为一个,另外系统还会有一个查询余额流程,我们先把这两个流程放到一起:有没有发现,这个两者有一个相同的验证流程,我们先把它们圈起来再说下一步:上面只是2个操作,如果有更多的操作,验证用户的功能是不是需要写很多次?
2024-10-10 10:26:02
71
原创 xml中bean定义详解
当id存在的时候,不管name有没有,取id为bean的名称当id不存在,此时需要看name,name的值可以通过或者空格分割,最后会按照分隔符得到一个String数组,数组的第一个元素作为bean的名称,其他的作为bean的别名当id和name都存在的时候,id为bean名称,name用来定义多个别名当id和name都不指定的时候,bean名称自动生成,生成规则下面详细说明本文主要介绍了xml bean的定义,名称和别名的使用,通过import元素引入外部配置文件。
2024-10-10 10:13:55
671
原创 Spring容器基本使用及原理
本文主要介绍了spring容器的概念、bean的概念、常见的spring容器,以及spring容器的使用步骤;下一篇我们将详解bean的定义。
2024-10-10 09:40:34
843
原创 控制反转(IoC)与依赖注入(DI)
IOC控制反转,是一种设计理念,将对象创建和组装的主动控制权利交给了spring容器去做,控制的动作被反转了,降低了系统的耦合度,利于系统维护和扩展,主要就是指需要使用的对象的组装控制权被反转了,之前是自己要做的,现在交给spring容器做了。DI依赖注入,表示spring容器中创建对象时给其设置依赖对象的方式,通过某些注入方式可以让系统更灵活,比如自动注入等可以让系统变的很灵活,这个后面的文章会细说。spring容器:主要负责容器中对象的创建、组装、对象查找、对象生命周期的管理等等操作。
2024-10-10 09:35:52
958
原创 Spring是什么?我们为什么要学习它?
spring是一个简化java企业级开发的一个框架,内部包含了很多技术,比如:控制反转&依赖注入、面向切面编程、spring事务管理、通过spring集成其他框架、springmvc、springboot、springcloud等等,这些都是围绕简化开发展开的技术,后面会对每个知识点详细介绍。这篇文章主要是让大家了解一下spring是什么,总的来说spring是一个非常优秀的java框架,这个框架的目标是为了简化企业级开发中需要用到的各种技术而存在的。
2024-10-10 09:32:42
936
原创 Java中的线程池
大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。
2024-10-09 15:48:11
825
1
原创 volatile与Java内存模型
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。如上图所示,本地内存A和B有主内存中共享变量x的副本。线程t1的run()方法中有个循环,通过flag来控制循环是否结束,主线程中休眠了1秒,将flag置为false,按说此时线程t1会检测到flag为false,打印“线程t1停止了”,为何和我们期望的结果不一样呢?
2024-10-09 15:39:53
840
原创 线程的基本操作
创建线程的2中方式:继承Thread类;实现Runnable接口启动线程:调用线程的start()方法终止线程:调用线程的stop()方法,方法已过时,建议不要使用线程中断相关的方法:调用线程实例interrupt()方法将中断标志置为true;使用线程实例方法isInterrupted()获取中断标志;调用Thread的静态方法interrupted()获取线程是否被中断,此方法调用之后会清除中断标志(将中断标志置为false了)
2024-10-09 15:38:33
1011
原创 深入理解进程和线程
先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。我们经常使用windows系统,经常会看见.exe后缀的文件,双击这个.exe文件的时候,这个文件中的指令就会被系统加载,那么我们就能得到一个关于这个.exe程序的进程。线程是轻量级的进程,是程序执行的最小单元,使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度的成本远远小于进程。线程是轻量级的进程,是程序执行的最小单元,使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度的成本远远小于进程。
2024-10-09 15:28:53
789
原创 同步(Synchronous)和异步(Asynchronous)
如图:上图中显示了同步方法调用和异步方法调用的区别。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。打个比方,比如购物,如果你去商场买空调,当你到了商场看重了一款空调,你就向售货员下单。售货员去仓库帮你调配物品。这天你热的是在不行了,就催着商家赶紧给你送货,于是你就在商店里面候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。这就是同步调用。不过,如果我们赶时髦,就坐在家里打开电脑,在电脑上订购了一台空调。
2024-10-09 15:18:03
1178
原创 分布式缓存的原理及应用
如果是单机模式,则注释掉 spring.redis.sentinel.nodes 的配置,通过 spring.redis.host 配置 Redis 服务的地址,并通过 spring.redis.port 配置 Redis 服务的端口即可。Redis 的集群模式。在上述配置中,slaveof 后面的配置分别为主数据库的 IP 地址和端口,在主数据库开启了密码认证后需要将 masterauth 设置为主数据库的密码,在配置完成后重启 Redis,主数据库上的数据就会同步到从数据库上。
2024-10-09 15:03:45
793
原创 数据库及分布式事务
如果事务 B 执行失败,事务 B 本身就回滚,这时事务 A 已被提交,所以需要执行一个补偿操作,将已经提交的事务 A 执行的操作进行反操作,恢复到未执行前事务 A 的状态。比如,对一个 50 万行的数据进行查询时,如果使用游标,则需要对表执行 50 万次读取请求,将占用大量的数据库资源,影响数据库的性能。如果协调者接收到了参与者的失败消息或者超时,则直接给每个参与者都发送回滚消息,否则发送提交消息,参与者根据协调者的指令执行提交或者回滚操作,释放在所有事务处理过程中使用的锁资源,如图 7-8 所示。
2024-10-09 15:03:13
588
原创 网络与负载均衡
*6. 最少连接数均衡(Least Connection)**在负载均衡器内部记录当前每台服务器正在处理的连接数量,在有新的请求时,将该请求分配给连接数最少的服务器。(3)服务器端将关闭链路前需要发送给客户端的消息发送给客户端,在等待该数据发送完成后,发送一个终止标志位 FIN=1,ACK=1,seq=w,ack=u+1 的消息给客户端,表示关闭链路前服务器需要向客户端发送的消息已经发送完毕,请求客户端确认关闭从服务器到客户端的链路操作,此时服务器端处于 LAST-ACK 状态,等待客户端最终断开链路。
2024-10-09 15:02:01
1227
原创 数据结构-
(2)将待插入的新节点与当前节点进行比较,如果待插入的新节点的值小于当前节点的值,则在当前节点的左子树中寻找,直到左子树为空,则当前节点为要找的父节点,将新节点插入当前节点的左子树即可。(3)将待插入的新节点与当前节点进行比较,如果待插入的新节点的值大于当前节点的值,则在当前节点的右子树中寻找,直到右子树为空,则当前节点为要找的父节点,将新节点插入当前节点的右子树即可。对 b 节点进行右旋,指将 b 节点的左子节点设为 b 节点的父节点,即将 b 节点设为一个右节点。
2024-10-09 14:52:48
689
原创 Java并发编程
显式获取和释放锁可响应中断、可轮回,为处理锁提供了更多的灵活性。volatile 变量具备两种特性:一种是保证该变量对所有线程可见,在一个线程修改了变量的值后,新的值对于其他线程是可以立即获取的;Semaphore 指信号量,用于控制同时访问某些资源的线程个数,具体做法为通过调用 acquire()获取一个许可,如果没有许可,则等待,在许可使用完毕后通过 release()释放该许可,以便其他线程使用。可重入锁也叫作递归锁,指在同一线程中,在外层函数获取到该锁之后,内层的递归函数仍然可以继续获取该锁。
2024-10-09 14:09:51
1084
原创 Java基础
所以每次加锁操作锁住的是一个Segment,保证了每个Segment安全,就实现了整个ConcurrentHashMap的安全。当链表中的元素超过8个以后,会将链表转化为红黑树调高查询效率,时间复杂度为O(logN)。HashMap子类,内部使用链表保存元素插入顺序,当通过Iterator遍历时,会按照元素插入顺序访问。运行类型指为对象赋值的类型。一个被@Inherited修饰的注解修饰一个类,表明这个注解将对该类的子类生效。先判断对象散列值是否相等,相等再通过equals比较,也相等,就视作同一元素。
2024-10-09 14:08:46
937
原创 Java8 Stream流,常用方法
本文详细介绍了Java8的Stream API,包括其特点、分类、创建方法和各种操作,如中间操作(筛选、映射、排序)和终止操作(匹配、聚合、收集)。通过实例展示了如何使用Stream进行数据处理,如流的创建、中间操作的map和filter、排序、规约操作以及收集到不同数据结构。
2024-10-08 14:49:47
995
原创 java.IO层次体系结构
/*在整个Java.io包中最重要的就是5个类和一个接口。 5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.*/主要的类如下: 1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。 2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有 [字节] 输入流的父类。定义了所有 [字节] ...
2022-04-25 21:59:02
67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人