- 博客(20)
- 收藏
- 关注
原创 Git核心概念
Git就是一个典型的分布式版本控制系统,这类系统,客户端不只是提取最新版本的文件快照,而是把代码仓库完整的镜像下来,这样一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次克隆操作,都是一次对代码仓库的完整备份。
2024-09-03 17:48:42 801
原创 Docker
Docker是世界领先的软件容器平台,容器就是将软件打包成标准化单元,以用于开发、交付和部署。容器镜像是轻量级、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于Linux和Windows的应用,在任何环境中能够始终如一地运行。容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
2024-09-02 16:43:06 1670 4
原创 Spring中设计模式详解
1.定义一个事件:实现一个继承自ApplicationEvent,并且写相应的构造函数2.定义一个事件监听者:实现Application接口,重写onApplicationEvent()方法3.使用事件发布者发布消息:可以通过ApplicationEventPiblisher的publishEvent()方法发布消息。
2024-09-01 17:11:23 1722
原创 IoC&AOP详解
AOP指的是面向切面编程,是OOP(面向对象编程)的一种延续,二者互补而不冲突。AOP的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化,提高代码的可读性和可维护性。
2024-08-31 21:24:37 1103
原创 Java定时任务
单机定时任务的常见解决方案有TimerDelayQueue、Spring Task 和时间轮,其中最常用也是比较推荐使用的是时间轮。另外,这几种单机定时任务解决方案同样可以实现延时任务。Redis 和 MQ 虽然可以实现分布式定时任务,但这两者本身不是专门用来做分布式定时任务的,它们并不提供较为完整和强大的分布式定时任务的功能。而且,两者不太适合执行周期性的定时任务,因为它们只能保证消息被消费一次,而不能保证消息被消费多次。因此,它们更适合执行一次性的延时任务,例如订单取消、红包撤回。
2024-08-26 23:30:31 823
原创 数据库优化
读写分离主要是为了将数据库的读写操作分散到不同的数据库节点上。这样的化能够小幅度提升写性能,大幅度提升读性能。一般情况是一主多从,主数据库用于写,从数据库用于读。
2024-08-25 22:58:38 1048
原创 Maven
Maven本质是一个软件项目管理和理解工具,基于项目对象模型(POM)的概念,Maven可以从一条中心信息管理项目的构建、报告项目和文档。POM,每个Maven工程都有一个pom.xml文件,位于根目录中,包含项目构建生命周期的详细信息,通过pom.xml文件,我们可以定义项目的坐标、项目依赖、项目信息、插件信息等配置。
2024-08-24 20:35:44 1462
原创 SpringBoot常见注解
一般不会主动使用,创建SpringBoot项目后默认在主类加上,可以看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。扫描被@Component(@Repository,@Service,@Controller)注解的bean,注解默认会扫描该类所在包下的所有类。作用于方法:当类配置了注解,方法也配置了,那么方法的事务会覆盖类的事务配置信息。@Transactional:被声明的测试方法的数据会回滚,避免污染测试数据。
2024-08-23 20:18:16 1292
原创 Redis
每个设置了过期时间的 key 都会在设置的时间到达时立即被删除。缓存击穿是因为请求的key是热点数据,存在数据库中,但不存在缓存中(通常是因为key过期),导致大量请求到达数据库,导致数据库瞬间压力过大,导致宕机。缓存雪崩是因为大量的缓存同时失效,导致大量的请求到达数据库,导致数据库压力过大,发送原因有两点,一点是大量缓存同时过期,二是Redis服务宕机。(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
2024-08-22 20:49:12 1209
原创 Spring&SpringBoot
Bean代指那些被IoC容器管理的对象Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发AfterReturning(返回通知):目标对象方法调用返回完成,在返回结果值之后触发AfterThrowing(异常通知):目标对象方法运行中抛出异常后触发Aroud()环绕通知:在任意的目标对象的方法调用前后触发,甚至不调用目标对象的方法。
2024-08-21 20:20:28 1358
原创 IO流总结
BufferedOutputStream:字节缓冲输出流,将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。属于同步阻塞IO模型,应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间,在客户端连接数量不多的情况下,问题不大,但是数量一旦多起来了,就会影响性能。AIO 也就是 NIO 2。解耦:客户端和具体实现类的解耦,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现隐藏起来。
2024-08-20 20:13:55 967
原创 消息队列kafka
kafka的消息队列模型是发布-订阅模型,使用主题为消息通信载体,发布者发布一条消息到主题上,然后通过主题将消息推送给订阅了该主题的消费者,在该消息发布后订阅主题的则不能收到该消息。kafka为分区引入多副本机制,分区中多个副本中有一个leader的副本,其他副本为follower,生产者发送的消息会先发送到leader副本,然后在同步给follower副本。该消息会进入死信队列,,在死信队列中,可以进一步分析,处理这些无法正常消费的消息,以便定位问题,修复错误,并采取适当的措施。
2024-08-19 22:14:50 586
原创 MySQL
事务A对一个数据进行修改后,但是并没有提交事务,事务B读取该数据,读取到的时修改后的数据,但是后面事务A进行回滚,该数据又没有修改,而事务B却读到了修改后的数据,这就是脏读。事务A读取了某个条件的数据,共有n行,然后事务B根据该条件插入或删除几行数据,然后事务A在结束前又读取了该条件的数据,发现两次读取到的数据多了或者少了。事务A读取到数据X,事务B也读取到数据X,这两个事务同时对数据X进行修改,最后导致数据结果只修改了一次,导致其中一个事务的修改丢失,这就是丢失修改。=等运算符,而""可以使用运算符。
2024-08-18 23:25:02 893
原创 MyBatis框架
使用MyBaits提供的插件接口,实现自定义插件,在插件的拦截方法内拦截带执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。不同的xml映射文件,如果配置了namespace,那么id可以重复,如果没有,就不能重复,毕竟namespace不是必须的,只是最佳实践而已。MyBatis共有9中动态sql,if,where,choose,foreach,bind,trim,set,when,otherwise。2.使用sql列的别名功能,将列别名书写为对象属性名。
2024-08-17 22:14:46 838
原创 JAVA并发常见问题
一般是在数据库表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,该字段值就+1,当线程A要更新数据时,读取原数据也会读取到version数据,在提交更新时,若刚才读到的version值为当前数据库的version值,就执行更新操作,否则就重试更新操作。给当前类加锁,会作用当类的所有对象实例,进入同步代码前要获得当前class的锁,因为静态成员不属于任何实例对象,归整个类所有,不依赖类的特定实例,被类的所有实例共享。给当前对象实例加锁,进入同步代码前要获得当前对象实例的锁。
2024-08-16 16:33:22 474
原创 线程的概述
wait()是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁,每个对象都拥有对象锁,既然要释放当前线程占用的对象锁并让其进入等待状态,自然是要操作对象而不是线程多个线程同时被阻塞,他们中的其中一个或者全部都在等某个资源被释放,由于线程被无限期阻塞,因此程序不能正常结束,这就是线程死锁。
2024-08-15 22:03:39 825
原创 论HashMap
HashMap 通过 key 的hashcode 经过扰动函数处理过后得到 hash 值,然后通过(n-1)& hash判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。开始创建是使用链表,当链表长度超越阈值(默认为8)时,就会将链表转为红黑树(转换前会判断,如果当前数组长度小于64,那么就会先进行数据扩容),减少搜索时间;HashMap是非线程安全的;
2024-08-15 16:01:58 1014
原创 从输入URL到页面展示中到底发生了什么
3.根服务器注意到请求报文中含有某个顶级域,告诉本地 DNS,你可以向某个顶级域的 TLD DNS 发送请求,因为目标域名的 IP 地址很可能在那里。7.终于,由于域名向权威 DNS 服务器备案过,在这里有它的 IP 地址记录,权威 DNS 成功地将 IP 地址返回给本地 DNS。某个顶级域的 TLD DNS 服务器仍不清楚请求域名的 IP 地址,但是它注意到该域名有某个前缀,因此返回告知本地 DNS,8.最后,本地 DNS 获取到了目标域名的 IP 地址,将其返回给请求主机。
2024-08-14 18:13:59 524
原创 线程池概述
在处理大量并发任务的时候,如果按照传统的方式,来一个任务请求,创建一个线程来进行任务的处理,大量线程的创建和销毁,将消耗过多的系统资源,还增加了线程上下文(运行环境)切换的开销,而通过线程池技术就可以很好地解决这些问题。线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理完任务之后并不会销毁,而是把线程归还到线程池中,继续为后续的任务提供服务。3、任务排队:当线程池中的线程已经全部被占用时,新提交的任务会被放入一个任务队列中进行排队等待执行。
2024-08-14 16:18:24 1119 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人