java技术
文章平均质量分 73
hanruikai
aaa
展开
-
Spring boot starter 应用及原理
什么是spring boot starterSpring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增。在传统Maven项目中通常将一些层、组件拆分为模块来管理,以便相互依赖复用,在Spring Boot项目中我们则可以创建自定义Spring Boot Starter来达成该目的。使用案例java代码都是自动配置逻辑,前三个都配置在spring.factories文件中,spring boot会扫描jar包中的spring.factories文件进行调用执原创 2021-05-19 15:50:20 · 321 阅读 · 0 评论 -
Caffeine缓存性能算法&布隆过滤器
算法优化缓存最重要的是命中率,我们知道,普通的缓存主要基于以下三种算法淘汰旧数据:FIFO 先进先出 LRU 最久未使用 LFU 最少使用频率以上三种算法都有缺点,比如先进先出算法没有考虑使用频率;LRU也没有正确考虑使用频率;LFU的频率计算不平均,比如一个热点影片刚上映几天,点击量很高,后来持续走低,但是以为头几天的点击量,导致频率很高,根据策略无法淘汰,也不完全科学。主要问题:算法优化,新的热点数据可能无法缓存,热点数据计算有瑕疵 频率标记占用空间优化如何优化呢?.原创 2021-05-17 13:56:44 · 811 阅读 · 1 评论 -
软考高级信息系统项目管理师真题学习笔记
在CMMI连续式模型中,“技术解决方案”过程域属于()过程组。A过程管理 B工程 C项目管理 D 支持企业应用集成中,()超越了数据和系统,由一系列基于标准的、统一数据格式的工作流组成A应用集成 B功能集成 C过程集成 D表示集成功能api集成(应用集成,控制集成,方法集成)业务逻辑层上对应用系统进行集成表示集成把用户界面作为公共的集成点门户集成比如将内部信息系统的新闻等发布到互联网上过程集成超越了数据和系统,由一系列基于标准的,统一数据格式的工作流组成,必须...原创 2021-05-07 20:03:53 · 924 阅读 · 0 评论 -
OceanBase存储引擎核心-LSM Tree VS B-tree
1.什么是LSM TreeLSM Tree是一种数据结构,全称是Log Structure Merged Tree,顾名思义,基于日志结构的、可以合并的树。通过定义,我们发现三个关键点:基于日志结构 支持合并 树结构适用场景:写入量比较大的时候,为什么呢?因为LSM Tree是顺序写,避免IO寻址操作,节省时间。很多的其他NoSQL数据库核心也是这种数据结构,主要包括Cassandra,BigTable,RocksDB等。SSTablesLSM Tree持久化磁盘利用Sort.原创 2021-03-09 13:15:14 · 1313 阅读 · 1 评论 -
彻底搞明白大数据量下Mysql的分页优化
1.背景大家都知道分页,那么我们这里肯定讨论的不是一般的情况,一般的情况我们利用limit分页,或者java代码内存分页都可以解决。如果数据量非常大,如何解决分页呢?比如下面的SQL。select * from user where type=0 order by id limit 1000000,100上面的sql需要查询100条数据,但是是从第100W条开始,mysql会需要遍历跳过前面的100W条,然后从100W条开始,获取100条记录返回,101,102,103......很明显,原创 2021-03-02 14:32:32 · 428 阅读 · 1 评论 -
彻底搞明白JDK的Future机制
什么是Future接口Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以迅速得到一个Future对象,后续可以通过Future的方法来获取执行结果。一个实例代码如下:public class Test { public static void main(String[] args) throws ExecutionException, InterruptedEx原创 2021-03-01 17:22:35 · 1064 阅读 · 8 评论 -
MySQL在实际应用中的规范(表定义、SQL、索引等)
统一规范存储引擎: 请统一使用innodb存储引擎,特殊的数据库引擎必须通过DBA的评审。字符集: 统一使用utf8字符集。这个要从应用程序、服务器、数据库的表、字段等全部统一起来。注意:MySQL中的utf8mb4字符集,才是真正的utf8,请用这个。作用范围:不要在MySQL存储大对象,比如图片、音乐等;不要用MySQL做Gis运算、全文检索;不使用存储过程、触发器、函数、外键,避免破坏数据库的性能和扩展性。使用上限:每个MySQL实例,数据库不要超过50个; 单数据库容量,...原创 2021-02-25 16:20:48 · 484 阅读 · 0 评论 -
彻底搞明白JDK 1.8 Lambda 表达式
Lambda表达式为什么背景Java是面向对象语言,所以java对行为的封装都是基于对象。什么意思,简单说,我们要定义个行为,那么需要一个函数,只有函数就行了吗?在java里面不行,因为java是面向对象的语言,所以我们需要定义对象,看下面的代码:public interface ActionListener {void actionPerformed(ActionEvent e);}最早接触过java swing编程的老程序员肯定不陌生,定义一个按钮触发时间,每当时间发生时,原创 2021-02-24 17:29:48 · 2122 阅读 · 5 评论 -
JDK 8 的optional类
什么是Optional类NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optiona原创 2021-02-23 16:56:36 · 8548 阅读 · 6 评论 -
分库分表之后如何通过非分片键操作
场景今天看到一个场景,比如一个表,表名字是award_use_risk,作用是记录奖品使用的记录,用作风控。表结构如下:这个表,只是分库,没有分表,db分成4个库,分别是db0-db4。我的第一反应是根据terminal no或者prize guid,具体看业务逻辑进行分表操作,这样增加、修改、删除都可以通过分片算法定位到哪个库。后来看到业务场景里面,需要定时删除前一天的风控数据,这种情况下,条件里面只有时间,没有分片键,如何定位每个库呢?梳理一下:根据prize guid进行分原创 2021-02-19 11:19:15 · 2060 阅读 · 0 评论 -
Mybatis 中的$和#
1.区别#{}是预编译处理,${}是字符串替换。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。2.特殊情况在涉及表名的时候,必须用$符号,否则报错,如下:在order by 后面的字段名字也必须用$,如果用#,语法不报错,但是排序不生效,如下:排序不生效情况:...原创 2021-02-18 18:06:56 · 368 阅读 · 1 评论 -
log4j2 提升系统性能
什么是log4j2使用方式log4j2最好的地方就是异步日志模式,所以在这里我们就要进行升级改造.日志接口(slf4j) slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback) 日志实现(log4j、logback、log4j2) log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4..原创 2021-01-29 20:04:13 · 581 阅读 · 0 评论 -
JVM OOM日志分析
最近项目出现OOM,复习一下知识:首先,jvm增加参数,打印printGCdetails的日志 运行过程中,观察gc日志gc日志分析如下:2019-03-28T18:02:49.809+0800: 3.175: [GC (Allocation Failure) [ParaNew: 65536K->7435K(76288K)] 65536K->7451K(251392K), 0.0132004 secs] [Times: user=0.00 sys=0.02, real=0.0.原创 2021-01-21 20:50:34 · 1450 阅读 · 0 评论 -
到底什么是JWT技术?
什么是JWT全称为JSON web token,是一个json对象,用于系统间身份验证。主要包括三部分组成:[header].[payload].[signature]上面三部分用.分割。我们来看每一部分的具体内容:header部分header部分用于描述签名的算法,也可以包括content type。是一个json对象,并且用BASE64处理。一个简单的header例子如下: { "typ":"JWT", "alg":"HS256" }typ字段告诉我们类原创 2021-01-12 17:20:29 · 5305 阅读 · 0 评论 -
Java中的闭包
背景方法是一堆声明和业务逻辑代码,返回结果给调用者。方法也可以执行特定的逻辑,不返回任何职给调用者。方法能够复用代码,但是java里面的方法必须属于某个类。在看闭包之前,我们先复习一下lamada表达式。lamada表达式是函数式接口的实例。lamda表达式实现了唯一的抽象方法,也就是实现了函数式接口。如果函数式接口有多个抽象方法定义,就无法用lamada表达式实现多个方法,如下:函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单.原创 2021-01-07 17:29:12 · 25204 阅读 · 14 评论 -
关于Socket粘包、半包问题的解决方法
背景在 Java 语言中,传统的 Socket 编程分为两种实现方式,这两种实现方式也对应着两种不同的传输层协议:TCP 协议和 UDP 协议。但作为互联网中最常用的传输层协议 TCP,在使用时却会导致粘包和半包问题。TCP协议传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793[1]定义。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信...转载 2021-01-06 11:12:51 · 620 阅读 · 0 评论 -
Mysql覆盖索引与回表查询
1.什么是覆盖索引和回表查询首先,我们看看mysql的索引类型,mysql包括两种索引类型,聚集索引和非聚集索引:聚集索引(主键索引): 聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。 聚集索引的叶子节点称为数据页,聚集索引的这个特性决定了索引组织表中的数据也是索引的一部分。辅助索引(二级索引): 非主键索引,叶子节点=键值+书签。Innodb存储引擎的书签就是相应行数据的主键索引值。...原创 2020-12-10 17:20:03 · 1081 阅读 · 0 评论 -
一张图分析架构中的缓存设计
今天从掘金网站看到一张高并发系统中的缓存设计图,如下:图片来源:缓存仅仅是使用Redis?看看高并发系统缓存体系架构(缓存体系架构一)(共6篇,后续不断更新) (juejin.cn)针对这张图,写一下我对缓存的思考:首先,分析一下系统中缓存的位置都有哪些,常见的缓存位置包括:1.浏览器页面缓存2.路由网关可以有缓存,进行限流等操作3.应用级别缓存,主要是业务数据,常见的redis、memorycache等4.持久层框架缓存,比如hibernate,mybatis都有缓存.原创 2020-12-03 21:33:18 · 954 阅读 · 0 评论 -
BitMap思想分析
1.什么是bitmap我们知道很多常见的存储结构,数组、链表、散列表等容器。那么BitMap是什么呢?我们先一起看看,再分析为什么需要bitmap。我们知道一个int占据4个字节,32个bit,比如我存储一个int数据,值为8,那么存储结构如下:00000000 00000000 00000000 00100000一共32位。如果我们申请一个int类型的数组,比如 new int[32],总计占用内存32*32bit,需要大量的内存空间,有没有可以优化的方法呢?现假如我们用i..原创 2020-11-25 11:37:58 · 460 阅读 · 0 评论 -
如何利用微信登陆自己的网站
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html理解如下:这个默认显示的二维码其实是个固定的链接地址 扫描之后,发送请求到微信开放平台,获取code 取得code之后,再加上之前在微信开放平台注册的appid和appsecret,一起发送请求获取access token 获取access token之后,就可以调用微信接口获取用户信息了,包括昵称、照片等等另.原创 2020-06-18 16:26:58 · 3171 阅读 · 0 评论 -
Mac OS 安装Homebrew,亲测有效,网上其他的都不靠谱
今天需要按照homebrew,网上搜了一大堆,都过时了,亲自看了一下,共享给大家,免得浪费时间。第一步:按照xcode,这个简单,app store里面就有第二步: 利用网上的命令/usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)根本无法安装,一直报错443,我打开网址看看https://raw.githubusercontent.com/H..原创 2020-05-15 11:44:29 · 1580 阅读 · 5 评论 -
Java NIO 之 Scatter 和gather
1. scatter read一个Channel的数据写入到多个buffer。ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body = ByteBuffer.allocate(1024);ByteBuffer[] bufferArray = { header, body };channel原创 2016-08-10 16:13:58 · 422 阅读 · 0 评论 -
Java NIO Channel tranfer
transferFrom()The FileChannel.transferFrom() method transfers data from a source channel into the FileChannel. Here is a simple example:RandomAccessFile fromFile = new RandomAccessFile("fromFile原创 2016-08-10 17:19:59 · 356 阅读 · 0 评论 -
Java NIO 之selector
1. 什么是selector2. 怎么用selector3. 为什么selector原创 2016-08-15 11:21:56 · 400 阅读 · 0 评论 -
java nio 之FileChannel
package com.nio;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class Fil原创 2016-08-15 14:56:08 · 383 阅读 · 0 评论 -
java自定义注解以及原理
1. 自定义注解应用举例在springmvcconfig中定义前置通知,代码如下:import java.util.Arrays;import java.util.List;import com.puhui.flowplatform.manage.filter.RightFilter;import org.springframework.aop.BeforeAdvice;imp原创 2017-12-15 15:04:31 · 2716 阅读 · 0 评论 -
Java 泛型分析
public class Demo { public static void main(String[] args){ Point p = new Point(); p.setX(10); // int -> Integer -> Object p.setY(20); int x = (Integer)p.getX();转载 2017-12-15 18:16:16 · 210 阅读 · 0 评论 -
Java arraylist 雷区
1. Arraylist的add方法arraylist的add(int index,E element) 方法,是把元素添加到列表中,注意,不会修改原来位置到元素,列表长度会增加1. /** * Inserts the specified element at the specified position in this * list. Shifts the ele原创 2018-01-15 18:28:54 · 336 阅读 · 0 评论 -
Hashmap用于统计分析
项目中需要一段时间周期内,按天统计数据,之前我实现了一个版本,思路如下:根据输入到查询时间段,拆分成每天到时间间隔,然后每个间隔从数据库查询。比如查询1月1号8:00到1月10号9:00,查询间隔分别为1月1号8点-1月2号0点,1月2号0点到1月2号23:59:59,依次类推。后来发现这个思路有些笨,而且频繁查询数据库,性能较低。利用map,一次性查出时间条件内到所有数据,用日期作为原创 2018-01-24 19:26:15 · 555 阅读 · 0 评论 -
有序的hashmap (linkedhashmap) 测试及原理
1.一切从代码开始public class LinkedHashMap { public static void main(String[] args){ Map linkedMap=new java.util.LinkedHashMap<>(); linkedMap.put("name","kerry"); linkedMap.原创 2018-01-25 18:17:35 · 1710 阅读 · 1 评论 -
Java 读取资源文件到几种方式
1. 利用classloader的getResourceAsStream方法 /** * 转换图片为base64 * @param picPath 图片相对路径 * @return */ public static String getPicBASE64(String picPath) { String content = null;...原创 2018-03-12 18:32:03 · 832 阅读 · 0 评论 -
RSA 加密,解密,验证签名过程
1. RSA 签名验证A和B分别具有自己的公钥和私钥。A知道自己的公私钥和B的公钥,B知道自己的公私钥和A的公钥匙。流程如下:A 方:1. A利用hash算法对明文信息message进行加密得到hash(message),然后利用自己对私钥进行加密得到签名,如下PrivateA(hash(message))=sign2. 利用B的公钥对签名和message进行加密,如下:...原创 2018-03-19 16:21:56 · 4820 阅读 · 2 评论 -
json格式数据转sql语句
package com.puhui.flowplatform.entry;import com.google.gson.JsonArray;import com.google.gson.JsonElement;import com.google.gson.JsonObject;import com.google.gson.JsonParser;import java.io.Buffe...原创 2018-04-08 14:14:14 · 19244 阅读 · 2 评论 -
纵表的数据处理方式
众所周知,纵表容易扩展,但是数据不直观,应用起来比较麻烦,横表容易理解,数据便于处理,但是如果增加字段,就需要修改数据库。两者有不同的应用场景,具体参考我的另一篇文章:https://blog.csdn.net/hanruikai/article/details/79730028在设计信用卡模块时,由于信用卡过滤条件需要配置,便于灵活扩展,所以采用了纵表的处理方式。结构如下:参数key为过滤条件。...原创 2018-04-09 14:55:15 · 1321 阅读 · 0 评论 -
电商系统学习笔记之重要的hash算法MurmurHash
先看看string的默认hash方法,代码如下 /** * Returns a hash code for this string. The hash code for a * {@code String} object is computed as * <blockquote><pre> * s[0]*31^(n-1) + s[1...原创 2018-05-02 10:37:07 · 4232 阅读 · 0 评论 -
Spring boot 上传文件java.io.IOException: java.io.FileNotFoundException 异常
spring boot实现文件上传,刚开始同步实现,没有问题,后来耗时太长,改成异步实现,但是异步实现,在上传过程中发现报错,类似下面的堆栈:java.io.IOException:java.io.FileNotFoundException: /var/private/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/sou...原创 2018-05-18 16:43:47 · 12974 阅读 · 1 评论 -
redis 分布式锁(单机完美版本)
众所周知,redis可以实现分布式锁,如果考虑故障转移,需要用redlock算法的支持。如果不考虑,常用的简单实现如下所示: /** * 如果锁可用,则获取锁,并立即返回value值。如果锁不可用,则此方法将立即返回null。 * 不使用固定的字符串作为键的值,而是设置一个不可猜测(non-guessable)的长随机字符串,作为口令串(token) * @para...原创 2018-07-12 19:18:55 · 1133 阅读 · 1 评论 -
Java NIO 入门
1. Java NIO是什么Java NIO(New IO)是jdk 1.4以后引入的新的IO api, 提供了不同的IO处理方式,主要有以下重要概念:Channel 和 Buffer 标准IO工作对象是字节流和字符流,主要是Stream对象。(单向,读或者写) NIO的主要工作对象是Channel和Buffer。数据是从channel读原创 2016-08-10 15:56:56 · 466 阅读 · 0 评论 -
通过分析 JDK 源代码研究 TreeMap 红黑树算法实现(自然排序)
TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的,因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑转载 2016-08-19 15:59:38 · 2563 阅读 · 0 评论 -
Difference between HashMap, LinkedHashMap and TreeMap
All three classes implement the Map interface and offer mostly the same functionality. The most important difference is the order in which iteration through the entries will happen:HashMap makes转载 2016-08-19 15:29:30 · 428 阅读 · 0 评论