自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 JAVA多线程&线程池

JAVA多线程&线程池懂线程者,更胜于面试,更优于性能,与君共勉;线程进程和线程:一个进程包括多个线程。把视频软件理解为一个进程,而把视频+音频+弹幕可以理解为是视频软件中互相协作的三个线程;并行与并发:并行指的是多个线程同时执行各自的任务;并发则是指,单个线程抢占时间片,高速来回切换执行不同的任务。表面上多个线程持续运行,实际上单个线程走走停停。线程的状态1.1 new() ,创建线程,该线程进入新建状态;1.2 start(), 创建线程后,调用线程的start()方法

2022-05-08 11:50:05 468

原创 简述五种常见的IO模式

一次IO读取操作,分为几个步骤:用户线程发送read()请求,从用户态切换到内核态;操作系统接收到请求后,通过DMA将数据从磁盘copy到内核缓冲区;然后CPU从内核态切换到用户态,将内核缓冲区的数据copy到用户空间;简单来说,一次IO操作分为数据准备与数据复制两个过程;阻塞IO(BIO)所谓阻塞IO,即用户线程发起io读取请求时,操作系统会根据请求准备对应数据,此时,用户线程就会处于阻塞状态。直到操作系统将数据准备完毕并且将数据copy到用户空间,此时用户线程才会接触阻塞状态;非.

2022-04-06 23:32:55 2164 1

原创 零拷贝-易懂讲解

零拷贝-易懂讲解相信大家平时在学习类似Kafka,netty等技术时都会经常见到“零拷贝”这个词,也知道“零拷贝”的出现会让网络数据传输效率更高,那么,本着知其然并知其所以然的原则,今天一起来了解一下它倒是是个啥玩意儿引言Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内

2022-04-01 23:16:44 434

原创 java-性能优化篇

java-性能优化篇因为一次公司倒闭,感悟到人生不容易,选择以物联网做副业,从事物联网卡代理,希望认识更多好朋友,合作共赢.(当你身上有了担子,你就会发现,收入来源太单一,会使你没有安全感!)公司项目已经完成阶段性上线,目前正在对残留的一些性能问题进行优化,今天针对优化过程中的一系列流程进行整理,希望能帮助到各位。我们单纯的先从软件层面出发(硬件的说实话,不是很good at)第一步:分析性能问题首先,可以依据类似听云这类全链路日志,可以看到整个接口的调用链路以及响应时间。每个sql语句的耗时

2022-03-10 00:13:26 1458

原创 ThreadLocal及其扩展

ThreadLocal及其扩展ThreadLocal是JDK提供的,是线程的本地变量,如果创建一个ThreadLocal变量,那么所有访问这个变量的线程都会有这个变量的一个本地副本。ThreadLocal可以理解为是一个全局的初始变量,但是每个线程访问该变量的后续操作,都是对自身副本的操作,规避了线程安全问题。一. ThreadLocal1.Thread,ThrealLocal,ThrealLocalMap的关系?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F

2022-01-28 10:52:53 636

原创 随笔(大数据)

很久没更新博客了,不是说不没坚持,是最近发生的事情比较多。今天不讨论具体记录,简单总结这段时间的事情,和未来一段时间的规划。朝花夕拾-旧事重提这接近一个月的时间,换了工作,搬了宿舍,吐槽了房地产,怒怼了“好凉凉”。。。简单说说主要说工作吧,新的公司从事教育行业,目前所在的项目组任务主要在万亿级的数据报表统计汇总。也是在这样一个功能模块驱使下,开始接触了大数据。起初—充满好奇面对一个全新的领域-大数据,深知是机遇也是挑战。疯狂百度了一波大数据Spark生态圈。存储—hdfs,计算—mr,.

2021-08-26 22:19:57 141

原创 feign异步调用丢失上下文

微服务架构下,通过feign进行服务间的调用。但是某些场景下,为了用户体验,及时响应,某些耗时的附加操作需要开启异步任务来调用,但是在这种异步调用方式下,可能会存在上下文丢失的情况。解决方案:将主方法的上下文作为参数传入主方法 /** * 导入数据 * * @param file * @param customerId * @return */ @Override public void listImport.

