- 博客(32)
- 收藏
- 关注
原创 观察者模式其实就是一个通知系统
观察者模式其实就是一个通知系统,比如说你订阅了一个YouTube频道,当这个频道上传新视频时,你就会收到通知。这个模式就像你是观察者,YouTube频道是被观察者,当频道有新内容时,它会通知你,你就会去看新内容。定义被观察者类(YouTube频道)实现具体的观察者(观众)测试结果当上传新视频时,所有订阅了这个频道的观众(和)都会收到通知,并且打印出类似这样的信息:
2024-07-23 16:52:38
447
原创 k8s健康检测的三种探针
启动探针–不同容器启动快慢不一样,只有启动探针成功后,才调用另外2个探针,一次性就绪探针–容器中的应用程序(如java应用)是否运行正常,控制网络访问,service负载均衡多个pod,如果没有就会就不会放流量存活探针–pod(linux环境)是否运行正常,不正常就重启
2024-07-02 14:14:59
133
1
原创 Spring Boot 异步线程间数据传递的优雅实现
日常开发都使用ThreadLocal来存取用户信息等全局遍历,但是当遇到了多线程,ThreadLocal就失效了,以下提供2种方法帮助我们优雅实现线程间的数据传递。
2024-05-20 17:39:08
387
原创 使用线程池的时候,如何获取线程池中的异常
我们使用 submit() 方法提交任务,这样我们就可以通过返回的 Future 对象获取任务的执行结果,包括任何在任务执行过程中抛出的异常。在调用 future.get() 时,如果任务抛出了异常,那么这个异常会被封装在一个 ExecutionException 中并被抛出。注意,在实际应用中,我们需要确保在使用完线程池后调用 shutdown() 方法来关闭线程池,防止资源泄露。在Java中,当我们使用线程池执行任务时,一般有两种方法:execute() 和 submit()。
2024-05-11 10:15:34
615
原创 MySQL全文索引替代like模糊查询
● IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION:在自然语言模式下进行匹配,并使用查询扩展。自然语言模式是一种基于自然语言的搜索模式,它会根据单词的重要性和相关性进行匹配,并按照相关性进行结果排序。● WITH QUERY EXPANSION:进行查询扩展,扩大搜索结果的范围,但不指定具体的匹配模式。ft_query_expansion_limit:不明觉厉的一个参数,基本上不需要设置。ft_max_word_len:最大分词长度,一般情况下不需要更改。
2024-03-21 17:46:12
368
1
原创 补偿机制的实现
在日常开发中,经常需要跟对接第三方,一般场景下,失败了我们会直接把异常抛出,某些业务场景,失败了需要进行重试,而不是直接抛出异常,影响用户体验。
2023-08-18 11:09:18
556
原创 方便好用的日期格式化
方法:使用org.apache.commons.lang3.time.DateUtils#parseDate,传入可能的日期格式。在日常开发过程,经常会遇到解析日期格式的需求,例如导入文件的识别,判断日期格式是否符合,不符合需要告诉用户正确的格式。注意,org.apache.commons.lang.time.DateUtils的是比较旧的版本,不建议使用。原理,就是遍历我们传入的格式,尝试去解析,如果没有成功的就抛出异常。
2023-08-18 08:50:53
131
原创 基于redis过期监听实现定时关单以及对应的坑
默认配置notify-keyspace-events的值为 “” 修改为 notify-keyspace-events Ex 这样便开启了过期事件监听。
2023-03-15 13:54:48
2071
原创 集合与高并发
集合与高并发ListArrayList,线程不安全源码中的add方法不是线程安全的,size++不是原子性操作public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}Collections.synchronizedList(new ArrayList<>()),适用读写
2020-10-13 10:49:52
219
原创 【多线程】Java中的多线程
Java中的多线程1.1Java中的多线程Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常
2020-09-17 23:16:46
226
转载 图解 Java 线程安全
什么是线程按操作系统中的描述,线程是 CPU 调度的最小单元,直观来说线程就是代码按顺序执行下来,执行完毕就结束的一条线。举个 ????,富土康的一个组装车间相当于 CPU ,而线程就是当前车间里的一条条作业流水线。为了提高产能和效率,车间里一般都会有多条流水线同时作业。同样在我们 Android 开发中多线程可以说是随处可见了,如执行耗时操作,网络请求、文件读写、数据库读写等等都会开单独的子线程来执行。那么你的线程是安全的吗?线程安全的原理又是什么呢?(本文内容是个人学习总结浅见,如有错误的地方,望
2020-09-15 11:07:47
173
原创 【Redis】Redis是什么?为什么这么快?
【Redis】Redis是什么?为什么这么快?完全基于内存,将数据存储在内存中,读取的时候不需要进行磁盘的 IOreids的瓶颈是内存以及网络,之前单线程实现是因为单线程实现简单采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU这是历史遗留问题,以前服务器的配置低,单线程实现简单而且效果差不多,现在服务器的配置普遍提升,redis已经开始做多线程,性能提升了数倍高效的数据结构,Redis 是用 C 语言开发完成的,但在 Redis 字符串中
2020-09-11 11:56:56
166
原创 【Java】二进制转换与源码中的位运算取代取模运算
十进数转成二进数整数部分采用 "除2取余,逆序排列"法。整数部分,把十进制转成二进制一直分解至商数为0。读余数从下读到上,即是二进制的整数部分数字。 小数部分,则用其乘2,取其整数部分的结果,再用计算后的小数部分依此重复计算,算到小数部分全为0为止,之后读所有计算后整数部分的数字,从上读到下。将59 转成二进制:整数部分:59 ÷ 2 = 29 ... 129 ÷ 2 = 14 ... 114 ÷ 2 = 7 ... 0 7 ÷ 2 = 3 ... 1 3 ÷ 2 = 1 ... 1
2020-09-10 09:47:08
706
原创 【分布式】强一致性,弱一致性,最终一致性
强一致性,弱一致性,最终一致性如何区分强弱一致性如图,现在有用户更新头像这一事件,数据库是一主多从,主库写,从库读,我们这时候就可以通过判断主库是否等待从库写操作成功才向用户返回更新成功来确认是强一致性还是弱一致性区别强制性的结果,所有用户看到的头像都是一致的,在同步完成之前会阻塞等待其他请求弱一致性的结果,同一时间点不同用户看同一用户的头像不一致,存在延迟,不会阻塞最终一致性,延时之后,信息会得到同步,看到的过时信息只是一个暂时的状态...
2020-09-08 16:22:13
1413
原创 【Java】transient 关键字
transient 关键字java中对象的序列化在讨论transient 之前,有必要先了解java中对象序列化的含义java中对象的序列化是把对象转化为字节数组,字节数组包含了本对象信息(全类名)以及数据(属性的类型,值),方便网络传输和存储到数据库,redis缓存等,这需要我们的实体类实现Serializable接口,让其可序列化,默认实现了2个序列化方法,有些JDK类如HashMap,ArrayList等自定义实现writeObject和readObject方法的实现。序列化的最终目的是反序列
2020-09-08 10:28:35
143
转载 【Java】modCount到底是干什么的呢
modcount到底是干什么的呢在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影,modCount字面意思就是修改次数,但为什么要记录modCount的修改次数呢? 大家发现一个公共特点没有,所有使用modCount属性的全是线程不安全的,这是为什么呢?说明这个玩意肯定和线程安全有关系喽,那有什么关系呢阅读源码,发现这玩意只有在本数据结构对应迭代器中才使用,以HashMap为例:private abstract class Has
2020-09-08 09:44:32
254
原创 【Dubbo】dubbo在项目中会遇到的问题
dubbo在项目中会遇到的问题启动时检查@Reference(check = false)dubbo在启动的时候会根据@Reference,去寻找对应的服务提供者,检查服务是否可用,不可用会抛出异常,这个因为参数check默认值为true造成,在实际开发中,微服务是分很多模块的,有些模块不是自己负责的,但是Controller层会引用到,我们需要改成@Reference(check = false)来关闭启动检查,不然有时候项目是跑不起来的超时机制@Service(timeout = 3000
2020-09-07 16:21:35
652
原创 【Redis】键过期策略与内存淘汰机制
键过期策略定时器删除策略给每个有过期时间的key绑定一个定时器,到时间就把key删除优点:及时删除,节省内存缺点:大量占用CPU惰性删除策略获取的时候才判断这个key是否过期,过期了就删除,并返回null,否则返回该key的值优点:用到才删除,不需要大量占用CPU缺点:如果用户一直不获取key,那么该过期的key就会一直存放在内存中,相当于内存泄漏定期删除策略起一个全局的定时任务,设置执行时长与频率,每隔一段时间redis会随机扫描各个库中的key,如果过期就删除(非全表扫描)优点:通
2020-09-02 15:31:11
113
原创 【Dubbo】dubbo的简单认识
DubboRPC,Remote Procedure Call 即远程过程调用服务消费者公共jar包,需要知道有哪些接口可以使用代理类,让消费者只需要调接口,不需要关系具体实现注册中心,知道有哪些服务的提供方可以调用负载均衡,因为提供方是集群部署,可以通过某些策略选择一个调用容错机制,远程调用是不可靠的,服务是否需要重试协议,通信协议,序列化协议等服务提供者实现对应接口的逻辑把自己暴露出去,向注册中心注册自己,暴露服务消费者发起请求,提供者需要根据约定好的协议处理这个请求
2020-09-01 16:39:08
147
原创 MySQL 锁的分类
MySQL 锁表锁,对整张表进行加锁,由service层实现行锁,对某一行进行加锁,由存储引擎实现,Innodb支持,MyiSam不支持锁模式读锁,也称共享锁,简称S锁某个事务对某行或者某表加了读锁后,其他事务依然可以读取,但不能修改可以同时有多个事务对某行或某表加读锁select ... lock in share mode写锁,也成独占锁,排它锁,简称X锁某个事务对某行或者某表加了写锁后,其他事务不能读取和修改记录同一时刻,只能有一个事务对某行或某表加写锁select
2020-08-10 10:17:48
447
原创 同步代码块跟同步方法,倾向于使用哪个进行开发?
原则:同步的范围越小越好同步代码块以外的方法会异步执行,这比同步整个方法更提升代码执行效率。例外java虚拟机中存在一种叫做锁粗化的优化方式,这种方法就是把同步范围放大。StringBuffer是一个线程安全的类,它的append方法是一个同步方法。@Overridepublic synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return th
2020-08-05 10:58:17
268
原创 【数据库】脏读,不可重复读,幻读,隔离级别,mysql的MVCC协议
不同事务隔离级别可能造成的问题脏读(读到其他事务未提交的数据)不可重复读(多次查询到的数据内容不一致)幻读(多次读到的数据总量不一致)数据库隔离级别读未提交(读取别人未提交的数据,导致脏读)读已提交(读取别人已经提交的数据,导致不可重复读,大多数数据库的默认隔离级别:oracle)可重复读(保障2次查询的数据数量一致,不允许其他事务对查询范围内的数据进行update操作,只允许insert操作,造成某个事务前后多次读取到的数据总量不一致,从而产生幻读,这是MySql数据库的默认
2020-08-04 09:56:19
185
原创 Java创建对象,设计模式之Builder模式
在《Effective Java》中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式)。相比于重叠构造器(telescoping constructor)模式和JavaBeans模式,Builder模式实现的对象更利于使用。1.重叠构造器普遍使用,不易扩展构造器的调用通常需要很多你原本不想设置的参数,但你还是不得不给这些参数传一个值进去总结,是可行,只是当有很多参数时,会让...
2020-04-22 15:11:54
323
原创 Java面试题笔记
1.final、finally、 finalize 有什么不同?final 修饰的 class 代表不可以继承扩展,核心类库( java.lang 包下),有效避免 API 使用者更改基础功能final 的方法也是不可以重写的(override),明确告知别人,这些行为是不许修改的final 的变量是不可以修改的.可以清楚地避免意外赋值导致的编程错误 final List<Strin...
2020-04-16 11:27:27
167
原创 mysql实战45讲
第一讲Mysql的基本架构图连接器-查询缓存(key-value的形式,key是sql语句,value是返回结果集)-分析器,但是mysql8.0之后已经删除了缓存这个功能,第二讲执行更新操作,日志模块的运行redolog(重做日志)InnoDB引擎特有固定大小,满了会把数据就更新到磁盘然后清空部分先写日志,并更新内存,等系统空闲时候在更新到磁盘保证数据库发送异常重启,...
2020-04-11 09:19:29
1267
2
原创 mysql杂记
if(exists(内查询),true,false),可用于判断是否有下级(如懒加载需要知道该节点是否有children)例子:SELECT d.id,if(exists(select 1 from department dd where dd.pid = d.id and delete_flag = 0), true, false) as isParent from department ...
2020-04-02 15:07:22
147
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人