2017上半年总结

转眼半年就结束了,比想象中的要快很多。 编程 我向来是不喜欢Java的,万万没想到现在用的却是它。Java在我看来实在是太笨重了,一点都不是我像我的风格,我自认为骨子里是个放荡不羁的人。 不过学习Java拓宽了对编程语言的视野,对面向对象编程的理解更为深入,同时写代码的思路也更为严谨。 但是对Java底层原理的认识仍不够深入,排查定位问题的技巧仍有待提升。 在操作系统上花的时间仍旧不是很多,对于一些问题的排查仍然只是停留在表层,下半年得加强这一块。 Github连击已有半年了,似乎对我的编程水平的提升并没有什么帮助,下半年应该做一下有技术含量的项目,或者练习一下算法也可以。 希望接下去可以更深入地学习底层,提升自己运维方面的水平。 ...

2017年6月28日 · 2 分钟 · Bug1024

Git入门

前言 Git是一个快速、可扩展的分布式版本控制系统(Svn是集中式) 分布式版本控制的优点 没有“中央服务器”,每个人的电脑上都是一个完整的版本库 工作的时候不需要联网,因为版本库就在本地,因此可以轻松进行版本管理,而svn服务器挂了或断网时就无法commit 存储内容 svn使用的是增量文件系统(Delta Storage systems)存储每次提交(commit)之间的差异 Git会记录每次提交的文件的全部内容(snapshot) 基础 常用命令 git clone git checkcout git pull git push git merge 可参考 Git远程操作详解 工作区&暂存区&版本库 ...

2017年6月13日 · 3 分钟 · Bug1024

PHP线程安全

简述 全局变量为各线程共享,不同的线程引用同一地址空间,如果一个线程修改了全局变量就会影响所有的线程,所以线程安全是指多线程环境下如何安全的获取公共资源。 PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe, ZTS) ...

2017年6月7日 · 2 分钟 · Bug1024

Java 中的锁

自旋锁 自旋锁在JDK1.6之后就默认开启了。基于之前的观察,共享数据的锁定状态只会持续很短的时间,为了这一小段时间而去挂起和恢复线程有点浪费,所以这里就做了一个处理,让后面请求锁的那个线程在稍等一会,但是不放弃处理器的执行时间,看看持有锁的线程能否快速释放。为了让线程等待,所以需要让线程执行一个忙循环也就是自旋操作。 在jdk6之后,引入了自适应的自旋锁,也就是等待的时间不再固定了,而是由上一次在同一个锁上的自旋时间及锁的拥有者状态来决定。 ...

2017年6月5日 · 2 分钟 · Bug1024

FPM

FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理。FastCGI是Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议,它是与Http类似的一种应用层通信协议,注意:它只是一种协议! ...

2017年6月4日 · 4 分钟 · Bug1024

PHP扩展开发

PHP生命周期 模块初始化阶段 注册常量 注册核心php.ini 注册GET、POST等全局变量 注册内部核心扩展 根据php.ini注册加载其他扩展 调用扩展的PHP_MINIT() 请求初始化阶段 初始化编译器 初始化EG、全局符号表、include file数组、词法分析器 初始化SG 调用扩展的PHP_RINIT() 脚本执行阶段 编译opcode 执行zvm 请求关闭阶段 调用register_shutdown_fucntion() 清理EG 销毁全局变量PG 调用扩展的PHP_RSHUTDOWN() 关闭编译器、执行器、内存管理器 模块关闭阶段 调用扩展的PHP_MSHUTDOWN() 清理ini HashTable元素 关闭output 释放PG 内核基础-变量 变量存储结构 ...

2017年5月27日 · 5 分钟 · Bug1024

IntelliJ IDEA 快捷键

IntelliJ IDEA For Mac 快捷键 根据官方pdf翻译:https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf 在 IntelliJ IDEA 中有两个 Mac 版本的快捷键,一个叫做:Mac OS X,一个叫做:Mac OS X 10.5+ 目前都是用:Mac OS X 10.5+ 有两套的原因:https://intellij-support.jetbrains.com/hc/en-us/community/posts/206159109-Updated-Mac-OS-X-keymap-Feedback-needed 建议将 Mac 系统中与 IntelliJ IDEA 冲突的快捷键取消或更改,不建议改 IntelliJ IDEA 的默认快捷键。 ...