2021-07-31 12:12:43 618

原创 异步任务读取不到已插入的数据

异步任务,一般使用于耗时的附加功能,如果在主方法的事务中向数据库插入数据,此时调用异步任务读取主事务插入的数据,可能会存在查询不到数据的问题。发生场景:上述场景中,主方法向用户表中插入数据,但是剩余的业务逻辑还未执行结束,此时开启一个异步线程,异步任务中的业务逻辑是读取主方法新增的user,并根据user的邮箱发送消息;此时如果主方法中的事务还未提交,那么异步任务中读取新增的user可能会出现读取不到的情况。解决方式:判断主方法中,业务执行结束并且事务提交过程需要多久,然后在异步方法中让线.

2021-07-31 12:10:40 3267 3

原创 JavaAPI操作Zookeeper连接报错

JavaAPI操作Zookeeper连接报错测试代码如下:public class ZKClient { String connectString ="47.98.183.176:2181"; //ZKip地址+客户端通信端口号 int sessionTimeOut = 10000; //会话超时时间,该时间内,如果没有连接成功,则超时 ZooKeeper zkClient; @Test public void createZnode()

2021-07-28 22:50:49 499 2

原创 Zookeeper基础讲解

简介:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,可以通过ZooKeeper进行统一命名服务、统一配置、集群管理、分布式锁理、负载均衡等,简单来说,Zookeeper=文件系统+监听通知机制。为了便于理解,可以这么解读:1. ZK内部拥有一个树状的内存模型,每个节点称为znode,可以用来存储少量的节点数据,比如节点路径以及关联的子节点列表;​ 2. 集群中如果某个服务器节点下线,不提供服务了,ZK可以将这类信息通知到所有监听了这个节点 .

2021-07-27 16:28:21 912

原创 JAVA锁-各种锁

前提了解:CAS算法:Compare And Swap(比较与交换),是一种无锁算法,设置到3个值:V(需要操作的内存值)、A(需要与操作的内存值进行比较的值)、B(写入的新值),只有当V=A的时候,才会将B更新到V;举个例子理解,当我们要重新设置某某账户的密码时,会让你输入原始密码验证是否正确,只有正确的时候,新密码才会设置成功;此处就是将手动输入的原始密码与数据库保存的原始密码匹配是否一致,如果一致,则更新新密码;如果更新失败,会循环读取比较CAS存在的问题:ABA问题。拿上述例

2021-07-19 22:55:20 395

原创 Redis过期删除以及内存淘汰策略

近期面试,游走于刀锋之上,闻题:key过期如何删除,再之,数据满后何解?研习之,遂记之。Redis对key设置过期时间,到期后,如何删除?定时删除设置某个key 的过期后,同时创建一个定时器,让定时器判断满足过期时间,满足立即删除。优势: 采用立即删除,能及时进行内存清理,避免大量无效key存在内存中;劣势:如果过期的key较多,对cpu会造成一定的压力.惰性删除key过期时, 不会立即删除, 而是在获取key时判断key是否过期, 如果过期, 获取时直接删除.优势.

2021-07-17 22:50:32 111

原创 Redis缓存问题

1. 缓存穿透缓存穿透指的是,高并发情况下,访问redis缓存中的某个key,key不存在,然后请求落入mysql发现依旧没有找到对应的值;此时大量的请求会直接落入mysql,出现mysql服务崩溃。解决方案:布隆过滤器;缓存空对象,请求某个key,如果key不存在,则赋值一个空对象;2. 缓存击穿缓存击穿指的是,大量请求落在某个热点数据,一直获取redis中的某个key,如果key过期,还未进行新的赋值操作,大量的请求会直接落在mysql服务器上。解决方案:设置热点数据永不过

2021-07-06 16:29:39 128

原创 Redis主从复制与哨兵模式

Redis主从复制1. 架构模型主从复制模式至少要有3个redis服务器节点,每个redis服务器启动时,都默认是主机,所以只需要对从机进行配置所属主机。集群环境中,主机只做写入,从机只做读取。2. 实现方式由于服务器环境有限,测试将会在一个服务器启动多个redis节点模拟redis集群,实际工作环境中,redis服务端会运行在不同的服务器上。准备工作:(以下文件仅在同服务器多节点测试使用,实际工作场景,多个服务器不需要配置,只需要配置从机所属主机的ip地址和端口号)找到re

2021-07-06 15:18:12 113

原创 Redis配置文件与持久化方式

基本配置redis.conf,配置不区分大小写;units are case insensitive so 1GB 1Gb 1gB are all the same.includes,可以引入其他配置文件;include /path/to/other.confbind ,绑定可以访问的ip,默认绑定本机,注销及所有ip都可以访问;bind 127.0.0.1protected-mode yes #设置保护模式打开port,设置运行端口,默认6379port 63

2021-07-05 18:38:09 152

原创 Redis事务原子性

Redis事务原子性事务,是一系列的逻辑运行操作。事务具有ACID,原子性,一致性,隔离性,持久性。但是,作为非关系型数据库的Redis,事务是一组命令集,针对这组命令集,事务还是否具有原子性?实例操作分析以上指令:开启事务,键入正确的指令入队,其中加入一些错误的指令lpush name cz,最终执行事务。结果发现,正确的指令都正常执行,只有错误的执行抛出了异常信息。事务执行后,针对事务中创建的list数据,依旧可以获取到值。说明整个事务并没有因为某个指令的错误而全部失败。因此,Redis

2021-07-02 10:39:25 539

原创 Redis分布式锁

Redis分布式锁1. 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>2. 分布式锁实现setnx命令set if not e

2021-06-24 16:35:01 151 1

原创 @Async异步任务

@Async异步任务在日常项目中经常会遇到一些耗时的附加功能,不影响程序主功能。比如说:发送邮件,下载Excel任务之类;如果需要用户在界面等待当前功能执行结束才能继续做接下来的操作,体验感时绝对很差的,这个时候,就需要开启异步任务,让用户无感知的进行操作。模拟不使用异步任务控制器代码//test控制器@RequestMapping("/user")@RestController@ResponseBodypublic class Controller { @Autowire

2021-06-23 13:23:29 205

原创 URL下载网络资源

今天碰到这个功能,就正好整理一下很久很久之前写socket通信时,关于信息、资源发送读取的部分代码。 URL url = new URL("http://xxx.jpg"); //网络资源地址 URLConnection connection = url.openConnection(); //打开网络连接 InputStream inputStream = connection.getInputStream(); //读取图片 FileOutpu.

2021-06-21 16:03:52 137

原创 Mysql索引

Mysql索引常闻索引,知其然,不知其所以然,遂微究之。数据库查询数据的瓶颈在于磁盘的IO读取,所以数据库设计索引时,需要考虑尽量减少磁盘的IO读取次数。Mysql底层数据结构索引的作用是用来做数据的快速检索,而快速检索的实现的本质是数据结构,通过选择不同的数据结构,实现各种数据快速检索。1. Hash哈希算法:也叫散列算法,就是把任意值(key)通过哈希函数变换为固定长度的key地址,通过这个地址定位具体的数据结构。举例:从用户表中查询id为7的用户信息,select * from

2021-06-17 15:33:55 151

原创 自定义注解+AOP实现操作记录

自定义注解+AOP实现操作日志记录自定义注解 /** * 用户操作记录注解 * @author cz * */@Target(ElementType.METHOD) //定义该注解使用位置为方法上@Retention(RetentionPolicy.RUNTIME) //设置该注解运行时生效public @interface OperationAnno { /** * 功能模块 */ String module(); /** *

2021-06-11 20:27:41 210

原创 Mybatis-Plus学习

Mybatis-Plus官网地址简介Mybatis-Plus,(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。愿景:成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍快速开始1. 引入依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spr

2021-06-08 14:09:57 112

原创 IDEA中的Git操作

IDEA中Git相关操作今日搬砖以Git,同事懵而用,后又数现之,于是乎查之,究之,学之。半晌,豁然开朗!本篇文章不会介绍git以及扩展其他版本控制工具,直接讲解实际工作中,基于IDEA中有关git的操作。假设有如下场景:研发主管A带着组员B共同开发某个项目新建项目并上传的远程仓库新建本地仓库选择本地仓库的位置add,项目添加到本地仓库暂存区(stage)commit,将stage暂存区的文件提交到当前分支的本地仓库 **注意,如果不是初次提交,每次c

2021-06-05 09:19:28 418

原创 lambda及stream学习

lambda及stream学习今日板砖,见lambda,不知其然遂不以为意。后又数现之,于是乎查之,究之,学之。半晌,豁然开朗!lambdalambda可以理解为一个匿名函数,可以将函数作为参数传入方法中,语法:() -> {}():用来描述参数列表->:lambda运算符{}:用来描述方法体对比//1.原始创建线程方法 Thread thread = new Thread(new Runnable() { @Overr

2021-05-20 11:42:46 141 1

原创 JAVA操作excel-POI及EasyExcel

POI及EasyExcelPOI官网EasyExcel官网EasyExcel使用说明POI操作excel的组件列表:​ HSSF : 它被用来读取和写入MS-Excel文件的xls格式。—03版本excel​ XSSF : 它是用于MS-Excel中xlsx文件格式。—07版本excel1. 导入依赖03版本excel,.xls表格文件,最多支持65535行数据<!--xls 03版本 --> <dependency>

2021-05-12 14:21:36 206

原创 JAVA双亲委派机制

当你处在最低谷时,不管往哪里走,都是进步!java类加载及双亲委派机制java类加载流程执行javac命令,启动java编译程序,将.java源代码文件编译为jvm可识别的.class字节码文件。(我们用idea、eclipse编码出的就是.java源文件,启动后。target文件夹下就是编译后的.class字节码文件)类加载器,将.class文件的二进制数据读入到内存中,存放到jvm内存结构的方法区内,并在堆中创建对应的class对象实例。执行java命令,会启动jvm,加载运.

2021-05-10 15:54:03 109

原创 DelayQueue学习及定时任务实现

延迟队列DelayQueueDelayQueue概念DelayQueue是一个***无界***的***BlockingQueue(阻塞队列)***,队列中的元素是以到期时间进行排序的,只有到期的元素才能被取出。扩展无界队列:简单来讲,无界队列就是指,当队列满了之后,如果又新增元素,队列会自动扩容;举一反三,有界队列就是队列容量固定不变。阻塞队列:简单来讲,阻塞队列就是指,当队列元素为空,获取元素的线程会等待队列变为非空,除非线程关闭;队列满时,添加元素的线程也会等待队列可用。同理,

2021-04-30 11:38:13 298

原创 ApplicationRunner实现“项目启动就执行“功能

ApplicationRunnerApplication是个接口,常用于项目启动后(SpringApplication.run()执行结束),立马执行某些逻辑。可用于项目的准备工作,比如加载配置文件,加载执行流,定时任务等。如何使用Application实现ApplicationRunner接口,重写run方法,定义具体的执行逻辑;@Order注解,用于决定多个bean的执行顺序;按照值从小到大执行;扩展CommandLineRunnerCommandLineRunner与Appli

2021-04-29 11:18:33 525

原创 ES入门学习

ElasticSearch入门学习ES官网安装部署教程入门教程分片机制es简介(是什么)概念**Elasticsearch 是一个实时的分布式存储、搜索、分析的引擎,使用一种称为 **倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。背景Elasticsearch由一些Elasticsearch进程(Node)组成集群(cluster),用来存放索引(Index)。为了存放数据量很大的索引,Elasti

2021-04-28 15:52:12 916

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除