Java 操作 Excel 之 POI 与 EasyExcel
前言在工作中,使用 excel 表格处理数据是很常见的操作,作为一个 Java 开发工程师,学会使用 Java 来操作 excel 表格是必备的技能之一。
本文就通过市面上常用的两种方式来实现 Java 对 excel 表格的操作:
Apache POI
Alibaba EasyExcel
一、Apache POI简介Apache POI 官网: https://poi.apache.org/
POI 是目前比较流行的 Java 处理 excel 框架,但是其缺点是 数据量大容易造成 OOM 异常
基本结构
HSSF - 提供读写[Microsoft Excel](https://baike.baidu.com/item/Microsoft Excel)格式档案的功能(03 版本 excel)
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能(07 版本 excel)
HWPF - 提供读写[Microsoft Word](https://baike.baidu.com/item/Microsoft Word)格式档案的功能
HSLF - 提供读写[M ...
Tomcat 配置 HTTPS 协议访问
前言Tomcat 默认支持 HTTP 协议访问,项目需求要修改 Tomcat 支持 HTTPS 协议访问。
操作步骤使用 Java 自带的 keytool 生成证书打开控制台输入:
123keytool -genkey -v -alias testKey -keyalg RSA -validity 3650 -keystore D:\apache-tomcat-7.0.26\keys\test.keystore -ext SAN=ip:127.0.0.1keytool -export -alias testKey -file wxsccp.cer -keystore test.jks
参数说明:
1234alias: 别名 这里起名keyskeyalg: 证书算法,RSAvalidity:证书有效时间,10年keystore:证书生成的目标路径和文件名,替换成你自己的路径即可,我定义的是D:\apache-tomcat-7.0.26\keys\test.keystore,其中keys文件夹必须存在
之后回车,然后需要输入一些信息,其中秘钥库口令和秘钥口令最好一致,并且记下来(之后配 ...
Java 中的集合概述
前言本文记录了Java中的集合框架,文章中的内容摘录自Java 集合框架 | 菜鸟教程 (runoob.com)、CSDN、博客园等开源网站。
Java 集合体系Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如 ...
Linux 系统基础
入门概述
我们为什么要学习 Linux?
linux 诞生了这么多年,以前还喊着如何能取代 windows 系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。
用习惯了 windows 操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生活中,并不意味着 linux 就没有用武之地了。在服务器端,在开发领域 linux 倒是越来越受欢迎,很多程序员都觉得不懂点 linux 都觉得不好意思,linux 在开源社区的地位依然岿然不动。
尤其是作为一个后端程序员,是必须要掌握 Linux 的,因为这都成为了你找工作的基础门槛了,所以不得不学习!
Linux 简介
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux 是一套免费使 ...
SpringCloud 快速搭建
SpringCloud 五大组件
服务注册与发现——Netflix Eureka
负载均衡:
客户端负载均衡——Netflix Ribbon
服务端负载均衡:——Feign(其也是依赖于 Ribbon,只是将调用方式 RestTemplete 更改成 Service 接口)
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
常见面试题
什么是微服务?
微服务之间是如何独立通讯的?
SpringCloud 和 Dubbo 有那些区别?
SpringBoot 和 SpringCloud,请谈谈你对他们的理解
什么是服务熔断?什么是服务降级?
微服务的优缺点分别是什么?说下你在项目开发中遇到的坑
你所知道的微服务技术栈有哪些?列举一二
Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,请说说两者的区别
微服务概述什么是微服务
什么是微服务?
微服务(Microservice Architecture) 是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。
究竟什么是微服务呢? ...
Java8 新特性
前言Java8 有一个非常显著的特点,就是提供了函数式编程,本文也将介绍 Java8 的几个新特性来实现函数式编程。学会这些 API 能够编写出简单、干净、易读的代码(尤其是对集合的操作)。Java8 新特性包括:
Lambda 表达式
Stream API
接口新特性
函数式接口(@FunctionalInterface)
默认方法(default)
Optional API
方法引用
JDK8 新特性
正在努力更新中…
函数式接口
只包含了一个抽象方法的接口,称为函数式接口(可以有多个非抽象方法)。可以使用@FunctionalInterface注解自定义声明
12345678910111213//JDK 1.8 之前已有的函数式接口:- java.lang.Runnable- java.util.concurrent.Callable- java.security.PrivilegedAction- java.util.Comparator- java.io.FileFilter- java.nio.file.PathMatcher- java.lang.reflect ...
Redis 缓存穿透、缓存击穿、缓存雪崩问题
前言在项目中引入一个缓存系统,不得不考虑的问题就是:缓存穿透、缓存击穿和缓存雪崩问题。
缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。
如发起为 id 为-1的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
接口层增加校验,如用户鉴权校验、id 基础校验(id<=0 直接拦截)
在数据库和缓存中都取不到的数据,可以将在缓存中存入一个空对象(key-null),设置一个短的有效时间。这样可以防止一个用户反复暴力攻击一个 id 请求
缓存击穿缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案:
设置热点数据永不过期
接口限流与熔 ...
深入理解 RESTful 风格
前言大家对 RESTful 肯定不陌生,就算不知道它到底是什么,但肯定听过这个玩意。相信大家也很想知道 RESTful 能解决什么样的问题,有什么应用场景?看完本篇文章你就能明白:
在互联网并没有盛行的时代, 移动端也还没有发展起来,页面请求和并发量也不高,那时候人们对接口的要求并不高,一些常规的动态页面(JSP)就能满足大部分人们的需求。
但是随着移动设备和互联网的发展,人们对 Web 应用的需求也逐渐增加,传统的动态页面(JSP)也因效率低下而渐渐被 HTML + JavaScript(Ajax)的前后端分离所替代,而安卓、IOS、小程序等不同的客户端层出不穷,客户端的种类出现多元化,而客户端需要接口跟服务端进行通信,但接口的 规范性 就成了一个问题:
所以一套 结构清晰、符合标准、易于理解、扩展方便 并且让大部分人都能理解并接收的接口风格就显得尤为重要,而 RESTful 风格的接口(RESTful API)刚好符合以上标准,就逐渐被应用从而流行起来。
现在,RESTful 是目前最流行的接口设计规范,在很多公司有着广泛的使用。在开发实践中我们很多人可能还是使用传统 ...
缓存数据库双写一致性问题
前言在项目中引入缓存系统,我们需要考虑在对旧数据进行更新操作时,我们是先淘汰缓存,再更新数据库;还是先更新数据库,再淘汰缓存。或者是更新数据库,再更新缓存呢?下面是对这三种方案的优缺点的一些总结:
缓存更新策略
先更新数据库,再更新缓存
先更新数据库,再删除缓存
先删除缓存,再更新数据库
先更新数据库,再更新缓存
这套方案适用场景比较少,主要从下面几个原因分析:
资源浪费在一些大型的信息网站中(博客、贴吧),我们引入缓存主要是对热数据(请求频繁的)进行缓存,而这时候,如果很多用户对于冷数据(长时间没人访问,或者访问量很少)进行更新,然后再去更新缓存,这就造成了缓存资源的大量浪费(因为访问量少,导致这些缓存命中低,浪费缓存资源)。
脏数据这是由于出现了并发操作的原因导致的,如:同时有两个请求 A 和 B 对数据进行了更新操作,由于网络原因,可能存在以下情况:
请求 A 更新了数据库
请求 B 更新了数据库
请求 B 更新了缓存
请求 A 更新了缓存
这就出现了 A 数据覆盖了 B 数据的情况,此时就产生了脏数据,如果没有缓存定时过期机制,此时的脏数据需要等待下一次的更新,才会对缓 ...
接口幂等性问题
接口调用出现的问题在分布式架构的系统中,通常是多个微服务之间互相调用,而服务调用服务无非就是 RPC 或 Restful 进行通信,既然是通信,那么就存在服务器处理完毕返回结果的途中挂掉,这也是分布式系统因网络不可达出现的问题。这个时候用户端很久没有得到服务端的响应,那么就会多次点击按钮,这样请求多次,那么处理数据的结果是否要保持一致呢?答案是肯定的!尤其是在一些订单与支付的场景。
什么是接口幂等性?接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
什么情况下需要保持接口的幂等性?我们对处理数据无非就是增删改查四个操作?那么那些操作需要保持接口的幂等性?==> insert 与 update
查询操作 ==> 查询一次或者多次对于结果的影响是不会有改变的,所以 select 是天然的 ...