- 博客(153)
- 资源 (9)
- 收藏
- 关注
原创 配置slf4j/log4j输出到不同的文件
在实际中,我们可能想要将不同类型的日志分类输出到不同的文件中。关于 log4j 的配置参数解释可以参考:slf4j使用log4j的配置参数:https://blog.youkuaiyun.com/yx0628/article/details/83214387下面举个例子,比如我们可以进行类似以下的配置:将 demo1.log ,demo2.log , demo3.logsystem.logPath...
2018-10-20 20:25:42
9514
4
原创 slf4j使用log4j的配置参数
slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。比如用户可以自己选择使用 log4j 或是 log4j2 。slf4j 的 maven 配置如下:<dependency>...
2018-10-20 17:40:53
8544
原创 正则表达式——环视(零宽断言)
环视也叫零宽断言它匹配的是一个位置,该位置必须满足零宽断言条件,才能继续往下进行匹配。由于位置不是字符,它是没有宽度的,所以叫做零宽断言。环视分为4种情况,概念是想通的,用哪种需要根据自己的需求来决定:否定逆序环视(?<!)肯定逆序环视(?<=)否定顺序环视(?!)肯定顺序环视(?=)否定逆序环视:在这个位置的前边(逆序),不能有(否定)条件给出的字符串肯定逆序环视...
2018-09-18 16:21:57
1601
原创 正则表达式——捕获组和反向引用
正则表达式中 [] 表示字符组,在中括号中所有出现的字符中,匹配其中的任意一个字符。且只能是 1 个字符。比如 [abc] 可以匹配 a、b、c 三个字符中的任意一个。在字符组中,可以使用连接符 - 来表示一个字符区间。如 [a-zA-Z0-9] 表示匹配任意一个大小写英文字母或数字。连接符两端的字符,左侧的字符在 ASCII 码表中应该比右侧字符小,表示 ASCII 码表中从左侧字符到右...
2018-09-18 16:18:30
957
原创 正则表达式——捕获组和反向引用
正则表达式的捕获组和反向引用: 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其他程序中作进一步处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 在匹配的过程中,对于小括号括起来的子表达式,引擎会在正则表达式匹配成功时记录下当前所有这些捕获组对应的匹配结果(这些...
2018-09-17 17:23:20
5077
原创 正则表达式的运行原理详解(NFA引擎)
正则表达式 NFA 引擎是大多主流语言使用的引擎,它以表达式为主导,更符合开发的逻辑。 理解 NFA 引擎的运行规则,是十分重要的。 我们先看一个例子: 比如下边的这行字符串The dragging belly indicates your cat is too fat使用这个正则来匹配的结果应该是什么呢:fat|cat|belly|your我们知道“或”字符表示多选...
2018-09-16 12:02:24
2950
4
原创 Python的日志输出为文件格式——使用logging模块
logging 模块可以将 python 打印的日志进行文件的输出,具体配置如下:import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', ...
2018-08-21 14:26:51
631
原创 Python爬取百度图片搜索结果
爬取百度图片搜索的图片,我们先需要分析其访问 URL,我们在搜索页面,比如搜索 “abc” ,打开 F12 调试,下拉结果页面页,查看网络请求,在其中我们可以找到这样一个请求http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&q...
2018-08-19 12:04:18
3160
原创 Python爬虫使用动态代理
在 Python 爬虫时,在一段时间内请求数量过多,有时由于防爬机制,可能会出现不能继续爬取的问题。解决问题的方法可以是加长请求的间隔,或者从根本上使用动态 IP ,即将大量请求分散到大量的 IP 地址上来请求,从而使防爬机制不会注意。一个比较好用的高匿名 IP 的网站:http://www.xicidaili.com/nn/ 普遍的认识是这样的: 透明代理,即服务器知道请求方的代理 IP...
2018-08-18 11:09:04
4106
1
原创 Java jinfo 命令详解
jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下:[root@admin ~]# jinfo --helpUsage: jinfo [option] &lt;pid&gt; (to connect to running process) jinfo [option] &lt;executable &lt;core&gt; ...
2018-07-08 12:53:53
21629
原创 Java jmap 命令详解
jmap 命令如下:[root@admin ~]# jmap --helpUsage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) ...
2018-07-07 20:52:54
3023
原创 Java jstack 命令详解
Java 中 jstack 命令可以用来查看运行的 Java 进程下,多线程的运行情况,我们用一个死锁的例子来看: 比如下面这段死锁的代码:public class DeadLock { private static Object objA = new Object(); private static Object objB = new Object(); p...
2018-07-07 19:41:48
6715
原创 Java jps 命令详解
我们需要查看当前运行的 Java 进程时,可以使用 jps 命令。 jps 命令的用法:[root@admin ~]# jps -helpusage: jps [-help] jps [-q] [-mlvV] [<hostid>]Definitions: <hostid>: <hostname>[:<port&g...
2018-07-07 19:09:01
416
原创 Spring的DBCP和C3P0数据库连接配置
常用的 DBCP 连接池配置:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/&
2018-07-01 17:38:50
263
原创 Spring配置文件XML中的命名空间xmlns和xsi:schemaLocation
经常创建项目拷贝一段配置过来,对于 xml 开头的命名空间并不是很了解,这次总结一下。 比如下边的一段 applicationContext.xml 配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:co...
2018-07-01 14:27:54
2298
原创 Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析
一个简单的demo,见下载地址: 对于 applicationContext 的配置如下:调度器线程池 task:scheduler 和 task:executor 的意义在后边例子中会详细的测试和说明。&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;beans xmlns=&a
2018-07-01 13:44:45
8762
1
原创 MySQL的联结查询
联结,可以用来在一条 SELECT 语句中关联表。基础联结WHERE子句在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行进行配对。行的数目其实是第一个表中的行数和第二个表中行数的乘积。而使用 WHERE 子句作为过滤条件,只包含那些匹配联结条件的行。内部联结等值联结,基于两个表之间的相等测试,也要内部联结。SELECT t1.name FRO...
2018-05-11 23:16:32
984
原创 MySQL的CASE/WHEN流程控制语句
MySQL中的CASE/WHEN可以进行流程控制判断,比如:CASE 字段 WHEN 具体值 例如: id name sex salary 1 A m 2500 2 B f 1500 3 C m 5500 4 D f 500运行你所编写的查询语句之后,将会得到以下表:...
2018-05-06 10:07:22
824
原创 MySQL的文本/时间/数值处理函数
文本处理Left(column, n)返回字段的左边 N 个字符。Right 同理。 比如:mysql> select * from staff;+----+--------+-----------+---------+---------+------------+| id | name | dept | salary | edlevel | hired...
2018-05-05 23:40:15
576
原创 InnoDB存储引擎
InnoDB 存储引擎是多线程的模型,后台有多个不同的后台线程,负责处理不同的任务。后台线程Master Thread 主线程是一个核心后台线程,负责缓冲池中的数据异步刷新到磁盘,保证数据的一致性。 IO Thread 在 InnoDB 中大量使用了 AIO 即异步 IO 来处理写请求,这样可以极大提高数据库的性能。而 IO Thread 的工作主要是负责这些 IO 请求的回调处
2018-04-30 11:22:51
263
原创 Redis的底层数据结构
Redis 中有各种自定义的数据结构,来实现了各种功能,下面一一进行说明。简单动态字符串SDSRedis 没有直接使用 C 语言的字符串,而是构建了自己的抽象类型简单动态字符串(simple dynamic string)。 在 Redis 中,对于所有键,都是字符串类型,其底层实现是 SDS,而键值对的值,其实最终都是以字符串为粒度的,底层都是 SDS 实现。(比如列表,其实列表中每一...
2018-04-23 01:12:21
6278
原创 JVM新生代和老年代的参数——一次ElasticSearch的jvm参数调整
在测试服务器上发现 ES 进程总是挂掉,于是看 ES 的 gc 情况: 先查到进程的 PID 号,然后使用 jstat 指令:jstat -gc PID 50005000 是毫秒,每 5 秒刷新一次打印。查看日志如下: 可以看到经过一段时间的观察,新生代的 YoungGC 并没有发生,一直是 18 次没改变,而 FullGC 在新生代内存用完时就会出现一次,非常的频繁。 原因很明显,年老代的内
2018-04-15 00:46:41
5586
原创 Java使用POI操作Excel合并单元格
合并单元格的方法: 指定 4 个参数,起始行,结束行,起始列,结束列。然后这个区域将被合并。CellRangeAddress region = new CellRangeAddress(startRow, endRow, startCol, endCol);sheet.addMergedRegion(region);合并的简单示例:public class TestExcel { publ
2018-04-12 15:43:39
132679
8
原创 Redis的字符串类型
字符串是 Redis 中最常用的数据结构。字符串类型的值,简单字符串,JSON , XML,数字,二进制(图片等),最大 512MB 大小。基本命令设置值set key value [ex seconds] [px milliseconds] [nx|xx]ex 为键设置秒级过期时间 px 为键设置毫秒级过期时间 nx 键必须不存在,才可以设置成功,添加时使用 xx 键必须存在,才能设置成功,
2018-04-08 00:18:30
259
原创 Mongo集群Java连接时MongoException$Network、UnknownHostException错误
今天在 Java 连接 Mongo 集群时报了一个超时的错误,但是在本地客户端连接单节点的时候却能连上,具体报的错误如下:Caused by: com.mongodb.MongoTimeoutException: Timed out after 60000 ms while waiting for a server that matches {serverSelectors=[ReadP...
2018-03-29 22:59:05
1840
原创 修改Linux系统时间EDT改为CST
今天发现一台服务器时间比北京时间慢 12 个小时,使用 date 命令后发现是:root@ubuntu# dateThu Mar 22 5:12:08 EDT 2018EDT 时间即美国东部时间。这里要改为北京时间即可: 命令如下:root@ubuntu# mv /etc/localtime /etc/localtime.bak root@ubuntu# ln -s /usr/share/z
2018-03-22 17:53:23
13029
1
原创 Java并发Concurrent包——ThreadPoolExecutor线程池源码分析
ThreadPoolExecutor 就是常用的线程池,下面通过其中重要的源码来分析:线程池的状态由下边的源码,可以得知,线程池由一个32位的 int 型来表示状态。其中高位的 3 位代表 5 种状态,低位的 29 位代表工作线程的数量。 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); pr
2018-03-11 18:21:32
309
原创 Java并发Concurrent包——Callable/Future/FutureTask解析
Runnable 接口,由于是 void 方法,是没有返回结果的,在并发包中,有 Callable 类,能够得到执行的结果。Callable返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。pub
2018-03-10 15:21:19
1105
原创 Java并发Concurrent包——ArrayBlockingQueue源码分析
ArrayBlockingQueue 是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。 BlockingQueue 接口实现的都是阻塞队列。而 ConcurrentLinkedQueue 是基于 CAS 和链表实现的无阻塞高性能队列。 ConcurrentLinkedQueue 的源码分析见 Java并发Concurrent包——ConcurrentLinked
2018-03-09 17:02:32
411
原创 Java并发Concurrent包——ConcurrentLinkedQueue源码分析
ConcurrentLinkedQueue 是并发中的高性能队列,而 BlockingQueue 接口下的是并发的阻塞队列。 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程
2018-03-09 16:00:04
295
原创 Java并发Concurrent包——CopyOnWriteArrayList源码分析
CopyOnWriteArrayList 和 ArrayList 比较相似,只不过 CopyOnWriteArrayList 是线程安全的。 当进行写操作时,将原来的数组复制一份新的数组,写操作在这个新数组上进行;此时不影响旧数组上的读操作。写操作完成后,数组的引用改为新的数组即可,旧数组不再使用。属性 // 锁对象 final transient ReentrantLock loc
2018-03-09 11:03:10
229
原创 Java并发Concurrent包的锁(七)——Semaphore源码分析及使用
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。Sync类 abstract static class Sync extends AbstractQueuedSynchronizer {
2018-03-08 16:38:37
210
原创 Java并发Concurrent包的锁(六)——CountDownLatch源码分析及使用
CountDownLatch 和 CyclicBarrier 比较相似,都属于并发的实用工具类。 CyclicBarrier 的源码分析和使用可以参考:Java并发Concurrent包的锁(五)——CyclicBarrier源码分析及使用JDK 文档中的定义: 用给定的计数初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法
2018-03-08 13:27:51
238
原创 Java并发Concurrent包的锁(五)——CyclicBarrier源码分析及使用
CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 CyclicBarrier 支持一个可选的 Runnable 命令,
2018-03-07 17:52:00
303
原创 Java并发Concurrent包——ConcurrentHashMap原理分析
ConcurrentHashMap 和 HashMap 的底层实现都是 数组+链表或红黑树 构成的。 HashMap 的源码分析见:Java集合框架——HashMap源码分析ConcurrentHashMap 相比 HashMap 支持多线程下的操作。 而与 HashTable 相比,虽然 HashTable 也是线程安全的,但是其大量使用的是 synchronized 关键字,锁的粒度比较大,
2018-03-07 15:15:40
346
原创 Java并发Concurrent包的锁(四)——读写锁源码分析
本文对读写锁源码进行了比较详细的分析。 另外可以参考可重入锁 ReentrantLock 的分析:Java并发Concurrent包的锁(三)——ReentrantLock源码分析 ReadWriteLock接口ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。public
2018-03-06 15:22:02
456
原创 Java并发Concurrent包的锁(三)——ReentrantLock源码分析
ReentrantLock 提供了两个构造函数,默认是非公平锁的构造函数,还有一个公平锁的构造函数。 可以参考: Java并发Concurrent包的锁(二)——自旋/阻塞/可重入ReentrantLock 类中的公平和非公平,是通过对同步器 AbstractQueuedSynchronizer 的扩展加以实现的,也就是在tryAcquire的实现上做了语义的控制。 // 默认的非公平可重入
2018-03-05 16:31:08
562
原创 Java并发Concurrent包的锁(二)——自旋/阻塞/可重入
Java 并发包 Concurrent 的包结构共可分为五个部分: - 原子变量类 - 锁 - collection并发集合框架 - excutor线程池 - 同步工具本文介绍锁的一些原理和特征,比如自旋,阻塞,可重入,公平锁和非公平锁。自旋比如可以用 synchronized 关键字自己来实现一个简单的锁类 Lock,让它有一个标志 isLocked 来标记锁对象是否正在使用,
2018-03-05 14:42:47
758
原创 Java并发Concurrent包的锁(一)——Lock接口
Java 并发包 Concurrent 的包结构共可分为五个部分: - 原子类 - 锁 - collection并发集合框架 - excutor线程池 - 同步工具本文介绍 Lock 接口和其与 synchronized 关键字的对比。 Lock接口尽管 synchronized 在语法上已经足够简单了,在 JDK5 之前只能借助此实现,但是由于是独占锁,性能却不高,因此 JDK
2018-03-04 18:30:26
1371
原创 Java并发Concurrent包的原子类
concurrent 的包结构共可分为五个部分: - 原子变量类 - 锁 - collection并发集合框架 - excutor线程池 - 同步工具本文介绍原子变量类。原子变量类原子变量类位于 java.util.concurrent.atomic 包下。 以 AtomicInteger 为例,其它原子类的原理都一样: AtomicBoolean 可以用原子方式更新的 ...
2018-03-02 11:02:50
948
Spring定时任务@Scheduled例子
2018-07-01
使用POI读取excel03/07文件内容
2013-11-27
android带百分比进度条的文件上传,使用AsyncTask异步上传
2013-08-19
java base64的jar包
2013-07-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人