自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

u010266988的博客

Java学习积累

  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 vmware读取坏掉的虚拟磁盘vmdk文件

vmware centos 7系统挂了,开不了机,重新安装ubuntu22系统,挂载centos7的vmdk文件。

2024-02-01 17:01:20 309

原创 Java 执行同步任务时 将大的时间段段拆分成多个小的时间段

同步任务,有时候数据量太大,一次执行有可能数据过多,撑爆内存,且内部接口调用也可能因为数据过多导致接口崩溃,分段执行可能很好地避免这些问题。本文以按小时分段为例,将时间范围划分成多个时间段,对于每个时间段的数据再做分片,每100个数据一组。需要JDK8、guava。

2024-01-17 10:17:22 485 1

原创 Dubbo原理(三)——服务暴露与消费

一、服务暴露服务暴露机制服务暴露的入口在ServiceConfig#doExport。服务暴露一是把提供者的ip端口号等注册到注册中心(注册的其实是代理Invoker),二是提供者会开启Netty Server,等待Netty Client前来调用。完整过程见下图:二、服务消费...

2019-09-10 14:15:54 643

原创 Dubbo原理(二)——注册中心

dubbo目前支持的注册中心在dubbo-registry模块中:公司早期使用的是zk,后来因为zk的性能问题(服务提供者变更时消费者需要拉取全量提供者名单、zk选主耗时等问题),改为了自研注册中心。不过鉴于zk注册中心比较经典,因此本文将首先分析zk注册中心的使用,随后再分析下redis注册中心。1 zk注册中心1.1 存储结构1.2 订阅发布(1)服务发布:...

2019-09-09 21:18:37 1263

原创 Dubbo原理(一)——SPI扩展点

Dubbo自己实现了一套SPI机制,没有使用Java自带的SPI,为了进行对比,我们仍然从Java SPI开始讲起。1 Java SPI新建接口和实现类:package test.spi;public interface Animal { void sayHello();}package test.spi;public class Dog implem...

2019-09-07 16:37:28 366

原创 修改Jar包里的单个class文件

步骤简述:1.准备好需要修改的Jar包,准备好包含源码的source Jar包;2.解压缩source jar包,修改source代码,然后javac编译;3.用winrar打开待修改的Jar包,把步骤2编译好的class文件直接拖进来放到相应目录。一、问题背景最近在研究图数据库neo4j,用的spring-boot开发,其中需要用“@Properties”创建动态属性,会引用...

2019-08-01 03:42:11 4376

原创 lambda表达式对list排序

1 背景对一个对象list做排序,排序字段是对象的sortNum,排序前剔除掉sortNum为null的对象定义待排序的beanpublic class TestBean { private Integer id; private String name; private Integer sortNum;}2 一个排序失败的CASEl...

2019-06-26 22:08:54 6927

原创 如何使用花括号{}占位符打印日志

日志框架通常会这么记日志:public static final Logger LOG = LoggerFactory.getLogger("test");LOG.info("shit, blabla {}, blabla {}.", id, name);现在我们徒手用“System.out.println”实现这种带“{}”占位符的打印,仅供参考:package util;...

2019-06-10 16:47:35 4004

原创 Java double类型转成String,去除末尾的“.0”

1 背景1.double直接转string,例如sout(double)或者String.valueOf(double),假设是整数,会自动在后面添加“.0”,我们不需要这个添加;2.不要用科学计数法显示2 正确示例(左double 右String)1 -> 11.0->11.1->1.1100->1003 代码privat...

2019-05-16 10:24:27 10826

原创 Netty实现RPC框架

框架核心:注册中心:使用zk,通过创建临时顺序节点保存服务的提供者和消费者; 服务提供者:使用自定义注解的方式暴露服务; 服务消费者:在properties文件中配置消费的服务;缓存服务提供者地址,并对提供者注册监听,当提供者变更时,更新本地缓存 服务治理平台:在提供者和消费者上注册监听,缓存服务的提供者和消费者。一、原理介绍参考dubbo的服务注册方式,使用zk作为注册中心,服务...

2019-04-12 01:00:13 481

原创 分布式锁——zk实现

