- 博客(204)
- 资源 (1)
- 收藏
- 关注
原创 ApplicationEventPubish如何使用
ApplicationEventPubish发布了一个事件,监听这个事件的并作出相应的处理。,可以发布了直接去执行相应的逻辑呀。这是因为可拔插化思想。我订阅了这个事件,我可。没错ApplicationEventPubish就是用来实现着中功能的。以定制他的处理方式,甚至可以不处理,等以后来扩展,这就是它的优势。ApplicationEventPubish是干啥用的。看到publish相比大家都能想到。
2023-03-03 17:38:17
633
原创 springsession中redis键值过期后,后置处理
在spring-session中支持当一个session过期后,来做一些后续的操作。基于redis的发布订阅功能,实现,当对一个key做出操作后,可以对改建进行监听,来做后续的处理。redis中sessions和sessions:expires都会同步的更新过期时间。但是只有sessions:expires删除才会触发后续操作。Redis键空间通知(
2023-03-03 17:21:51
956
原创 线程池中出现异常,不打印日志
submit执行时,因为callable类会被转成FutureTask类,FutureTask的run方法中捕获了异常,所以就不会抛出异常。解决办法手动调用FutureTask的get方法,get方法中会抛出outcome异常。execute执行时 task.run()方法,出现异常会直接抛出。(线程池每添加一个线程,就会在worker中添加一个)(Runnable run)日志信息可以正常打印。(callable call)不会打印日志信息。
2022-12-27 13:50:08
4319
转载 一致性Hash算法
以分布式缓存为例,假设现在有3台缓存服务器(S0,S1,S2),要将一些图片尽可能平均地分配到不同的服务器上,hash算法的做法是:(1) 以图片的名称作为key,然后对其做hash运算。(2) 将hash值对服务器数量进行求余,得到服务器编号,最后存入即可。举个栗子:csdn.jpg 需要存入, 我们就得到hash(csdn.jpg) = 5 -------> 5%3 = 2 得到数据存入S2。
2022-11-24 16:41:03
121
原创 从零开始搭建一个微服务项目(一)
2. 如何通过bootstrap拿到nacos对应的配置呢,会通过服务名+profile名+后缀名组成。各个服务之间是通过Http请求来进行交互,原先使用RestTemplate进行请求,可以使用更方便的openFeign(Feign已经停止维护,通过服务名在数据中心找到多个ip,然后通过负载均衡策略(可以通过实现Irlue来实现),来制定对应的实例ip。原理:通过指定的服务名,去注册中心查找对应的ip地址,然后去向目标发送请求。在消费者服务里建一个接口,写上需要调用的请求,并在接口上添加。
2022-11-17 10:09:58
4376
原创 mybatis实现动态数据源配置
抽象类,可以实现动态数据源的配置我们只需要重新determineCurrentLookupKey方法,去读threadlocal中我们保存的数据源。在写一个选择器用来设置往threadlocal保存数据源。再写一个注解动态的调用选择器设置数据源demo放在主页了可以下载。
2022-11-14 18:29:40
2654
原创 Spring如何解决循环依赖
spring如何解决循环依赖。相信大家都知道要通过来解决,但具体的细节怎么样做的,可以一起来看一下。问什么会产生循环依赖,这就得从IOC说起了将对象交给容器控制,容器来创建对象,及其控制对象的生命周期。容器在实例化对象后,,注入属性A的时候,A需要B,注入B的时候,B又需要A,这就导致了循环依赖。对于Bean的生命周期可以看这篇博客。
2022-11-02 18:57:13
292
原创 如何解决本地缓存的线程安全问题?
多个请求a,b,c在极短的时间内先后调用接口进行本地缓存的刷新,那么在a刷新完毕之后,请求b和请求c可以不再执行刷新操作,缓存刷新实现的效果实际上是一样的。在所还没释放时,进入的线程,不直接业务流程,等第一个锁释放时,他也释放锁。第一个获得锁的线程,正常执行业务流程。实现:可以采用可重入锁。
2022-10-31 18:00:57
246
原创 SpringSession实践
当服务使用分布式部署在服务器时,假设用户请求落在了服务器A上,用户拿到了对应的sessionId,用户再次请求服务时,落在了服务器B上,服务器B不认识sessionId,用户上一次的信息便无法同步了。spring-session 定义了一个过滤器,会拦截传入的session,并并将出入的信息存储在Redis中,取session中的数据也会在Redis中取。将session统一存储在一个服务器上,一般会使用redis等高性能服务器。为什么要使用分布式session,传统的session有什么局限性吗?
2022-10-20 17:54:50
810
原创 Java正则表达式
这种的返回值是boolean,用来判断字符串是否这个正则表达式。和其他语言的正则表达式基本一样,用来处理字符串。Matcher有很多处理方法供我们使用。\ 转义字符 \n 等于 n。这里主要看一下正则的写法吧。[a-z] a-z中的字符。^ 输入字符串开始的位置。$ 输入字符串结束的位置。
2022-10-19 15:10:20
98
原创 git 常用命令(持续更新)
本地项目连接远程项目查看git提示创建及其切换分支git branch (查看所有分支)git branch xxx (创建分支)git checkout xxx (切换分支)分支合并出现合并问题需要在项目里手动修改标签拉取
2022-07-22 16:55:07
200
原创 pom容易忽略的问题
本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。一般父模块配置,子模块通过继承或插入的方式导入依赖。会将项目生成的构件安装到本地Maven仓库,用来将项目生成的构件分发到远程Maven仓库。...
2022-07-21 10:37:29
212
原创 quartz简单用法及其es-job
我们使用一个数组,数组中某一元素的父节点位置处于该节点位置除以二的位置,将插入的任务至于尾部,一直找父节点,找到它对应的位置即可。按照这个特性,我们将任务放入后最小的会跑到顶部,我们取走即可。遍历数组,每个下标放置一个链表,链表节点放置任务,遍历到了就取出执行。堆是一个完全二叉树(出过最后都是满二叉,最后一排叶子节点靠左边),且。任务上记录一个round,遍历到了就round减一,为0时取出执行。月轮遍历到了,将任务取出放到天轮里面,即可实现几号几点执行。缺点需要遍历所有的任务,效率较低。......
2022-07-19 16:00:59
410
原创 什么是微服务
我们经常说的分布式与微服务有什么关系?微服务是一种良好设计的分布式架构方案。特点:所有功能都集成在一个项目中开发,代码冗余高,不利于后期迭代及其维护。优点:架构简单,成本低缺点:代码冗余高,不利于后期迭代及其维护。特点:将项目差分为一个个模块(服务),各个模块之间独立开发优点:模块之间耦合低,易于维护拓展缺点:服务之间调用关系复杂。思考:网关:请求的认证,及其负载均衡等服务集群:调高服务效率及其容错性注册中心:对服务进行管理配置中心:对服务配置作统一管理消息队列:提高异步分布式缓存
2022-06-24 21:44:44
492
原创 保证数据库和缓存的一致性
先更新数据库数据然后删除缓存数据1)删除缓存失败存在脏数据2)难以收拢所有更新数据库入口直接在数据库中修改,缓存不会改变删除缓存数据更新数据库数据等待一小段时间再次删除缓存数据1)延迟时间难以确认到底是延迟一秒或者是几秒,这个其实很难确认,你总不能延迟几分钟吧,因为你如果延迟几分钟,那这几分钟可能就存在脏数据了,所以这个时间很难确定。2)无法绝对保障数据的一致性更新数据库监听binlog删除缓存缓存删除失败则通过MQ不断重试,直至删除成功整体流程图如下:参考如何保障缓存和数据库的一致性(超详细案例)
2022-06-21 22:38:01
216
原创 mysql主从同步及其分库分表基本流程
mysql主从同步中设计三个线程(log dump thread,i/o thread,sql thread),两个日志(bin log ,relay log)。主节点 log dump 线程当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。从节点I/O线程 当从节点上执行startslave命令之后,从节点会创建一个I/O线程用来连接主节点,
2022-06-21 22:29:37
518
原创 在项目中遇到的问题【八】使用Hibernate是因为缓存造成找不到表的问题
Hibernate缓存Hibernate和mybatis缓存机制相似,都是拥有二级缓存,都是会将查出的数据暂时存储在缓存中,当缓存数据发生改变时,为了保证数据库和缓存数据的一致性,会根据缓存去更新数据库中的信息(在执行更新或存储操作时更新数据库)问题:执行save,是执行了一条未知sql,sql中的表不存在。原因:执行了一条查询语句,查出来的数据会被方到缓存中,而我直接对查出的数据进行操作导致缓存中数据被修改,在执行save操作时会更新数据库与缓存一致,又因为在实体类上使用entity注解,表示
2022-04-26 16:01:03
1184
1
原创 项目中遇到的问题(七)@ControllerAdvice配合RequestBodyAdvice/ResponseBodyAdvice处理请求
在项目中看到使用@ControllerAdvice配合RequestBodyAdvice/ResponseBodyAdvice来拦截请求,对其中的数据进行加密,写法非常清晰有必要学习一下。文章目录用法使用场景局限用法controllerAdvice可以配合RequestBodyAdvice/ResponseBodyAdvice,在请求来时或请求走的时候拿到请求中的数据,对数据进行处理,在一定程度上可以替代interceptor.//要扫描的包名@ControllerAdvice(basePac.
2022-04-25 17:17:14
1202
原创 如何快速的使用RocketMq
开始前需要简单了解一下,RocketMq的原理,参看之前的一篇文章 rokcetmq在正式开发中。我们主要关注两个方面,发送者和接收者。发送者我们创建一个 DefaultMQProducer的Bean,在Bean中设置mq的nameserver,账号密码等(配置可以存储的disconf中)。在需要使用的地方注入bean,使用其send方法,传入要发送的数据即可。@Bean(name = "rocketMqProducer") public DefaultMQProducer def.
2022-04-24 16:12:24
1076
原创 使用索引所需要的注意点
文章目录数据库索引创建规则选择怎样列上创建索引数据库索引创建规则1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:A、正确选择复合索引中的主列字段,一般是选择性较好的字段;B、复合索引的
2022-04-24 11:51:08
1071
原创 项目中遇到的问题(六)Spring生命周期
文章目录spring生命周期分析源码初始化aware接口BeanFactory容器下ApplicationContext容器下Bean后置处理器BeanFactory 和ApplicationContext的区别BeanFactoryApplicationContext常用接口 、CommandLineRunner接口ApplicationContextAware接口spring生命周期spring生命周期可以分为四大块初始化属性赋值实例化bean(Aware接口,bean前置处理,初始化方法
2022-04-22 17:12:57
707
原创 原来我不懂java序列化
java序列化,想必大家都很清楚吧。不就是实现Serializable接口吗,目的就是为了将对象转为二进制,方便传输。你说对了,但事实往往没有这么简单序列化和反序列化序列化序列化就是将对象的状态转为特定流的过程对象的状态:那么静态变量可以被转化吗,不可以,因为静态变量是数据类的而不是变量。流: 也就是转为字节序列反序列化获取特定流中数据重新构建对象的过程什么时候使用序列化反序列化大家都知道,对象是保存在内存中的,更准确的说是位于JVM中,生命周期收到JVM的限制,如果我.
2022-04-22 13:33:33
384
原创 项目中遇到的问题(五)操作Excel接口Poi的理解
excel有多种数据类型,这里只对.xlsx类型做讨论excel格式打开Excel左下角可以看到有sheet,一个sheet就是一页,Excel可以有多个sheetsheet中有好多行row每一行中会有很多单元格cell创建excel的思路首先通过ExcelWriter,这个类可以传入新建的或已有的Excel文件,对里面的数据进行...
2022-04-21 16:49:09
192
原创 项目中遇到的问题(四) @async的用法及其批量处理大量数据的思路
文章目录@async的用法自定义线程池async指定线程池测试批量处理大量数据的思路@async的用法@async注解可以放在类上,或者注解上。可以使方法或类异步的执行。一般我们会配合线程池去使用自定义线程池 @EnableAsync @Configuration class TaskPoolConfig { @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor exec
2022-04-21 16:01:04
1143
原创 数据库事务
文章目录数据库事务的四大特性:ACID隔离级别及其隔离级别所造成的问题隔离级别隔离级别所造成的问题解决办法oracle和mysql默认隔离级别springboot使用Transactional注解()数据库事务的四大特性:ACID原子性:事务包含的所有数据库操作要么全部成功,要不全部失败回滚一致性:一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这
2022-04-14 14:40:26
233
原创 快速了解logback
打开logback配置文件。可以看到< configuration >< /configuration>有三个参数供我们选择scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logbac
2022-04-13 15:38:32
2207
原创 javaweb中没有main方法 是怎么启动的。
最近在做springboot项目springboot内置了tomcat,但却不明白之间的关系,以为是springboot启动了,加载了tomcat,然后执行的,原来是不对的。文章目录tomcat启动Springboot与tomcat的关系tomcat启动在tomcat中有一个bootstarp类就是他启动会去加载jar包然后执行的。当执行了tomcat中startup的shell脚本,就会启动jvm,然后使用类加载器,加载Bootstart类,该类会执行main方法,去加载webapp下.
2022-04-02 17:57:33
2958
原创 项目中遇到的问题(三) 代码规范
写完代码后记得 ctrl+l /ctrl+o 使代码格式规范,一来方便阅读,二来方式同事使用ctrl+l后会大量覆盖git记录redis中key值要符合规范 以业务名为前缀 中间用 :隔开 ,比如业务名:服务名:标志redis一定要设置过期时间,防止一直占用内存。在项目中禁止使用sysout,e.printlstack等价格字段,严禁使用Dubble类型,要用BigDecimaldouble转为BigDecimal()不能直接转 会有精度问题 要将double转为string在转 或者.
2022-04-02 16:48:01
1101
原创 项目终于遇到的问题(二)系统中的异常该如何处理
现在有两种解决思路。及时解决 使用Result.fail() 返回异常异常全部抛出,使用统一拦截类拦截拿到异常,读取错误码及其其他信息,返回。这里来探讨一下第二种方式。我们可以将异常信息放在数据库中,我们取到数据放到全局(statis)map中,当有新增错误码时,可以通过mq获取到变化的错误码,并更新mq声明一个异常类(进程RuntimeException),类里有错误码,错误信息,错误描述遇到异常或错误信息,将错误码(一般放在枚举中)放在异常类中抛出全局拦截类拦截到后,通过错误码.
2022-04-02 16:25:15
1250
原创 DDD领域驱动设计
Domain-driven design 领域驱动设计在查询有关资料时 看到的DDD与传统的MVC最大大区别便是 模型(Model)承载着业务的属性和具体的行为,是业务表达的方式、是DDD的内核。是一个类中有属性、属性有Get/Set方法,并且业务的行为(Action)操作也是在模型类中目录差别DDD三层架构API层Domain层Repository层Domain细节项目架构分层图差别传统的mvc模型DDD模型在MVC中业务全部在Service层实现,而DDD模型放到了Domin中D.
2022-03-31 17:36:27
1215
原创 Nginx简单了解
为什么要是用为什么要是用 nginx主要是因为三个方面 反向代理,负载均衡,动静分离反向代理客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。代理对象是服务端,不知道客户端是谁。负载均衡将原先请求单个服务器的情况改为将请求分发到多个服务器上,将负载分发到多个服务器上,也就是我们讲的负载均衡动静分离为了加快网站的解析速度,可以把动态页面
2022-03-18 17:44:06
2964
1
原创 线程池简单实用 及其JVM简单参数
目录Callable线程池JVM参数Callable接口 只有一个方法 call与run方法功能一致,但有返回值,可以用future接受处理 此接口为函数式接口 可以使用lambda此处配合Fature 统计100位随机数之和call实现类public class CallTest implements Callable { static ThreadLocalRandom current = ThreadLocalRandom.current(); public sta
2022-03-17 20:43:55
509
原创 重入锁Lock 基本用法
ReentrantLock是一个类可以实现类似synchronized的功能(jvm实现),但更加灵活。常用方法可以看到,lock实现了Lock接口,而接口中有这几个方法lock()方法:上锁unlock()方法:释放锁newCondition():获得Conditon一个监视器await() 类似Object wait使当前线程进入等待状态signal() 类似notifay 唤醒进入等待状态的线程可以选择模式 公平锁和非公平锁ReentrantRea.
2022-03-16 21:38:08
603
jdk-14.0.2_windows-x64_bin(1).rar
2020-08-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人