- 博客(39)
- 收藏
- 关注
原创 基于EasyExcel二开支持导入合并的单元格解析二
在经历了EasyPoi的坑后决定后面放弃使用这个工具(垃圾玩意对不起GVP徽章)。偶然间看到了阿里开源的EasyExcel工具,在看了其api和实现思路后发现是一个很好的工具,随后调研了特性发现并不支持自动合并含有合并单元格的数据,需要自行在ReadListener中处理。如果每一个需求都要自行处理一遍那么效率实在是有点低下,随后便开始研究EasyExcel的处理原理。...
2022-06-01 00:31:40
687
原创 基于EasyExcel二开支持导入合并的单元格解析一
由于产品需求需要导入含有合并单元格的excel文件,在经历的EasyPoi的坑后,萌生了对EasyExcel二开的想法
2022-06-01 00:05:27
769
原创 基于GSON实现单例和自定义日期输入与输出
上篇写道由于Fastjson漏洞问题导致系统频繁升级之后基于Jackson封装了一个支持多样化日期输出与输入的JSON转换工具,但实际在后面的使用中由于系统架构较老与Spring自带Jackson冲突较为严重,无奈之下只能放弃使用GSON来进行JSON转换。GSON在使用中的问题GSON本身使用是以new形式出现的,在实际使用中并不友好,在应对实际场景中有以下几个问题:1、对于大并发来说频繁new对象也会造成一些内存占用。2、对于date转换是采用DateFormat进行转换同时为了防止并发时产生问
2020-08-29 11:40:32
565
原创 基本Jackson实现兼容国内常见日期时间格式反序列化及序列化工具
目前市面上常见的json序列化工具主要有几种json-lib、jackson、gson、fastjson。各自的特点这里就不说了,google一下很多介绍可以看。每家的JSON都有各自的特色,我在这之前的项目中曾大量使用到Fastjson,但是由于近年漏洞频出严重影响线上稳定,随后针对Gson和Jackson进行调研。1、GsonGson有着丰富的文档和api接口,一般可以满足日常业务使用,但Gson有一个问题在于每次使用时都需要new一个Gson对象或者使用GsonBuilder.create()来
2020-06-10 11:04:31
2871
原创 对于时间轮算法的一些思考
最近一直在使用当当的分布式任务调用框架,但是由于zk集群是依赖别人的一直想换一套耦合性较低的,偶然的机会在看完许大神开源的xxl-job后萌生了自研的想法。在查询了一些资料后发现大部分的延迟算都是基于时间轮,例如kafka的延迟队列。一、为什么使用时间轮算法时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所...
2019-08-14 11:28:04
1891
原创 mybatis generator生成工具
在pom中增加对mybatis generator插件的支持,我这里将xml配置文件放到了test目录里面,实际打包时可以不打这个目录<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId>...
2019-04-03 14:40:05
143
原创 ConcurrentHashMap1.8版本部分代码分析
final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); int hash = spread(key.hashCode()); int binCount = 0;...
2019-02-21 14:22:58
101
原创 JDK SPI机制随笔
SPI(Service Provider Interface)是JDK自带的一种服务发现机制,类似于Spring的IOC思想,例如Mysql Driver等都使用了JDK的SPI。SPI设计目标:1、面向接口编程,各模块间不耦合具体实现;2、各接口实现间实现可插拔机制,不需要修改具体代码;3、需要服务发现机制;SPI的约定:1、当一个provider有多种实现时,一般在jar包的...
2019-02-20 12:45:41
176
原创 dubbo学习笔记
dubbo架构分四部分:1、registry:注册中心;2、provider:提供者,启动时会将接口注册到注册中心;3、consumer:消费者,启动订阅provider、configurators、routers;4、monitor:监控中心;dubbo启动步骤:1、provider启动后会注册所有接口到registry,同时订阅configurators动态配置;2、con...
2019-02-20 12:23:48
155
原创 Netty的心跳检测机制
一般的心跳检测机制都是定时向服务端请求或服务端定时向客户端发送数据以确认连接是否存活。这种情况一般存在两个问题:一、请求会占用通道的资源,如果判断连接是否属于空闲;二、定时任务维护成本;Netty提供了IdleStateHandler 来进行心跳检测。通过使用ch.pipeline().addLast(new IdleStateHandler(0,0,5, TimeUnit.SECOND...
2019-02-19 17:16:00
1099
原创 单例模式-双重锁校验
单例模式–双重检验锁真的线程安全吗单例模式是我们最熟悉不过的一种设计模式,用来保证内存中只有一个对象的实例。虽然容易,但里面的坑也有很多,比如双重检验锁模式(double checked locking pattern)真的是线程安全的吗?起因在对项目进行PMD静态代码检测时,遇到了这样一个问题Partially created objects can be returned by the...
2019-02-19 14:58:20
4217
1
原创 Netty处理TCP半包和粘包问题
Netty在RPC中充当着重要的核心角色,封装了对JDK NIO的复杂操作。TCP连接中存在半包和粘包问题,其历史原因不在追究,Netty在对问题处理上提供了现有的模板方法,用户需要自己定义编码和解码规则就可以处理。LengthFieldBasedFrameDecoder这个类是用于分隔消息模板类;假如我们规定一个TCP消息的结构如下:1、两个字节表示消息长度;2、剩余字节表示body内...
2019-02-15 16:05:32
1597
原创 HashMap hash冲突
HashMap是以key的hash值来确定value的位置,当hash值冲突时1.7和1.8的处理方式不同 1.7 根据Hash值获取到对应的entry,然后将冲突值插入到entry的头部。 1.8 基于entry的node,在hash冲突小于8时将冲突值追加到node尾部。当冲突大于8时会将node转换为红黑树...
2018-07-22 21:50:02
367
原创 DelayedQueue剖析
DelayedQueue是一个基于ReentrantLog、PriorityQueue实现的延迟队列,PriorityQueue内部维护了一个数组。public class PriorityQueue&amp;amp;lt;E&amp;amp;gt; extends AbstractQueue&amp;amp;lt;E&amp;amp;gt; implements java.io.Serializable { priv
2018-07-22 21:27:13
1288
原创 TCP
TCP TCP 的特性 TCP 提供一种面向连接的、可靠的字节流服务在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCPTCP 使用校验和,确认和重传机制来保证可靠传输TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制注意:TCP 并不能保证数据一定会被对方接收到,因为...
2018-07-22 15:53:44
178
原创 基于ReentrantLock写一个简单的消息队列
基于ReentrantLock和Condition来实现的一个消息队列 provider生产者:public class ProviderThread implements Runnable { private ReentrantLockQueue<String> queue; public ProviderThread(ReentrantLockQueue&...
2018-07-22 15:50:24
217
原创 一致性哈希
一致性哈希算在一定程度上弥补了简单哈希算法的缺点。 一致性哈希算法包含以下几个概念: 1、哈希槽:用来存储哈希数据。 2、哈希环:每个哗然槽之间相互首尾相连最终针开发一个哈希环。 一致性哈希在存储数据时有以下几步: 1、根据key值计算出对应的哈希槽。 2、找到对应的哈希槽,将key值存储在相应位置。 普通哈希算和一致性哈希算法相比: 1、易扩展,普通哈希算法一般是根据哈希值和服务...
2018-07-22 15:43:47
137
原创 Redis Sentinel哨兵机制
Sentinel哨兵机制是对Redis集群的一个监听,本身支持集群。 它可以管理一个以上的Redis集群,当某一个Master节点故障时,每一个哨兵节点如果达到一致认为该节点故障,则会选举出哨兵master,将故障节点的某一个从节点提升为master,其它slave节点监听新master节点,原先master节点降为slave节点。 选择从节点方法有四步: 1、过滤掉不健康(主观下线,...
2018-07-22 15:17:48
236
原创 linux下nginx安装方法
yum -y install pcre-devel pcre gcc gcc-c++ zlib-devel./configure –prefix=[nginx目录] –with-http_stub_status_modulemake && make install cd nginx目录/sbin/./nginx
2018-07-08 16:45:06
118
原创 linux下redis cluster搭建
ruby官网下载ruby源码包redis官网下载redis源码包rubygems官网查找redis gem并下载安装ruby#进入ruby源码目录cd ruby源目录 #编译ruby./configure -prefix=ruby安装目录makemake install#安装redis支持gem install -l {redis gem}文件#建立ruby ge...
2018-07-08 16:44:10
138
原创 单机版zookeeper安装
下载zookeeper软件包安装zookeeper#进入zookeeper配置目录cd zookeeper目录/conf#配置zookeeper配置vim zoo.cfg使用以脚本启动zookeeper#配置zookeeper日志级别export ZOO_LOG4J_PROP="INFO, ROLLINGFILE"#配置zookeeper日志目录expor...
2018-07-08 16:36:45
152
原创 solr单机和集群简单安装步骤
单机版solr7.4要求1.8以上jdk版本下载solr7.4版本压缩包并解压新建solr-home目录,并将solr.xml复制到该目录下 solr.xml中host地址表示对外访问的地址,默认情况下读取的是本机地址,如果 新建core目录,将_default目录下的conf复制到core目录下 export SOLR_CLUSTER_HOME=/dat...
2018-07-08 16:35:36
225
原创 java数据结构总结
ArrayListArrayList是基于数组实现的一个集合随机访问速度快,循环到某一个下标时停止。插入速度较慢,循环到某一个下标时插入一个新数据,然后将后面数据的下标+1更新速度快,循环到某一下标时更新当前数据删除速度较慢,同插入原理,需要更新删除点后的其它数据下标。初始化默认长度为10,可以指定size大小。长度递增为:旧容量*3/2+1构造方法可以接收一个int型参数来做为...
2018-04-06 23:00:34
128
原创 快速排序
@Test public void testSort(){ int[] data = {5,1,9,7,2,3,0,4,8,6}; this.quickSort(data,0,data.length-1); for(int n:data){ System.out.print(n+","); }...
2018-04-06 22:55:38
104
原创 冒泡排序的四种变形
/** * 冒泡排序法 */ public void bubbleUp1(Integer[] numberArray){ int loopNumber = 0; for(int i=0;i<numberArray.length-1;i++){ for(int j=0;j<numberArray.leng...
2018-04-06 22:53:56
790
原创 spring mvc+Mybatis整合shiro 第六章 关于更新缓存权限的几个要点
public void refreshAuth() { try { Ini ini = new Ini(); ini.load("/static/**=anon"); Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME); s
2017-09-21 11:02:41
786
原创 RedisCluster心得
1、RedisCluster将整个redis集群分为多个不同区间的数据槽位。 2、在一个集群内各服务器所拥有的槽位可以自由调整。 3、可以自由增加和删除节点信息,可以在线迁移缓存数据 4、RedisCluster的主从更像是主备,在Cluster下从节点无法进行读取和访问只能从主节点进行读取这点和RedisSentinel不同。 5、增加节点新增的节点可以是以前删除过的节点也可以是新节点。
2017-09-21 10:40:39
268
原创 领域驱动心得
1、领域对象中包含属性但只提供get方法不提供set方法。 2、领域对象以行为驱动,每一个方法都是一种行为有明确的含义,例如update方法做作只是更新,但具体需要更新哪些字段含义不明。
2017-06-12 11:02:34
285
原创 redis使用心得
linux下安装redis以后会在/usr/local/bin下生成快捷工具。 默认可以直接启动命令:./redis-server 也可以指定配置文件启动命令:./redis-server xx/redis.conf redis-cli是一个redis客户端常用参数有三个: -h(host)-p(port) -a(密码认证) redis3.2以后增加了非本机IP访问限制,如果要开放这个限制
2016-07-28 14:28:25
421
原创 spring mvc+Mybatis整合shiro 第五章 缓存
这一章讲自定义缓存的实现,主要是应对集群或者集成第三方缓存的情况,这里我使用的第三方缓存是redis
2016-04-20 18:25:59
1762
原创 spring mvc+Mybatis整合shiro 第四章 SessionDAO
这章讲shiro 的sessionDAO,我也是一知半解请大家求教
2016-04-18 17:26:07
8342
1
原创 spring mvc+Mybatis整合shiro 第三章 SessionManager
sessionManager是shiro用来获取对应session的一个管理类。他的作用是代替默认的方法来管理会话。 public class MySessionManager extends DefaultWebSessionManager { private String domain = PropertiesUtils.getValueByProperty("domain","/...
2016-04-14 16:02:57
5740
1
原创 spring mvc+Mybatis整合shiro 第二章Realm
shiro的登陆与授权都是通过realm来的,这是一个自定义的realm。public class RealmManager extends AuthorizingRealm { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private SysUserManager user...
2016-04-14 14:43:43
1431
原创 spring mvc+Mybatis整合shiro 第一章 整体配置
前段时间研究了一下shiro,因为看不懂英文所以学习过程颇为曲折,后来整合shiro想写一个sso结果这段时间又写不下去了只好来写写博客了。最初学shiro是在百度搜教程,说实话那些教程除了开涛写的其它人写的确实不怎么样,而且开涛的教程也不是特别详细的那种,所以我在这给大家写一个整合后的完整教程。shiro的设计思想我在这就不多说了,实话我说只明白一小半甚至一小半都没有,要说思想开涛的博客...
2016-04-14 13:56:20
2619
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人