自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis

如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢?如果使用KV存储,每个用户需要记录365个,当用户量上亿时,这所需要的存储空间是惊人的Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已(二进制位数组)

2024-11-04 10:55:02 1114

原创 Spring源码分析之 Autowired注解

在容器启动,为对象赋值的时候,遇到@Autowired注解,会用后置处理器 AutowiredAnnotationBeanPostProcessor,来创建属性的实例,然后再利用反射机制,将实例化好的属性,赋值给对象上。

2024-10-30 16:47:52 1114

原创 Spring Bean创建流程

这些自定义的对象销毁逻辑,在对象实例初始化完成,并注册了相关的回调接口后,并不会马上执行。函数会先获取所有需要构建的Bean名称,通过bean的RootBeanDefinition判断该bean是否为可构建的类型,很明显可构建的Bean不能是抽象类,不能是接口,也不能是懒加载的bean。大家总是会错误的理解Bean的“实例化”和“初始化”过程,总会以为初始化就是对象执行构造函数生成对象实例的过程,其实不然,在初始化阶段实际对象已经实例化出来了,初始化阶段进行的是依赖的注入和执行一些用户自定义的初始化逻辑。

2024-10-29 22:04:41 803 1

原创 Spring beanFactoryPostProcessor

基本上parser内部解析的重点方法都分析完了,总结一下,parser都干了什么?parser作为一个解析器,根据传入的配置类解析出多个对象配置类实际上是一个树形结构,他的子节点包含@ComponentScan扫描到的配置类,@Import引入的普通类等而spring中这个树结构的根节点一般就是用户定义的主启动类parser通过递归解析完成整个树的解析(解析成多个ConfigurationClass对象),并把解析结果存入parser内部属性。

2024-10-28 21:34:16 783

原创 Spring 启动流程分析

Bean: Spring作为一个IoC容器,最重要的当然是Bean咯BeanFactory: 生产与管理Bean的工厂BeanDefinition: Bean的定义,也就是我们方案中的Class,Spring对它进行了封装BeanDefinitionRegistry: 类似于Bean与BeanFactory的关系,BeanDefinitionRegistry用于管理BeanDefinitionBeanDefinitionRegistryPostProcessor: 用于在解析配置类时的处理器,类似于我们方案

2024-10-28 09:47:07 1146

原创 动态代理实现原理

动态代理工作的基本模式就是将自己的方法功能的实现交给 InvocationHandler角色,外界对Proxy角色中的每一个方法的调用,Proxy角色都会交给InvocationHandler来处理,而InvocationHandler则调用具体对象角色的方法。在触发(invoke)真实角色的方法之前或者之后做一些额外的业务。那么,为了构造出具有通用性和简单性的代理类,可以将所有的触发真实角色动作交给一个触发的管理器,让这个管理器统一地管理触发。问题:调用目标是写死的,如果被代理类中有多个方法。

2024-10-24 10:11:52 288

原创 MySQL 索引

官方定义: 一种帮助MySQL提高查询效率的数据结构一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。

2024-10-23 20:25:24 1315

原创 InnoDB引擎

当我们在一个事务中,执行多个增删改的操作时,InnoDB引擎会先操作缓冲池中的数据,如果缓冲区没有对应的数据,会通过后台线程将磁盘中的数据加载出来,存放在缓冲区中,然后将缓冲池中的数据修改,修改后的数据页我们称为脏页。重做日志,是用来实现事务的持久性。这时问题来了,假设在某一次从内存刷新到磁盘的过程中,一个「页」刷了一半,突然操作系统或者 MySQL 进程奔溃了,这时候,内存里的页数据被清除了,而磁盘里的页数据,刷了一半,处于一个中间状态,不尴不尬,可以说是一个「不完整」,甚至是「坏掉的」的页。

2024-10-23 15:16:59 686

原创 MySQL 存储结构

多个页可以不在物理结构上相连,只通过双向链表相关联即可。每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录。通过主键查找某条记录时可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可。

2024-10-23 11:26:25 1335

原创 AQS原理分析

AQS 通过提供 state 及 FIFO 队列的管理,为我们提供了一套通用的实现锁的底层方法,基本上定义一个锁,都是转为在其内部定义 AQS 的子类,调用 AQS 的底层方法来实现的,由于 AQS 在底层已经为了定义好了这些获取 state 及 FIFO 队列的管理工作,我们要实现一个锁就比较简单了,我们可以基于 AQS 来实现一个非可重入的互斥锁,如下所示@Override@Override@Override。

2024-10-19 12:02:10 766

原创 Unsafe

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java 运行效率、增强 Java 语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使 Java 语言拥有了类似 C 语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得 Java 这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。

2024-10-19 11:38:14 1123

原创 计算机网络 - IP

如上图中的蓝色部分。IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发该组播地址的数据包了。IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常 为 1,因为 IGMP 是工作在主机与连接的路由器之间。

