关于异步(async)IO和非阻塞(non-blocking)IO

今天看到有个人在某论坛问:异步IO是不是就是非阻塞IO,非阻塞IO是不是就是异步IO?
答案当然是否定的。
依稀记得之前看到过有个人比喻的很形象,你去相关部分盖个章:

  • 同步+阻塞:你必须在窗口等着,等人来办完了才能走
  • 同步+非阻塞:你可以出去转转或者干别的,人来了办完再走
  • 异步+非阻塞:你把材料留下然后回家做其他事情,他们盖完章快递给你
  • 异步+阻塞:你把材料留下,然后必须等着,他们盖完章快递给你

Read More

java面试知识点整理(未完待续)

J2SE基础

九种基本数据类型的大小,以及他们的封装类

java提供的九种基本数据类型:boolean、byte、char、short、int、long、float、double、void
以及它们的封装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double、Void

Switch能否用string做参数

能,这是Java1.7之后的特性

equals与==的区别

==是比较引用是否相等。equals是比较对象的值是否相等,可以自己重写对象的次方法

Object有哪些公用方法
  • clone 实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
  • equals在Object中与==是一样的,子类一般需要重写该方法
  • hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到
  • getClass final方法,获得运行时类型
  • wait 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。
    wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生:
    1. 其他线程调用了该对象的notify方法
    2. 其他线程调用了该对象的notifyAll方法
    3. 其他线程调用了interrupt中断该线程
    4. 时间间隔到了,此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常
  • notify 唤醒在该对象上等待的某个线程
  • notifyAll 唤醒在该对象上等待的所有线程
  • toString 转换成字符串,一般子类都有重写,否则打印句柄

Read More

PostgreSQL和MySQL之间的比较

对比表如下:

features PostgreSQL MySQL
Known as The world’s most advanced open source database The world’s most popular open source database
Development PostgreSQL is an open source project MySQL is an open-source product
Pronunciation post gress queue ell my ess queue ell
Licensing MIT-style license GNU General Public License
Implementation programming language C C/C++
GUI tool PgAdmin MySQL Workbench
ACID Yes Yes
Storage engine Single storage engine Multiple storage engines e.g., InnoDB and MyISAM
Full-text search Yes Yes
Drop a temporary table No TEMP or TEMPORARY keyword in DROP TABLE statement MySQL supports the TEMP or TEMPORARY keyword in the DROP TABLE statement that allows you to remove the temporary table only.
DROP TABLE Support CASCADE option to drop table’s dependent objects e.g., tables, views, etc. Does not support CASCADE option
TRUNCATE TABLE PostgreSQL TRUNCATE TABLE supports more features like CASCADE, RESTART IDENTITY, CONTINUE IDENTITY, transaction-safe, etc. MySQL TRUNCATE TABLE does not support CASCADE and transaction safe i.e,. once data is deleted, it cannot be rolled back.
Auto increment Column SERIAL AUTO_INCREMENT
Analytic functions Yes No
Data types Support many advanced types such as array, hstore, user-defined type, etc. SQL-standard types
Unsigned integer No Yes
Boolean type Yes Use TINYINT(1) internally for Boolean
IP address data type Yes No
Set default value for a column Support both constant and function call Must be a constant or CURRENT_TIMESTAMP for TIMESTAMP or DATETIME columns
CTE Yes No
EXPLAIN output More detailed Less detailed
Materialized views Yes No
CHECK constraint Yes No (MySQL ignores the CHECK constraint)
Table inheritance Yes No
Programming languages for stored procedures Ruby, Perl, Python, TCL, PL/pgSQL, SQL, JavaScript, etc. SQL:2003 syntax for stored procedures
FULL OUTER JOIN Yes No
INTERSECT Yes No
EXCEPT Yes No
Partial indexes Yes No
Bitmap indexes Yes No
Expression indexes Yes No
Covering indexes Yes (since version 9.2) Yes. MySQL supports covering indexes that allow data to be retrieved by scanning the index alone without touching the table data. This is advantageous with large tables with millions of rows.
Common table expression (CTE) Yes No
Triggers Support triggers that can fire on most types of command, except for ones affecting the database globally e.g.,roles and tablespaces. Limited to some commands
Partitioning RANGE, LIST RANGE, LIST, HASH, KEY, and composite partitioning using a combination of RANGE or LIST with HASH or KEY subpartitions
Task Schedule pgAgent Scheduled event
Connection Scalability Each new connection is an OS process Each new connection is an OS thread

JVM常用参数

1.Java堆参数

parameter explain example
-Xms 堆最小值 -Xms20M
-Xmx 堆最大值 -Xmm20M
-Xmn 年轻代大小 -Xmn2g (设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8)
-XX:NewSize 新生代大小 -XX:NewSize=20M
-XX:MaxNewSize 年轻代最大值
-XX:SurvivorRatio 新生代/年老代 -XX:SurvivorRatio=2 (新生代是老年代的2倍)
-XX:NewRatio 老年代/新生代 -XX:NewRatio=4 (老年代是新生代的4倍)

例:

1
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

Read More

在nginx中配置Let's Encrypt的https证书

1 、获取 Let’s Encrypt 程序

1
2
3
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
chmod +x letsencrypt-auto

2 、执行安装证书

在执行一下命令之前要注意,你的域名下必须要有服务器正在运行,不然下面脚本无法执行成功。如果你的服务器里已经有Python环境,
直接执行python -m http.server 80开启一个http服务器。一般1024以下端口非管理员用户不能绑定,所以你还需要确保你的80端口可以在公网访问,如果不能请自行Google
寻找解决办法。

1
./letsencrypt-auto certonly -a webroot --webroot-path=/home/www/www.gentlehu.com --email me@gentlehu.com -d www.gentlehu.com

将上面的目录、邮箱和域名换成你自己的,如果在输出信息中没有看到错误提示并且在/etc/letsencrypt/live/www.gentlehu.com/目录看到如下五个文件就说明证书申请成功:

1
2
3
4
5
cert.pem - Apache 服务器端证书
chain.pem - Apache 根证书和中继证书
fullchain.pem - ssl_certificate
privkey.pem - ssl_certificate_key
README.md

然后就可以关闭之前的http服务器了。

Read More