1 zk分布式锁原理(参考:https://blog.csdn.net/xuefeng0707/article/details/80588855)zk使用临时顺序节点+Watch机制实现分布式锁:加锁:创建临时顺序节点,如果该节点是最小节点则获取到锁,否则对上一个临时节点注册监听。解锁:删除节点。下面我们详细分析下加锁和解锁的过程,暂不考虑可重入性和锁超时,参考了curator...

2019-04-07 21:48:57 1571

原创 使用Session和Cookie做登录验证

1 背景作为“自学成才”的野路子程序员,一直忙于CRUD,没有系统地学习CS基础知识,导致面试的时候屡屡被CS专业的同学diss,于是乎知耻而后勇,认认真真地补习基础知识,这篇博客就来学习、总结下啥是Cookie、啥是Session。以前看过面试宝典,只知道Cookie是保存在客户端、Session保存在服务端,除此之外一无所知,直到昨天晚上躺在床上辗转反侧、思绪万千,看了一篇关于单点...

2019-04-06 01:22:25 14256 2

原创 MyBatis标签的使用

作为CRUD Boy,保存一些模板还是有用的,后续需要的话直接取过来改改就好,这里我做了个插入、更新、条件插入、条件更新批量操作的MyBatis模板,均单测通过。首先我们定义表结构:1 定义表结构CREATE TABLE `user_info` (`id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键id',`user_id`...

2019-04-04 20:17:14 547

原创 分布式锁——redis实现

使用Redis实现了一个锁,命名为:RedisLock。一、原理介绍1.1 RedisLock特性用最简单的方式实现一个redis分布式锁,该锁具有如下特性:阻塞式:在加锁时,如果获取不到,则进入自旋状态; 非阻塞式:在加锁时,如果获取不到,立刻返回加锁失败; 可重入:同一个线程多次请求加锁,对资源做+1操作,解锁时,资源必须等于0才算完全解除锁定; 锁超时:加锁时,可以设置...

2019-03-30 19:05:27 446

原创 guava cache本地缓存的使用

1 本地缓存简单介绍 本地缓存因为少了网络传输环节,所以读取速度比分布式缓存要快一些,但是在分布式环境下可能会出现多机不一致问题。---------------------吹水分割线-------------------- 这里引申下,怎么解决分布式环境下多机本地缓存不一致的问题?提供两个思路,不知道好不好:(1)使用kafka消息队列:生产者:每一台机器都是一个生产...

2019-03-15 21:23:12 1882

原创 MySQL自增锁引起的插入性能问题

1 问题背景学习《深入理解 MySQL ——锁、事务与并发控制》(https://mp.weixin.qq.com/s/JFSDqI5yaOc-Znr6Q1ohVA)的过程中了解到,自增锁(autoinc_lock)会影响事务插入的性能问题:AUTO-INC 锁是一种特殊的表级锁,产生于这样的场景:事务插入(inserting into )到具有 AUTO_INCREMENT 列的表中。...

2019-03-13 12:58:22 2422

原创 kafka原理学习总结

1 概述1.1 消息分区微观分区信息:宏观分区信息:如何保证消息消费的顺序性?1)同一分区内的消息是有序的;2)设置消息key,相同key的消息会发到同一个分区。1.2 生产者发送消息消息没有Key——轮询;消息有Key——根据key选择分区。1.3 消费模型推拉(push/poll)模型,kafka选择了拉,由消费者主动获...

2019-03-13 01:47:45 603

原创 Spring事务——查看事务id

今天同事遇到一个问题:在使用Spring的事务管理时,开启了一个事务,接着在内部开启了两个传播模式为嵌入(PROPAGATION_NESTED)的事务,想看下这三个事务的id是否一致,但是查了半天也没查到Spring怎么获取事务id。这里提供两个思路,不知到对不对。1 使用MySQL的事务id既然Spring的事务最终还是要看MySQL,那我们不如直接去MySQL里查询事务id:...

2019-03-11 12:59:07 15730 6

原创 Redis基本原理

学习了下《Redis设计与实现》,总结下便于后面复习。1 数据结构五种数据类型、zset原理和应用、跳跃表的概念2 单机数据库redis过期策略、持久化、单线程3 多机数据库主从复制、断点续传、哨兵、集群的slot分配redis集群中槽的概念:1)判断键属于哪个节点2)增加一台服务器4 发布/订阅(1)频道订阅:(2)...

2019-03-10 02:22:06 1310

原创 MySQL原理

学习了下《高性能MySQL》,学的还是比较浅显,这里作个总结吧。我把自己学习的内容分为如下几块:一、MySQL架构二、数据类型三、索引3.1 索引分类3.2 高性能索引策略InnoDB索引与MyISAM索引区别:聚簇索引,一般是Primary Key,没有的话则选择一个唯一的非空索引代替,再没有InnoDB就隐式定义一个主键作为聚簇索引...

2019-03-02 20:35:17 167

原创 Java实现堆排序

一、基本原理1.数据保存策略使用数组保存二叉堆的数据,数组中树的层级关系为:1)下标为i的节点的父节点的下标是(i - 1) / 22)下标为i的节点的左子节点的下标是:2 * i + 1,右子节点是:2 * i + 2。2.堆排序过程:步骤1:新建一个数组步骤2:使用这个数组建堆(自底向上下沉堆化)步骤3:堆排序(循环替换末尾节点和root并下沉堆化root...

2019-03-02 02:10:45 122

原创 分布式锁的实现

总结了下分布式锁的几种实现方式:数据库、缓存、zookeeper

2019-03-01 13:03:52 128

原创 二叉树遍历:前序、中序、后序

1 二叉树三种遍历的递归、非递归实现首先定义一棵二叉树的结构:/** * @Description 二叉树 * @Author lilong * @Date 2019-02-27 10:23 */public class BinTreeNode { private int data; private BinTreeNode left; privat...

2019-02-27 20:45:39 154

原创 排序算法的Java实现

冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序时间复杂度参考:https://blog.csdn.net/weiwenhp/article/details/8622728排序方法 平均时间 最好时间 最坏时间 桶排序(不稳定) O(n) O(n) O(n) 基数排序(稳定) O(n) O(n) O(n) ...

2019-02-27 18:55:26 94

原创 分布式全局唯一id——Snowflake算法

1 问题引出——为什么会用到全局唯一ID 一开始我是拒绝学习这个知识的,因为MySQL明明就有自增属性AUTO_INCREMENT,何必多此一举、大费周章,最后就出来一个id,是否舍近求远、舍本逐末? 答案是:对,也不对。 说对,是因为一般来讲,用数据库自增字段应付得来了; 说不对,是因为要考虑到扩展性,一旦数据量太大需要扩容、分库分表的时候就炸了,当然你.....................

2019-02-24 03:50:00 2894

原创 动态代理(JDK & CGLIB)

静态代理,一个代理类只能代理一个接口,好处的简单、好实现、好理解,坏处呢,举个例子,我们知道Mybatis逆向工程会生成N多个Mapper接口文件,如果每个Mapper接口都造一个代理类出来,然后呢,每个代理类做的事情又都是一样的——获取session、解析crud语句、执行crud、处理结果、结束session。难道我们对此就束手无策了吗?不,使用动态代理,我们可以只造一个轮子就能代理eve...

2019-02-24 00:22:12 94

原创 静态代理

静态代理的意思就是,我要做一件事,但是我不自己去做,而是委托别人去做,UML通常为:代理类(Proxy)也要实现实际类(RealSubject)的接口。比较简单,下面直接给出代码示例:public interface Hello { void say(String name);}public class HelloImpl implements Hello { ...

2019-02-23 15:11:55 106

原创 Mybatis逆向工程

1.新建表CREATE TABLE `key_value` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `biz_type` varchar(1000) NOT NULL DEFAULT 'DEFAULT' COMMENT '业务类型,用于需要区分业务的场景,一般情况为DEFAULT即可', ...

2019-02-21 23:51:22 268

原创 用Java实现一个简单的阻塞队列LinkedBlockingQueue

package mytest.others.other;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concur...

2019-02-18 15:00:02 435

原创 实操lambda表达式

摘要:从一个Bean List中取出某一属性组成新的List 对Bean List倒排序 对Bean List倒排序,考虑null值1 从一个Bean List中取出某一属性组成新的List先来定义一个Hello World级别的Bean:package mytest.others.other;/** * @Description TODO * @Author lilo...

2019-01-17 11:38:43 187

原创 MySQL时间类型转换

1.bigint转成日期SELECT from_unixtime(1496825724987/1000)示例:starttime字段的类型是:`starttime` bigint(20) NOT NULL DEFAULT '0' COMMENT '任务的开始时间'执行:SELECT from_unixtime(starttime/1000) FROM xxx_table...

2018-11-20 22:02:01 646

原创 Java反射

1 Java反射基础1.1 获得 Class 对象的三种方法Class.forName()类.class对象.getClass() (1)使用 Class 类的 forName 静态方法:public static Class<?> forName(String className)比如在 JDBC 开发中常用此方法加载数据库驱动Class.forN...

2018-11-16 19:44:25 137

原创 Java多线程(下)——线程池、并发工具类、ThreadLocal

1 ThreadPoolExecutor1.1 新建线程池用法:ThreadPoolExecutor(int corePoolSize, //核心线程数int maximumPoolSize, //最大线程数long keepAliveTime, //线程存活时间TimeUnit unit, //时间单位BlockingQueue<Runnable> wor...

2018-11-11 18:03:21 4582

原创 Java多线程(中)——AQS、ReentrantLock、Condition原理和源码

上一篇我们讲了锁、CAS、JMM、线程间通信,本节将深入讨论AQS原理和源码。1 AQS原理    AbstractQueuedSynchronizer,抽象队列同步器,专门用来处理加锁解锁的排队等待,至于怎么获取到锁、怎么释放掉锁则由具体的实现类来完成,总之一句话,AQS可以把抢不到锁的线程管理起来。管理的方法就是维护一个FIFO的双向队列,当线程获取不到锁时,就加入到队列中去;当线程释...

2018-11-10 01:04:43 808 3

原创 Java多线程(上)——锁、CAS、JMM、线程间通信

1 锁和CAS原理一个小问题:什么样的变量需要注意线程安全问题?解答:所有实例域、静态域、数组元素都保存在堆内存,堆内存在线程之间是共享的,需要保证线程安全。而局部变量、方法定义参数、异常处理器参数是线程私有的,不需要考虑。1.1 volatile原理如果字段被声明为volatile,那么Java线程内存模型确保所有线程看到这个变量的值是一致的。JMM怎么保证这个可见性的?...

2018-11-08 02:42:23 468

原创 分布式缓存

1 分布式缓存理论1.1 大型网站架构1.2 缓存概况缓存分为:客户端缓存、网络中的缓存、服务端缓存。1.3 幂等性概念:1次调用和N次调用返回一样的结果。保证措施:通常在调用时加上唯一标识,例如订单号。1.4 分布式系统理论1.4.1 CAP理论一致性(C):分布式系统中所有数据备份在同一时刻拥有相同的值;可用性(A):集群中一部...

2018-11-04 22:59:10 1212

原创 Zookeeper学习总结(中)——Leader选举

Leader选举是ZooKeeper最重要的技术之一,也是保证分布式数据一致性的关键所在。1 预备知识1.1 术语解释SID:服务器ID,唯一标识一台zk中的服务器,和myid的值一致。 ZXID:事务ID,标识服务器状态的变更。在某一时刻,集群中每台机器的ZXID值不一定全都一致,和zk对于客户端的“更新请求”有关。 Vote:投票 Quorum:过半机器数。如果集群总机器数是...

2018-11-03 17:53:10 261

原创 Zookeeper学习总结(上)——ZNode、ZAB、应用场景

1 数据结构Znode Tree,由斜杠(/)进行分割的路径,例如/foo/path1,树状结构,类似于文件系统,但是放在内存中,而不是磁盘中。树上的节点叫Znode,保存数据和属性,分为持久节点和临时节点。持久节点:一旦创建,除非主动进行移除操作,否则一直保存在zk上;临时节点:一旦客户端会话时效,那么这个客户端创建的所有临时节点都会被移除。节点还可以设置SEQUENTIAL:创...

2018-10-30 10:02:43 317

原创 Java集合工具类

1 List1.1 空集合《Effectice Java》第43条:返回零长度的数组或者集合,而不是null。错误观点:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。黄书作者说了,在这个级别上担心性能问题是不明智的,而且调用者容易遭遇到NPE。 接下来我们看看有哪几种方式能创建出来一个空的集合。(1)Collections.emptyList()...

2018-10-27 00:04:43 3066

原创 html富文本style转标签

一、需求规则:通用:所有替换针对行内样式,即:style="font-weight: bold; font-style: italic;"style="font-size: 24px; color: #333"分两大类: 标签类 样式类 具体: 标签类 font-weight: bold; -> 此标签内部内容用 <b>...</...

2018-08-09 16:49:53 1924

SQL安装错误Error 1402的应对

sql安装过程中出现Error1402错误

2013-04-15

空空如也

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

TA关注的人

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