自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

原创 利用Scala高阶函数减少代码重复

理念所有的函数都可以分为通用部分和非通用部分。通用部分每次调用都相同,非通用部分在不同的调用中可能有变化。通用部分就是函数体的静态代码,非通用部分通过参数来表达。如果把函数作为参数,那么函数所代表的算法逻辑,也可以作为非通用部分,从而整个函数的扩展性进一步增强,可以面向逻辑进行扩展。Scala支持将函数作为参数传递,这给了我们更多优化代码的空间。把函数作为参数的函数,称为高阶函数。实践以一个文件搜索匹配的代码为例,优化之前的代码如下def filesHere = new File("./src/m

2022-04-29 20:25:17 438

原创 多个资源分布式锁的问题

多个资源分布式锁的问题问题描述一般来说,分布式锁的场景是,多个程序共享同一个资源,加锁的时候只要把这个资源入口锁上就可以了,比如抢火车票。这个场景中,程序和资源是多对1。多个资源锁的场景是,多个程序要共享多个资源,程序和资源是多对多,比如资源是每个城市的火车票,一个人可以提交多个城市的抢票请求。方案1最简单粗暴的方式是总线锁,我一次把全国都锁住,这样肯定是安全的,但是效率会降低,抢上海和广州的人会冲突。方案2就是把用到的资源锁住,比如抢了ABCD个城市,就锁住这4个另一个人来了之后,假

2022-04-15 14:33:33 1056

原创 如何用VsCode进行Debug

如何用VsCode进行Debug本文以Mac系统,C++程序为例,进行Debug操作安装插件不同的语言需要安装的debug插件不一样,如下Debug页面VsCode的Debug页面如下配置Debug环境点击左侧的Debug图标,默认情况下,展示的是配置提示点击图中的【运行和调试】,选择【GDB/LLDB】环境,之后在下拉列表选择【默认配置】,系统自动创建launch.json文件,用于记录debug的配置信息,其中最主要的是配置调试的程序,program字段,选择要debug运行的

2022-03-04 12:56:36 63747 2

原创 cron 表达式配置

cron 表达式配置常用case常用表达式例子  (1)0/2 * * * * ? 表示每2秒 执行任务  (1)0 0/2 * * * ? 表示每2分钟 执行任务  (1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务  (2)0 15 10 ? * 2-6 表示周一到周五每天上午10:15执行作业  (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作  (4)0 0 10,14,16 *

2022-02-24 12:47:13 603

原创 如何使用VsCode的RunCode编译多文件执行

如何使用VsCode的RunCode编译多文件并执行注意:本文基于Mac电脑操作执行步骤编辑runcode的配置文件打开Code>>首选项>>配置,搜索run code,找到Code-runner Executor Map,如下图编辑runcode配置文件点击在settings.json中编辑,得到以下默认配置{ "code-runner.saveFileBeforeRun": true, "code-runner.clearPreviousOut

2022-02-22 11:01:08 5716

原创 如何用VScode编译多个文件

如何用VScode编译多个文件问题本文基于Mac电脑操作,Windows系统应该也类似默认情况下,在vscode中执行runCode,只会编译当前文件,如果引用了其他文件,则会报错,如下Undefined symbols for architecture x86_64: "WorkerManager::showManu()", referenced from: _main in main-7cf994.o此时,如果使用g++命令手动编译依赖的文件,是可以解决问题的,但是过于麻烦,

2022-02-22 10:32:56 9483 4

原创 基于抓包工具分析耗时问题

基于抓包工具分析耗时问题背景开发了某个http接口,在测试耗时的时候发现,客户端耗时远大于服务端代码打印的耗时,初步判断耗时出在框架和网络层面,主要应该是网络以这个问题为例,介绍通过tcpdump和ngrep抓包分析耗时的过程实践操作步骤在客户端使用time +curl命令,可以打印出客户端的耗时,示例如下请求time curl --location --request GET 'http://10.89.43.18:8083/path'耗时结果0.01s user 0.01s

2022-02-17 17:09:56 2165

原创 基于Java Selector实现网络通信

基于Java Selector实现网络通信服务端代码整体思路启动一个ServerSocket,注册到Selector上无限轮询,从Selector上获取有事件的Socket根据事件Socket类型,进行accept或者read处理代码package zx.io;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channel

2022-01-18 20:30:51 271

原创 SpringBoot 全局异常处理

文章目录简介使用步骤代码示例简介全局异常处理可以捕获所有Controller中抛出的异常,并且针对异常进程,这是基于spring的@ControllerAdvice实现的。使用步骤创建一个Handler类,使用@ControllerAdvice注解对Handler的方法使用@ExceptionHandler注解修饰,拦截对应的方法代码示例创建一个Handler类,使用@ControllerAdvice注解,每一个方法对应一个或一组异常拦截逻辑比如,在示例中,分别拦截Exception和N

2021-12-31 19:45:22 348

原创 SpringBoot Interceptor 简单应用

文章目录简单介绍使用步骤示例代码拦截器与过滤器对比API介绍拦截器多次执行问题待研究问题简单介绍HandlerInterceptor是Springboot应用提供的拦截器,拦截的对象是spring的Handler,Handler就是我们常见的Controller,也就是说,HandlerInterceptor就是Controller的拦截器。主要使用场景springboot拦截器功能和过滤器类似,都是可以在业务代码执行前后进行类似切面的处理通常也可以用于鉴权、日志、监控的场景使用步骤创建

2021-12-31 19:11:13 429

原创 SpringBoot Filter 简单应用

SpringBoot Filter过滤器基础知识SpringBoot的过滤器是基于Servlet的Filter实现的,所以在原理上没有实质的变化,只是使用方式上有点区别基于FilterRegistrationBean实现实现过滤器有很多种方式,这里介绍其中一种,基于FilterRegistrationBean实现过滤器,只需2步即可前提准备:准备一个spring-boot项目即可,业务代码示例如下@RestControllerpublic class DemoController {

2021-12-31 19:09:31 461

原创 Linux文本分析案例与方法

Linux文本分析案例与方法Linux中文本分析问题的原则解决文本分析问题基本原则,就是首先进行列切割,得到格式化的一行一行的数据,然后再执行经典的统计操作,包括分组、排序、求和、topN。使用的命令套餐就是 awk+sort+uniq+head统计日志中访问量TopN的url日志的样例如下:[INFO][2021-12-17T19:18:39.778+0800] _undef||uri=/xxx/new[INFO][2021-12-17T19:18:39.778+0800] _undef||u

2021-12-17 20:39:32 859

原创 G1 GC 全过程与核心原理介绍

G1GC 全过程与核心原理介绍G1内存布局G1垃圾回收器内存布局【链接:1】G1垃圾回收全过程整体过程介绍G1垃圾回收整体分为2个阶段,分别是仅年轻代回收阶段(young-only)和空间回收阶段(space reclamation)。这两个阶段不断交替,相互转换。在年轻代回收阶段,每次回收都会有对象升级,当年龄达到阈值,就会变成老年代对象,放到old区。当old区占比达到一个设定的阈值,就会进入空间回收阶段,释放出空间,然后又进入年轻代回收。要进行一次空间回收,前提条件是找出空间中所有的垃圾,

2021-11-14 21:07:54 3414

原创 如何在Mac中安装管理多个版本的JDK

如何在Mac中安装管理多个版本的JDK安装在oracle的官网可以下载指定版本的jdk,我这里下载的是8和11https://www.oracle.com/java/technologies/javase-downloads.html直接下载dmg版本即可,点击一键安装,多次安装不冲突设置java home通过以下命令可以查看安装的位置/usr/libexec/java_home -V查看结果如下11.0.12 (x86_64) "Oracle Corporation"

2021-08-30 17:19:32 283

原创 如何高效实现内存分页?

如何高效实现内存分页?使用guava工具类 public static void main(String[] args) { ArrayList<Integer> list = Lists.newArrayList(); for (int i = 0; i < 8; i++) { list.add(i); } int pageSize=10; int pageNum=1;

2021-05-21 20:26:43 321

原创 ThreadLocal和线程上下文-入门

ThreadLocal和线程上下文经过学习和理解,总结了以下经验:真正的主角是线程上下文,而不是ThreadLocalThreadLocal的本质是实现Java线程私有map变量的一个工具类,所以,提供的最核心的方法就是set和get如果引入线程上下文的概念,那么,ThreadLocal就是实现线程上下文功能的工具类摘要本文主要的目的是实现ThreadLocal的入门,基于自己的理解给出一个比较容易懂的ThreadLocal定义,并且结合线程上下文的概念,给出ThreadLocal的定位。本

2021-01-10 19:57:48 657

原创 简单理解网络IO

简单理解网络IO什么是网络IO?首先用大白话的方式,方便自己理解网络IO本质上也是IO的一种,一般的IO就是数据的输入输出,再简单来说,就是从一个地方,到另一个地方在计算机中,能够存储数据的,一定是存储介质,而且一般采用的存储结构无非是数组、链表、树。而且我们知道,网络中的数据是以二进制的形式传输的,所以,可以简单认为,数据就是二进制数组中的元素。那么,就有一个简单的推论,网络IO其实就是数据从一个数组到另一个数组的过程。接下来,就把这个数组具体化。稍微提高一点专业性网络IO的硬件基础是

2020-11-03 20:39:08 9902

原创 Springboot如何把多个mapping配置到一个Controller中?

Springboot如何把多个mapping配置到一个Controller中?在springboot中,controller的mapping值就是访问controller的虚拟路径,在原理上是支持一个controller对应多个精确的mapping的(带通配符就更加了)以GetMapping为例,实现的方式也非常简单,通过查看mapping的源码,发现value属性的类型是String{},那么就非常清楚了,只需要把value设置成一个字符串数组即可,比如@GetMapping({"/data

2020-10-16 08:15:12 2761

原创 Springboot文件下载实现和原理分析

Springboot文件下载实现和原理分析需求客户端发送请求,可以下载服务端指定文件无论什么文件,不允许浏览器自动解析,必须作为附件下载分析采用springboot实现文件下载,本质上使用的也是javaEE的Servlet+Tomcat技术下载文件的本质是获取文件的读取流,在服务端需要将文件内容写入到Response的OutputStream中(注意这个写入流不需要flush)为了防止浏览器解析,需要在响应头中,将文件类型设置为附件。代码/** * 文件下载的controller

2020-10-05 22:50:32 1416 1

原创 JavaEE关键问题理解

JavaEE基础问题本文介绍了对于JavaEE几个关键问题的理解,这是进一步学习JavaEE使用以及后续理解JavaEE的基础。什么是JavaEEhttps://www.jianshu.com/p/92ccf737beceJavaEE就是Java推出的企业级程序开发规范。涉及到2个关键概念,分别是企业级和规范什么是企业级?企业级的程序可以简单地理解为服务。什么是规范?结合上文,可以理解为为了实现一套企业级服务,java设计的一套规范,而规范实际上就是接口。这些接口包括JPS,S

2020-10-04 11:28:48 130

原创 使用MultipartEntityBuilder实现文件上传

使用MultipartEntityBuilder实现文件上传参考:【1】原理从httpclient 4.3开始,使用MultipartEntityBuilder实现文件上传文件或者文件流可以封装成ContentBody,进而被封装到MultipartEntityBuilder中,再创建出multipartEntity,作为HTTP请求的HttpEntity,最终被发送到服务端。整个对象封装流程如下:File/Stream>>ContentBody>>MultipartE

2020-09-13 22:47:48 9222

原创 Guava工具包高效开发实践系列

利用Guava工具包提高开发效率guava是谷歌提供的java开发的公共基础类库,提供了各种强大的基础功能,能够极大地简化我们的代码,提高开发效率,被称为java中的瑞士军刀。用Guava的TTL Cache高效实现本地缓存用法首先创建一个缓存对象,设置最大数量和超时时间Cache<String, String> ttlMap = CacheBuilder.newBuilder() .maximumSize(5) .expireAfterWrite(10, TimeUnit.S

2020-09-07 22:30:43 300 1

原创 HashMap源码学习笔记

从刚开始学习java,就觉得HashMap底层实现原理是一个非常高大上的问题,以至于从开始接触到现在2年时间过去了,都没有详细研究过。最近在不断写博客的过程中逐步培养起了源码阅读和官方文档阅读的习惯,所以也激起了研究HashMap原理学习的兴趣。HashMap相关的问题特别多,这也是我们经常对其望而却步的原因。所以,本文不会对HashMap的各个细节问题都进行阐述,这一版会集中解决HashMap的几个关键问题和经常被问到的一些细节知识点。从而搭建起对HashMap一个初级地较为全面的认识,为后续进阶做好准

2020-09-05 22:32:15 271

原创 如何用HTTPS协议连接Ceph(S3)

如何用HTTPS协议连接Ceph(S3)需求用HTTPS协议连接类似ceph的对象存储,采用Amazon S3的sdk,aws-java-sdk。常规步骤与问题按照官方的说法,如果你只是测试 Ceph 对象存储服务,考虑使用 HTTP 协议而不是 HTTPS。但是我们发现Amazon的S3客户端是支持将Protocol选择HTTPS的,因此,ceph进行https连接应该是支持的。常规的代码如下:String ACCESS_KEY = "ak";String SECRET_KEY = "s

2020-08-30 21:32:29 2649 1

原创 Redis 5种数据类型及使用场景介绍

String用法常用操作set 设置key的值get 获取key的值append 追加setrange 指定角标,设置指定的值getrange 指定角标范围获取值strlen 返回字符串长度数值操作INCR 自增1DECR 自减1bitmapbitmap操作还属于字符串操作,只是说能够操作得更加细腻,能够操作任意字符串的任意位。setbit:对字符串的指定bit位进行操作bitcount:对每一位的取值进行求和,比如111,求和就是3bitop:对bitmap进行逻

2020-08-15 21:52:41 167

原创 Redis sortedSet的底层数据结构学习笔记(1)

sortedSet的底层数据结构参考链接:Redis为什么用跳表而不用平衡树?sortedSet底层采用的是跳表,跳表的特性如下查找单个key,skiplist时间复杂度为O(log n)跳表的本质是一个多层链表,最底层是完整的有序链表,从下往上依次按照一定的规则进行抽析,通过抽析来实现快速过滤无效数据。跳表在多层链表的基础上,引入随机抽析的方法,每一个节点的层数都是随机生成的。插入操作只需要修改插入节点前后的指针,而不需要对很多节点都进行调整。这就降低了插入操作的复杂度。这是skipl

2020-08-15 21:49:41 797

原创 ElasticSearch权威指南学习笔记

ElasticSearch权威指南学习笔记参考链接:https://www.elastic.co/guide/en/elasticsearch/guide/master/index.html说明学习目标包括集群如何扩容以及如何进行failover?(Life Inside a Cluster)ElasticSearch如何实现文档的存储?(Distributed Document Store)ElasticSearch如何实现分布式搜索? (Distributed Search Exec

2020-08-11 19:54:25 149

原创 如何设置nginx日志滚动?

如何设置nginx日志滚动?nginx日志文件如果不做处理,则会一直追加,变得非常大,不利于处理和分析,因此,必须进行日志滚动。方案使用logrotate实现logrotate介绍通过 man logrotate,可以查看logrotate的帮助文档,这是学习的最佳方式logrotate是linux内置的工具,其作用在于简化日志的管理,能够实现日志的自动滚动,可以支持定时滚动和按大小滚动logrotate的命令格式如下logrotate [-dv] [-f|--force]

2020-08-09 22:14:33 2518

原创 Java如何自定义注解(应用篇)

如何自定义注解实现步骤以SpringBoot的@Autowired为例,自定义一个@Autowired,实现依赖的自动注入创建一个注解,添加四个必要的元注解@Retention(RetentionPolicy.RUNTIME) //运行时注解@Target(ElementType.FIELD) //作用于字段@Inherited@Documentedpublic @interface MyAutowired {}创建一个Controller类和一个Service类,将一个Serv

2020-07-30 22:02:48 484

原创 如何在Springboot使用线程池(1)

如何在Springboot使用线程池?方法1:注入线程池bean写一个TreadPoolConfig类,定义一个方法,创建线程池对象@Configurationpublic class TreadPoolConfig { /** * 消费队列线程 * * @return */ @Bean(value = "pool") public ExecutorService buildConsumerQueueThreadPool() {

2020-07-30 21:56:57 556

原创 AQS源码学习笔记

AQS源码分析-以ReentrantLock为例(青铜)前言摘要java实现线程同步最主要的2种方式是synchronized同步和工具锁,这两种同步机制在原理上有着较大的区别,在之前的一篇博客中,已经对synchronized原理做了简要描述,本文的主要目的是分析工具锁的原理。java提供的工具锁主要有ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore等,这些工具锁的实现都依赖于java提供的一个同步器框架AbstractQueuedSynch

2020-07-25 22:21:09 144

原创 synchronized锁升级过程分析

synchronized锁升级过程分析(青铜版)摘要本文的目的在于从主流程上说明以下问题:synchronized修饰对象的锁一共有几种状态synchronized修饰对象锁升级的过程是怎样的本文的研究方法是查看openjdk的官方文档,链接为https://wiki.openjdk.java.net/display/HotSpot/Synchronization#Synchronization-Russel06。建议大家也可以直接看官方文档,描述肯定会更加准确。由于对象的锁信息和对象的内存

2020-06-20 23:06:59 427

原创 如何理解反射

如何理解反射基础关键问题本文主要的目标是回答以下问题:创建对象可以使用new,为什么我还需要反射?如何使用反射创建未知类的对象?调用未知类的方法?反射的定义学习反射时,我们最不理解的一个问题就是,我要创建对象,直接使用new就可以了,为什么还需要反射?通过下面的定义,应该能够回答这个问题。【核心定义】java反射机制就是对于任意一个未知的类,都能够创建其对象,调用其方法。反射和new的区别:new只能针对编译阶段已经存在的类,如果在编译时这个类不存在,就无法创建对象,因为你都不知

2020-06-06 18:30:46 1097

原创 Volatile是如何保证线程可见的?

本文以volatile最常见的2个问题为线索,基于汇编lock前缀指令和cpu原子操作等底层知识,初步对volatile的底层原理进行描述。通过本文的论述,基本上能够解释以下2个问题:1)为什么volatile能够保证线程可见性?2)为什么volatile不能实现操作原子性?

2020-05-30 13:41:37 1410 3

原创 Spring获取客户端的IP地址

如何在Spring的Controller中获取客户端的IP?按照以下代码,在Controller中增加一个入参,Tomcat会自动将参数的值注入,即可获得请求对象,进而获得请求中的IP地址,代码如下:/** * @author zhongxiang * @date 2020/5/21 19:22 */@Controllerpublic class ControllerDemo { @GetMapping("/hello") public void hello(HttpServl

2020-05-21 19:28:48 749

数据结构与算法分析java语言描述第3版

数据结构与算法分析java语言描述第3版,带书签,高清扫描版

2018-10-23

空空如也

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

TA关注的人

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