java
喝杯绿茶
积跬步,行千里
展开
-
springboot中@Order不生效的一些记录
springboot 切面 @Order原创 2022-07-20 17:52:14 · 2010 阅读 · 0 评论 -
@Documented,@Retention,@Target
java 自定义注解原创 2022-07-20 10:55:31 · 496 阅读 · 0 评论 -
linux清理磁盘
linux原创 2022-06-22 16:22:51 · 101 阅读 · 0 评论 -
jvm-OutOfMemoryError:Java heap space
最近项目中遇到了一个内存溢出,堆内存溢出的问题,具体怎么发现的,就不过多写,基本项目不可访问,然后查看错误日志,就能看到该错误提示。下面说一下怎么查找溢出的问题发生地点:思路:拿到dump文件,然后分析原因如何拿到dump文件,首先想到的是:jmap -dump:format=b,file=文件名 线程id但是有个问题,这是发生问题之后使用的,而我们一般发生这样的问题,最快的让线上能够访问的方法是自动重启jvm,毕竟迟一秒,损失就不可估量,除非你的系统无访问量。那么jmap这种手动的方式原创 2022-04-19 14:47:28 · 359 阅读 · 0 评论 -
Scheduled的cron表达式的一些整理
在做spring的定时任务的时候,关于cron表达式中的* 和 ?这两个字符一直都分不太清,所以这次重点写一下。cron 表达式的组成: 秒 分 时 天 月 周 年最后一个年一般都省略了,所以我们平时用的cron一般是6个部分使用.* 表示每一个,这cron中的7个位置都可以用,例如如果用在秒的位置,表示每秒。?表示不关心当前位置的值,所以常翻译为任意,但是使用位置只能在天和周,例如如果天的位置设置了具体值,周的位置也设置了具体值,那就具体到星期几了,意思就是几号星期几,这样同时满足这样的条原创 2022-03-28 14:34:55 · 512 阅读 · 0 评论 -
springboot读取配置文件
一.读取springboot框架自带的application.properties或application.yml文件.1.通过@Value注解来读取application.properties文件内容:name=1user.name=2读取方式:@Value("${name}")private String name;@Value("${user.name}")private String userName;如果要设置默认值:@Value("${name原创 2022-03-24 15:22:39 · 17849 阅读 · 1 评论 -
maven打包时打入依赖的jar包
首先说结论,是结合maven的打包插件:maven-assembly-pluginmaven中常见的打包插件有三种:1.maven-jar-plugin --- 打包普通的project2.maven-shade-plugin --- 打包可执行的jar3.maven-assembly-plugin ---打包定制化依赖,定制化打包结构使用:<plugin> <groupId>org.apache.maven.plugins</groupI..原创 2021-07-22 10:15:35 · 2486 阅读 · 0 评论 -
springboot集成logback
文件结构:说明: 三个配置文件,application.properties ; application-dev.properties ; application-prod.properties ; 注意命名规则,然后通过spring.profiles.active指定指定文件生效.logging.config 指定日志文件位置.logback-spring.xml内容:<?xml version="1.0" encoding="UTF-8"?><configur原创 2020-11-26 17:25:57 · 1986 阅读 · 0 评论 -
springboot跨域配置类
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.UrlBasedCorsConfigurationSource;import org.springf.原创 2020-11-26 17:16:15 · 468 阅读 · 0 评论 -
unsafe
java并发编程的juc下面有很多的类,但是底层实现都是基于unsafe这个类,其中的使用的方法是:unsafe.compareAndSwapObject(this, tailOffset, expect, update)unsafe.park(boolean var1, long var2)unsafe.unpark(Object var1)基于这三个方法实现了:ReentrantLockLockSupportCountDownLatchCyclicBarri原创 2020-05-20 15:29:16 · 200 阅读 · 0 评论 -
BIO,NIO,netty
今天来说说几种IO的进化史吧。BIO:问题: accept()和read()都是阻塞的,假想,客户端一进来了,在read方法阻塞,客户端二是连不进来的。第二种情况,客户端一连进来了,第一次发送消息完毕之后,第二次要重新从accept方法开始。多线程版本:解决了第一个客户端连进来了读的时候,其他客户端无法进来的问题,显然当客户端的数量增大的时候,线程的开销是吃不消的。低配版的NIO:使用一个list来储存客户端,并且将accept和read方法都设置为非阻塞。问题:虽然是单原创 2020-05-19 18:07:28 · 163 阅读 · 0 评论 -
消息对列重复消费的问题
消息对列:异步,解耦,削峰在使用消息对列的时候,常常遇到的问题是:如何保证生成者消息发送成功了,或者是如何保证消费者消费到了消息。在这个过程中,一般采用的是确认加重试机制完成。在这个过程中,生产者可能会触发重试机制,消息对列也可能会触发重试机制,那么消费者这边就可能会发生重复消费的问题。解决办法:1. 采用CAS乐观锁的方式来解决2. 采用对账的方式,在消费者这边需要被改变的id,如果已经被修改了就存进表中或者redis中,下次要改变先查询一下有没有被执行过。例如订单号。...原创 2020-05-11 13:43:00 · 138 阅读 · 0 评论 -
http 与 https
今天写写https与http的区别,也是经常会被面试问到的问题。首先http协议:无状态的,然后文本传输,一个很大的问题,安全问题在明文传输过程中,可以被人截获。升级:对称加密方式,但是也有一个问题,在第一步的时候,对称加密的密钥也有可能被截获。再升级:使用非对称加密方式。这也是https的原理,它里面使用的是ssl证书。...原创 2020-05-11 11:57:28 · 109 阅读 · 0 评论 -
并发编程-线程池
今天要聊一下线程池的知识,因为比较简单就先讲参数再花一下流程图public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<R原创 2020-05-10 15:22:20 · 116 阅读 · 0 评论 -
TCP,socket
首先一个client要连接一个server,基本要经历两个基本步骤:1. 建立连接,2.指定通讯协议(http协议,redis协议)网络七层: 网络通信和网络io是两回事。TCP是面向连接的,可靠的传输。socket:socket也就是套接字,是由客户端的ip和端口号,加服务端的ip加端口号组成的唯一表示。...原创 2020-05-06 14:53:25 · 697 阅读 · 0 评论 -
分布式任务
在spring我们传统的定时任务是通过@Scheduled 加上cron表达式来做的。但是这样存在这一些问题 :1.单点问题,做集群任务的重复执行问题不好解决2.cron表达式定义在代码之中,不能够实时修改3.定时任务失败了,无法重试也没有统计...分布式任务调度,就可以通过一个调度中心微服务来管理,所有的定时任务都通过数据库来维护,可以有多个执行器,负载均衡也可以在调度中...原创 2020-05-06 14:52:22 · 376 阅读 · 0 评论 -
秒杀-redis令牌桶
秒杀: 大量请求抢夺少量资源的时候。如果直接使用数据库的乐观锁或者悲观锁来实现,数据库压力很大,处理效率也很低下。这里有一个比较好的思路就是利用redis令牌桶的方法实现。首先了解一个redis的几个命令:redis.rpush(key,value); 向队列右侧添加元素redis.lpop(key);从队列左侧拿出一个元素redis.sadd(key,value); 向s...原创 2020-05-06 14:38:09 · 687 阅读 · 0 评论 -
分布式id
今天说一下分布式id的解决方案常见的分布式id解决方案:1,基于数据库自增 2,基于redis的自增 3,基于Long类型的64位的雪花算法(这里不考虑uuid的方案)先说一下数据库自增,如果你是一个单点数据库来做,那么很简单,就是直接取自增id就行,这个数据库也可以额外做一个备份数据库。如果是多个数据库的话,就要设置其实自增点,和每次自增的步长,但这有一个不好的地方是,不好扩...原创 2020-05-06 11:46:02 · 102 阅读 · 0 评论 -
volatile
2020年五一的倒数第二天假了,其实还是那个想法,如果是个穷人,其实假期对于自己来说,只是一个追赶别人的一个机会。废话不多说,今天聊一下并发编程中的valatile。volatile,是什么,它是修饰变量的,修饰完了之后有什么变化呢?两点:1,让该变量在多个线程之间保持可见性 2,在jvm层次可以设置内存屏障防止重排序的事情发生什么是线程的可见性?或者说什么是线程的不可见性?不管...原创 2020-05-04 14:41:27 · 128 阅读 · 0 评论 -
Synchronized
今天要说的话题是并发编程之Synchronized说Synchronized之前,得先聊一下CAS。首先,什么是CAS呢? compare and swap。例如,两个线程都去内存之中,取A的值,并且进行更新,每次更新的时候,先比较一下A的值和我之前拿的值是否是一样的,如果一样就更新成功,如果不一样,就把A的新值重新拿出来,然后进行下一轮CAS操作。那么这样会引发什么问题呢?...原创 2020-05-03 14:32:34 · 1989 阅读 · 0 评论 -
聊聊存储,redis为什么会快?
在生活中,我们要存储一些东西,会怎么做,比如我就给你8个箱子作为存储介质,你是不是会依次把东西放进每个箱子,假如每个箱子只能存2个物件。如上图,所有物件都存储完毕了。下面要你找出10的物件,你会怎么做?是不是需要选择箱子,一个一个翻开查找,直到找到10,理论上讲需要找:1~2*8次。这就是遍历查找。东西是存好了,但是查询效率太低了,那怎么提高呢。如上图。...原创 2020-04-29 14:35:24 · 904 阅读 · 0 评论 -
ThreadLocal的一些理解。
在聊ThreadLocal之前,首先咱们得先聊一下,强引用,软引用,弱引用与虚引用的问题。1.强引用Object o = new Object();这里的o就是强引用,如果引用一直存在,该对象就不会被回收。2.软引用 A a = new A(); SoftReference<A> soft = new SoftReference&l...原创 2020-04-28 17:12:32 · 204 阅读 · 0 评论 -
redis--缓存穿透,缓存雪崩,缓存击穿。
1.redis缓存的由来传统网络访问系统图:当client访问量增大的时候,数据库会出现性能瓶颈,导致qps低下,解决方案:数据库集群,数据库读写分离。理论上讲,无限新增机器,新增数据库节点,是可以解决这个问题的,但是要考虑资源成本和维护成本。故引出了我们的缓存。缓存能提高qps的原因是:缓存基于内存运行,数据库基于硬盘运行。这里的缓存在java web中我们一...原创 2020-04-26 11:42:22 · 309 阅读 · 0 评论 -
session , token , sign
首先,我们知道session和token都是为了协助用户访问web服务器的一种介质。那么先看一下web的发展史吧,为什么我们要使用session或者token,然后他们两有什么区别呢?早期我们的web访问都是单纯文本类容,例如新闻,没有用户交互,不过后来我们有了购物网站这样的web应用,那么想想如果张三第一次访问购物网站添加了一个商品到购物车,然后第二次访问的时候如何找到这个购物车的商品...原创 2019-10-25 11:48:22 · 352 阅读 · 0 评论 -
java什么是双亲委派,为什么它可以保证安全?
首先上一张网图:双亲委派是:简单来说,当一个类被类加载器加载的时候,它会先判断自己的父级能不能能够加载该class文件,它父级拿到之后也会同样的先判断自己的父级是否可以加载,直到到达顶级的启动类加载器,如果在这个过程中父级可以加载就父级加载,如果到最后父级们都不能加载自己也不能加载,就会抛出异常。为什么是安全的?首先我们定义一个类public class String{ ...原创 2019-10-23 18:07:10 · 1054 阅读 · 1 评论