2024-10-18 15:32:26 715

原创 进程、线程和缓存一致性原理

当 A 号 CPU 核心要修改 Cache 中 i 变量的值,发现数据对应的 Cache Line 的状态是共享状态,则要向所有的其他 CPU 核心广播一个请求,要求先把其他核心的 Cache 中对应的 Cache Line 标记为「无效」状态,然后 A 号 CPU 核心才更新 Cache 里面的数据,同时标记 Cache Line 为「已修改」状态,此时 Cache 中的数据就与内存不一致了。而「已失效」状态,表示的是这个 Cache Block 里的数据已经失效了,不可以读取该状态的数据。

2024-10-18 15:30:01 768

原创 CAS介绍

CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。

2024-10-18 15:28:30 997

原创 Java Memory Model

特性volatile关键字synchronized关键字Lock接口Atomic变量原子性无法保障可以保障可以保障可以保障可见性可以保障可以保障可以保障可以保障有序性一定程度可以保障可以保障无法保障。

2024-10-18 15:27:19 1073

原创 ThreadLocal

ThreadLocal 类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量,分配在堆内的TLAB中ThreadLocal 实例通常来说都是类型的,属于一个线程的本地变量,用于关联线程和线程上下文。每个线程都会在 ThreadLocal 中保存一份该线程独有的数据,所以是线程安全的。

2024-10-18 15:24:56 821

原创 CLH介绍

在并发编程中,锁是一种常用的保证线程安全的方法。Java 中常用的锁主要有两类,一种是 Synchronized 修饰的锁,被称为 Java 内置锁或监视器锁。另一种就是在 J2SE 1.5版本之后的 java.util.concurrent包(下称JUC包)中的各类同步器,包括 ReentrantLock(可重入锁),ReentrantReadWriteLock(可重入读写锁),Semaphore(信号量),CountDownLatch 等。

2024-10-18 14:23:03 899

原创 LockSupport

LockSupport.park()休眠线程,LockSupport.unpark()唤醒线程,两个方法配合使用。也可以通过LockSupport.parkNanos()指定休眠时间后,自动唤醒。LockSupport.park()不会释放monitor锁。线程被打断,LockSupport.park()不会抛出异常,也不会吞噬掉interrupt的状态,调用者可以获取interrupt状态,自行进行判断,线程是由于什么原因被唤醒了。

2024-10-18 14:07:39 1063

原创 动态规划(Dynamic Programming)

是运筹学的一种最优化方法,只不过在计算机问题上应用比较多。

2023-12-17 16:46:31 233

原创 SpringBoot 集成 Kafka 配置

