- 博客(27)
- 资源 (3)
- 收藏
- 关注
原创 Spring 推断构造方法
如果采用AnnotationConfigApplicationContext创建Spring容器时,Spring会根据构造方法的参数信息去寻找bean,然后传给构造方法、如果采用ClassPathXMLApplicationContext创建Spring容器时,表示使用XML的方式来使用bean,要么在XML中指定构造方法的参数值(,@Autowired注解可以写在构造方法上,在构造方法上写@autowired注解,表示开发者指定采用这个构造方法,Spring通过。
2023-03-24 14:25:07
275
原创 Spring 循环依赖
如果当前Bean没有出现循环依赖,那么这个Lambda表达式没用,当前bean按照自己的生命周期正常执行,执行完后直接把当前bean放入singletonObjects中,如果当前bean在依赖注入时发现出现了循环依赖(当前正在创建的bean被其他bean依赖了),则从三级缓存中拿到Lambda表达式,并执行Lambda表达式得到一个对象,并把得到的对象放入二级缓存((如果当前Bean需要AOP,那么执行lambda表达式,得到就是对应的代理对象,如果无需AOP,则直接得到一个原始对象))。
2023-03-24 08:54:27
1354
原创 Spring Bean 依赖注入
Spring 通过constructor构造方法来注入,就可以不写set方法,Spring利用构造方法的参数信息从Spring容器中去找bean,找到bean之后作为参数传给构造方法,从而实例化得到一个bean对象,并完成属性赋值。作为缓存,比如如果当前Bean是原型Bean,那么下次再来创建该Bean时,就可以直接拿缓存的结果对象beanName去BeanFactory中去拿bean对象了,不用再次进行查找了。Spring底层在创建Bean的过程中,在填充属性时,会去解析当前类,
2023-03-22 18:02:26
413
原创 Spring Bean 创建过程
在这个步骤会根据BeanDefinition去创建一个对象了,在Bean对象创建的过程中会经过三个过程去实例化:首先会判断BeanDefinition中是否设置了Supplier,如果设置了则调用Supplier的get()得到对象、没有设置Supplier则检查BeanDefinition中是否设置了工厂方法(factoryMethod),如果设置了工厂方法则调用工厂方法得到对象、最后调用推断构造方法获取对象。在Spring Bean对象实例化之前的扩展点是。
2023-03-22 17:49:29
331
原创 Spring Bean对象扫描生成BeanDefinition流程
判断当前BeanName是否在Spring容器中已经存证,如果不存在则把beanName以及BeanDefinition注册到Spring容器中,如果存证则抛出异常。某个类上是否存在@Conditional注解,如果存在则调用注解中所指定的类的match方法进行匹配,匹配成功则通过筛选,匹配失败则pass掉。将扫描Bean的BeanDefinition注册到Spring容器中的BeanDefinitionMap中。默认情况下,Spring会有一个@Component注解的includeFilter。
2023-03-20 16:00:16
281
原创 Kafka环境搭建
Kafka只在partition的范围内保证消息消费的局部顺序性,不能在同一个topic中的多个partition中保证总的消费顺序性。consumer group中的consumer instance的数量不能比一个Topic中的partition的数量多,否则,多出来的consumer消费不到消息。leader处理所有的针对这个partition的读写请求,而followers被动复制leader的结果,不提供读写(主要是为了保证多副本数据与消费的一致性)也可以根据消息中的某一个关键字来进行区分。
2023-03-06 17:04:08
221
原创 Kafka入门基础
Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。用Kafka收集各种服务的日志,通过Kafka以统一服务接口的方式开放给各种consumer,如:Hadoop、Hbase、Solr等。Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic。Kafka的基本概念。
2023-03-06 14:18:14
51
原创 Zookeeper的搭建
每台 server 发出一个投票,由于是初始情况,server1 和 server2 都将自己作为 leader 服务器进行投票,每次投票包含所推举的服务器myid、zxid、epoch,使用(myid,zxid)表示,此时 server1 投票为(1,0),server2 投票为(2,0),然后将各自投票发送给集群中其他机器。一旦确定了 leader,每个服务器响应更新自己的状态,如果是 follower,那么就变更为 FOLLOWING,如果是 Leader,变更为 LEADING。
2023-03-03 16:20:23
124
原创 分布式理论&Zookeeper介绍
它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控存储的数据的状态变化。对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。
2023-03-03 11:06:43
58
原创 Redis 集群高可用架构
创建整个redis集群时,需要确保规划的三台服务器之间的redis实例能相互通讯,可以先简单把所有机器防火墙关掉,如果不关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)。在Redis 3.0之前的版本实现集群一般是借助sentinel哨兵工具方式来监控master节点的状态,如果master节点异常,则会进行主从切换,将集群中的slave节点选举成master节点。在原有的Redis集群下,现在Redis节点加入集群。
2023-03-01 16:13:43
180
原创 Redis 哨兵高可用架构
sentinel 哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。客户端第一次从哨兵找出redis的master节点,后续就直接访问redis的master节点,不会每次通过sentinel代理访问redis的master节点,当redis的master节点发生改变,sentinel会第一时间感知到,并将新的redis的master节点通知给客户端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)。sentinel 哨兵介绍。
2023-03-01 08:50:18
65
原创 Redis主从架构
master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。从Redis 2.8版本开始,Redis改用可以支持部分数据复制的命令PSYNC去master节点同步数据,slage与master能够在网络连接断开重连后只进行部分数据复制。:让部分从节点与从节点(与主节点同步)同步数据。
2023-02-28 16:05:57
47
原创 Redis持久化
Redis主线程fork出一个bgsave子线程,可以共享主线程的所有内存数据。可以通过修改Redis的配置文件redis.conf来开启AOF功能,开启AOF功能后,Redis重启时,就可以通过执行AOF文件中的命令来达到重建数据集的目的,在Redis的配置文件中还可以配置Redis多久将数据fsync到磁盘。AOF在重写时,不在单纯的将内存数据转换为resp格式命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令一起写入AOF文件,
2023-02-28 11:37:05
46
原创 AbstractQueuedSynchronizer(AQS)
java.util.concurrent包中的大多数同步器实现都是围绕着共同的继承行为,如:等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象的同步框架,可以用来实现一个依赖状态的同步器。条件等待队列:调用await()的时候会释放锁,然后线程会加入到条件队列,调用signal()唤醒的时候会把条件队列中的线程节点移动到同步队列中,等待再次获取锁。CANCELLED,值为1,表示当前的线程被取消。
2023-02-28 09:18:22
51
原创 Redis单节点搭建&核心数据结构
三日内搜索榜单计算:ZUNIONSTORE hotNews:20230225-hotNews:20230227 3 hotNews:20230225 hotNews:20230226 hotNews:20230227。增加商品数量:HINCRBY car:{userId} {productId} {商品数量}添加商品:HSET car:{userId} {productId} {商品数量}删除商品:HDEL car:{userId} {productId}
2023-02-27 17:21:11
267
原创 并发编程—synchronized
由于对象需要存储的运行时数据很多,考虑到虚拟机的内存使用,markOop被设计成一个非固定的数据结构,以便在极小的空间存储尽量多的数据,根据对象的状态复用自己的存储空间。Mark Word:用于存储对象自身的运行时数据,如:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“Mark Word”。MESA模型中,条件变量可以有多个,Java语言内置的管程里只有一个条件变量。
2023-02-27 11:10:23
131
原创 并发编程—CAS
CAS概念:比较并交换,CAS是一种原子操作,针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给这个变量赋一个新值。CAS可以看做是乐观锁的一种实现,Java原子类中的递增操作就是通过CAS自旋实现的。CAS是一种无锁算法,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。
2023-02-27 10:42:20
164
原创 MySQL事务隔离级别与锁机制
一个事务在多一条记录做修改,在这个事务完成并提交之前,这条记录的数据就处于不一致的状态,若此时有其他事务来读取这条记录,如果不加控制的情况会出现“脏读”数据,如果对该数据进行后续的操作就会产生未提交的数据依赖关系,这种现象称为“脏读”。每次操作锁住整张表。锁粒度大,发生锁冲突的概率高,并发低。:I锁,针对表锁,主要是为了提高加表锁的效率,是Mysql自己加的,当有事务给表的数据加了共享锁或排它锁,同时会。数据库一般会并发执行多个事务,多个事务可能会并发的对相同的数据进行增删改查的操作,可能就会导致数据的。
2023-02-24 13:59:50
86
原创 MySQL存储引擎
不同的存储引擎存储数据的格式是不一样的,甚至有的存储引擎(Memory)是不用磁盘来存储数据的关闭服务器后表中的数据就不存在了,在MySQL5.5之前默认的存储引擎是MyISAM,在MySQL5.5版本之后存储引擎默认使用InnoDB。建立的,聚集索引对主键的查询具有很高的性能,支持主键索引(聚集索引)和辅助索引(非聚集索引),InnoDB占用空间大(缓存索引和真实数据)需要跟多的内存和存储,需要有缓存池用于高速缓存数据和索引,在存储结构上存在2个文件。不仅缓存索引,还缓存真实数据,对内存要求较高。
2023-02-24 13:58:00
61
原创 MySQL索引
每个表右且一定会有一个聚集索引,整个表的数据存储在聚集索引的叶子节点上,非叶子节点存储记录的主键值,当表中为指定主键时,MySQL内部会自动给每条记录添加一个。MySQL中基本索引类型,没什么限制,允许在定义索引的列中插入重复值和空值,目的就是为了更快速查询数据。,也是B+Tree结构,不过有一点和聚集索引不同,非聚集索引叶子节点存储字段。是一种特殊的唯一索引,不允许为空值,主键约束就是一个主键索引。非叶子节点不存储数据,只存储索引(冗余),可以存放更多的索引。索引列中的值必须是唯一的,但是允许为空值。
2023-02-20 14:13:52
46
原创 Java线程详解
join可以理解成是线程合并,当在一个线程调用另一个线程的join方法时,当前线程阻塞等待被调用join方法的线程执行完毕才能继续执行,所以join的好处能够保证线程的执行顺序,但是如果调用线程的join方法其实已经失去了并行的意义,虽然存在多个线程,但是本质上还是串行的,最后join的实现其实是基于等待通知机制的。):它们是依赖于内核的,即无论是用户进程中的线程,还是系统进程中的线程,它们的创建、撤销、切换都是由内核实现。
2023-02-20 10:57:29
571
原创 线程基础知识
当有若干个线程都要使用某一个共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,知道占用资源者释放该资源。线程之间所具有的一种制约关系,一个线程的执行依赖于另一个线程的消息,当它没有得到另一个线程的消息时等待,直到消息到达时才被唤醒。运行状态的线程如果调用一个阻塞的API(以阻塞方式读取文件)或等待某个事件(条件变量),那么线程的状态就会转到休眠状态,同时释放CPU的使用权,线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。
2023-02-20 10:32:34
39
原创 MySQL的内部组件结构
MySQL真正开始执行SQL语句,首先会对SQL语句进行解析(语法解析)操作,在分析器阶段,MySQL需要识别出执行的SQL语句里面的字符串分别是什么,代表什么。优化器阶段完成后,SQL语句就进入了执行阶段,在开始执行时,首先先判断一下操作的表对连接用户有没有权限操作,如果没有就会返回权限错误,有则执行器会根据表的引擎定义,去使用这个引擎提供的接口。这意味着,一个用户连接成功建立之后,即使用管理员的账号对该用户的权限进行了修改,也不会影响到已经建立连接的权限,只有重新建立的连接才会拥有修改后的权限。
2023-02-17 11:17:00
136
原创 MySQL5.7安装与配置(Centos7)
设置远程访问账号:grant all privileges on . to 远程访问用户名@’%’ identified by ‘用户密码’;要重新启动mysql,请使用mysqladmin将其关闭,然后使用mysqld_safe再次启动它。修改/etc/init.d/mysql参数。创建mysql用户组和用户并修改权限。检查本地是否安装MySQL。检查MySQL进程是否启动。设置MySQL远程访问控制。设置mysql服务为自启动。卸载之前安装的MySQL。修改文件名为mysql。初始化MySQL数据库。
2023-02-17 09:49:15
100
原创 volatile的内存语义
LOCK前缀指令会等待它之前所有的指令完成、并且所有缓冲的写操作写回内存(也就是将store buffer中的内容写入内存)之后才开始执行,并且根据缓存一致性协议,刷新store buffer的操作会导致其他cache中的副本失效。volatile仅仅保证对单个volatile变量的读/写具有原子性,而锁的互斥执行的特性可以确保对整个临界区代码的执行具有原子性。操作必须是连续的,即修改后必须立即同步回主内存,使用时必须从主内存刷新,由此保证volatile修饰的变量操作对多线程的可见性。
2023-02-14 14:26:58
87
1
原创 Java内存模型(JMM)
Java虚拟机规范中定义了Java内存模型(Java Memory Model)用于屏蔽各种硬件和操作系统之间的内存访问差异,以实现让Java程序在各个平台下能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量值,以及在必须时如何同步的访问共享变量。作用于工作内存的变量,把工作内存的一个变量的值传输到主内存中,以便随后的write的操作。作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
2023-02-14 14:13:57
117
原创 并行与并发
并行并发的目的都是最大化CPU使用率。 同一时刻,有多条指令在多个处理器(CPU)上同时执行,无论从微观还是从宏观上来看,二者都是一起执行的。 同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使得多个进行快速交替的执行。 当一个线程修改了共享变量的值,其他线程能够看到修改后的值。在Java内存模型中,通过变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量的值,
2023-02-14 14:01:11
81
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人