2017年5月21日 · 7 分钟 · Bug1024

Nginx入门

特点 1、处理响应请求很快 在正常的情况下,单次请求会得到更快的响应。 2、高并发连接 理论上,Nginx 支持的并发连接上限取决于你的内存,10 万远未封顶。 3、低的内存消耗 在一般的情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存。 4、具有很高的可靠性 Nginx 是一个高可靠性的 Web 服务器,高可靠性来自其核心框架代码的优秀设计、模块设计的简单性,并且这些模块都非常的稳定。 5、高扩展性 Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。这种设计造就了 Nginx 庞大的第三方模块。 6、热部署 master 管理进程与 worker 工作进程的分离设计,使得 Nginx 具有热部署的功能,可以在 7 × 24 小时不间断服务的前提下,升级 Nginx 的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。 7、自由的 BSD 许可协议 BSD 许可协议不只是允许用户免费使用 Nginx,也允许用户修改 Nginx 源码,还允许用户用于商业用途。 基础配置 worker_process # 表示工作进程的数量,一般设置为cpu的核数 worker_connections # 表示每个工作进程的最大连接数 server{} # 块定义了虚拟主机 listen # 监听端口 server_name # 监听域名 location {} # 是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/” location /{} # 匹配任何查询,因为所有请求都以 / 开头 root # 指定对应uri的资源查找路径,这里html为相对路径,完整路径为 index # 指定首页index文件的名称,可以配置多个,以空格分开。如有多个,按配置顺序查找。 location 匹配规则 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 location ~ pattern 开头表示区分大小写的正则匹配 location ~* pattern 开头表示不区分大小写的正则匹配* location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default 负载均衡 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 ip_hash:每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。 fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。 url_hash:此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。 least_conn:最少连接负载均衡算法,简单来说就是每次选择的后端都是当前最少连接的一个 server(这个最少连接不是共享的,是每个 worker 都有自己的一个数组进行记录后端 server 的连接数)。 hash:这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性 hash(consistent)。

2017年5月14日 · 3 分钟 · Bug1024

IO复用

select 模型 下面是 select 函数接口: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函数监视的文件描述符分 3 类,分别是 writefds、readfds 和 exceptfds。调用后 select 函数会阻塞,直到有描述符就绪(有数据 可读、可写、或者有 except),或者超时(timeout 指定等待时间,如果立即返回设为 null 即可)。当 select 函数返回后,通过遍历 fd_set,来找到就绪的描述符。 select 目前几乎在所有的平台上支持,其良好跨平台支持是它的一大优点。select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。 poll 模型 int poll (struct pollfd *fds, unsigned int nfds, int timeout); 不同与 select 使用三个位图来表示三个 fdset 的方式,poll 使用一个 pollfd 的指针实现。 ...

2017年5月10日 · 4 分钟 · Bug1024

Java的List,Map,Set

关系 Collection |-List │ |-LinkedList │ |-ArrayList │ |-Vector │ |-Stack | |-Set Map |-Hashtable |-HashMap |-WeakHashMap 介绍 Collection Collection是最基本的集合接口,一个Collection代表一组Object。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 LinkedList LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。 ArrayList ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 Vector Vector非常类似ArrayList,但是Vector是同步的。 Stack Stack继承自Vector,实现一个后进先出的堆栈。 Set Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。 Map 请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 HashMap HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。 WeakHashMap WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。 Map HashMap:基于散列表实现,是无序的; TreeMap:基于红黑树实现,按Key排序; LinkedHashMap:保存了插入顺序; Hashtable:是同步的,与HashMap类似; LinkedHashMap 底层使用哈希表与双向链表来实现迭代有序,非同步的HashMap 新增双向链表维护所有元素的有序性(因此非遍历操作性能可能低于HashMap) 包含两种排序方式:访问顺序和插入顺序(默认) 访问顺序有利于实现LRU(最近最少访问) 遍历速度只与元素总量(size)有关,与容量(capacity)无关 总结 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

2017年5月9日 · 3 分钟 · Bug1024