*** 自定义分区器*/@Override@Override@Override/***/@Component@Overrideif (value.toString().contains("二")){return 2;}else if (value.toString().contains("一")){return 1;

2023-07-09 11:02:46 3690

原创 尚硅谷 Redis 查询缓存工具封装和秒杀整合Lua代码实现

解决方案:解决方案就是在每个线程释放锁的时候,去判断一下当前这把锁是否属于自己,如果属于自己,则不进行锁的删除,假设还是上边的情况,线程1卡顿,锁自动释放,线程2进入到锁的内部执行逻辑,此时线程1反应过来,然后删除锁,但是线程1,一看当前这把锁不是属于自己,于是不进行删除锁逻辑,当线程2走到删除锁逻辑时,如果没有卡过自动释放锁的时间点,则判断当前这把锁是属于自己的,于是删除这把锁。后续扩展:加锁失败时返回锁的 ttl,根据ttl 来判断是否要重试,具体思路可以查看。

2023-07-03 20:42:24 361

原创 Kafka Windows下启动命令

旧版用--zookeeper参数,主机名(或IP)和端口用ZooKeeper的,也就是server.properties文件中zookeeper.connect属性的配置值。新旧用--bootstrap-server参数,主机名(或IP)和端口用某个节点的即可,即主机名(或主机IP):9092。其中,2181是ZooKeeper的监听端口,9092是Kafka的监听端口。

2023-07-03 20:29:35 2091

原创 Spring Security 未认证请求处理源码解析

Overrideresponse.getWriter().println("必须认证之后才能访问!");@Bean// 添加自定义处理器// 注销登入处理器。

2023-05-07 22:27:41 449

原创 Spring Security 09 整合 JWT

【代码】Spring Security 09 整合 JWT。

2023-05-07 16:55:44 142

原创 Spring Security 08 CSRF

首先随便发起一次请求获取 XSRF-TOKEN发送请求携带令牌即可请求头中携带令牌 request.getParameter()获取不到数据的问题_zhanghuiyu01的博客-优快云博客由于请求参数为 JSON,所以 request.getParameter(csrfToken.getParameterName()) 获取不到 请求参数中的 _csrf,此次请求将会被拒绝。但是如果是 GET 请求就不会有问题。 总结:POST 请求必须将令牌写道 Header

2023-05-07 16:51:47 182

原创 Spring Security 07 会话管理

当浏览器调用登录接口登录成功后,服务端会和浏览器之间建立一个会话 (Session) 浏览器在每次发送请求时都会携带一个 Sessionld,服务端则根据这个 Sessionld 来判断用户身份。当浏览器关闭后,服务端的 Session 并不会自动销毁,需要开发者手动在服务端调用 Session销毁方法,或者等 Session 过期时间到了自动销毁。

2023-05-07 16:45:20 222

原创 Spring Security 06 Rember Me

当用户通过用户名/密码的形式登录成功后,系统会根据用户的用户名、密码以及令牌的过期时间计算出一个签名,这个签名使用 MD5 消息摘要算法生成,是不可逆的。然后再将用户名、令牌过期时间以及签名拼接成一个字符串,中间用“:” 隔开,对拼接好的字符串进行Base64 编码,然后将编码后的结果返回到前端,也就是我们在浏览器中看到的令牌。

2023-05-07 16:43:30 576

原创 枚举+接口代替策略模式

例如传 id 则将 person 集合转换成 id 集合,大概就是这样的需求,看见项目代码实现是使用 if-else 实现,if 里面使用 stream.map 进行转换,由于if 分支太多了,看着不舒服,于是想能不能优化一下,第一想法是使用策略模式,但是为了一个区区的转换使用策略模式得不偿失。在百度一番后找到了两种不错的实现。

2023-05-04 20:43:13 158

原创 RabbitMQ 死信队列实现

➢ 使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到 queue失败后,如果设置了rabbitTemplate.setMandatory(true)参数,则会将消息退回给producer。消息的可靠投递小结 ➢ 设置ConnectionFactory的publisher-confirms=“true” 开启 确认模式。在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败,需要处理。明天在研究下回调啥的。

2023-05-04 20:26:42 1633

原创 Spring Security 05 密码加密

实际密码比较是由PasswordEncoder完成的,因此只需要使用PasswordEncoder 不同实现就可以实现不同方式加密。

2023-04-22 16:40:33 1652 1

原创 Spring Security 04 自定义认证

发起认证请求,请求中携带⽤户名、密码,该请求会被 UsernamePasswordAuthenticationFilter 拦截在 UsernamePasswordAuthenticationFilter 的 attemptAuthentication ⽅法中将请求中⽤户名和密码,封装为Authentication 对象,并交给 AuthenticationManager 进⾏认证。

2023-04-22 16:11:28 1626

原创 Spring Security 03 认证处理器

spring security 自定义任务处理器

2023-04-22 15:52:03 339

原创 volatile 保证内存变量可见性的实现原理解析

Java代码在编译后会编程 Java 字节码,字节码在被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编指令在 CPU 上执行,Java 所使用的并发机制依赖于 JVM 的实现和 CPU 指令。多线程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的"可见性"(当一个线程修改了一个共享变量时,其他的线程能读到这个修改后的值)。

2023-04-22 15:41:45 822

原创 Spring Security 02 搭建环境

Spring Security 环境搭建以及 默认用户源码解析

2023-04-15 11:26:01 959

原创 Spring Security 01 整体架构

在SpringSecurity的架构中,认证跟授权是分开的,无论采用什么样的认证方式,都不会影响授权,这是两个独立的存在 AuthenticationManager 主要实现类为 ProviderManager,在 ProviderManager中管理了众多 AuthenticationProvider 实例。在⼀次完整的

2023-04-15 11:03:33 395

原创 单例模式之静态内部类

从字面上来看,一个被称为静态嵌套类,一个被称为内部类什么是嵌套?嵌套就是我和你没有关系,自己可以完全独立存在,但我就是想借用你的壳用一下,来隐藏我自己什么是内部?内部就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我(所以内部类对象是以外部类对象存在为前提的)如果一个类被static修饰,那么只有一种情况,该类为静态内部类。若使用static修饰外部类,则将不会通过编译。

2023-04-15 10:38:57 800

原创 Java类加载过程

Java虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这个过程被称作虚拟机的类加载机制。在 Java 语言里面,类型的加载、连接和初始化的过程都是程序运行期间完成的,这种策略让 Java 语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销,但是却为 Java 应用提供了极高的扩展性和灵活性。Java 天生可以可以动态扩展的语言特性就是依赖于动态加载和动态连接这个特点实现的。

2023-04-15 10:25:37 2236

原创 Servlet教程

Java Servlet 组成部分介绍

2023-04-09 16:02:03 448

原创 InfluxDB教程

InfluxDB数据库教程

2023-02-07 19:03:43 2518

原创 WebSocket教程

SpringBoot集成WebSocket教程

2023-02-06 22:10:24 2974

空空如也

空空如也

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

TA关注的人

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