linux源码
LXR 源自“the Linux Cross Referencer”,中间的“X”形象地代表了“Cross”。与 Source Navigator 类似,它也是分析阅读源代码的好工具。不同的是,它将源代码借助浏览器展示出来,文件间的跳转过程成了我熟悉的点击超链接动作。
http://lxr.linux.no/ LXR安装过程简介
linux手册
Linux每周新闻
linux.org 可以每天读一读,顺便提高英文水平
MIT的64位Centos6.5下载镜像
http://mirrors.mit.edu/centos/6.5/isos/x86_64/
xinu
http://www.xinu.cs.purdue.edu/
Nginx源码
http://lxr.evanmiller.org/http/source/
src/lib/libc/源码(如果只是看libc而不局限与Linux,可以到这里看)
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/
GUN的libc源码下载
http://mirrors.ustc.edu.cn/gnu/libc/
www.sf.net SF的C代码库(可以按编程语言等筛选)
xshell中文乱码:
[文件]–>[打开]–>在打开的session中选择连接的那个,点击[属性] -> [终端], 编码选择为:Unicode(UTF-8),然后重新连接服务器即可。也可以在Xshell的工具栏里面点击“编码 ”按钮,选择Unicode(UTF-8)编码即可。
Makefile:2: *** 遗漏分隔符 。停止
罗列linux所有安装包:#pkg-config --list-all
代码阅读--Source Insight
http://www.sourceinsight.com/index.html
SI3US-205035-36448
在sourceInSight中看代码时,中文注释显示有问题,因为它不支持utf8编码
方法是:用记事本打开含有中文的文件,然后另存为ANSI编码
代码来源--acme
正则:
例如:html链接的正则
==========================
汇编语言
30天自制操作系统笔记 作者很爱学习Linux/C
==========================
计算机组成
处理器CPU
上海交通大学师生制作的一个关于cache映射功能、命中率计算的教学演示程序 [很好,可以点击看目录更精彩]
============================
Linux
#uname -a 内核信息
------------------------
#man -k 函数
#man 返回的数字 函数
#man -k file | grep umask
---------------------------
抓指定端口
#tcpdump -i eth0 port 80
---------------------------
#netstat -a 查看开启了哪些端口,常用netstat -an
#netstat -n 查看端口的网络连接情况,常用netstat -an
#netstat -v 查看正在进行的工作
#netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
#netstat -s 查看正在使用的所有协议使用情况
------------------------------
lsof的功能很多,特別提醒大家, -c,-g,-p,-u,这四个参数最有用。更详细的资料请参看:man lsof
# lsof abc.txt 显示开启文件abc.txt的进程
#lsof -p pid 查看侦听端口,lsof 常见的用法是查找应用程序打开的文件的名称和数目
# lsof -i :80 知道80端口现在运行什么程序
# lsof -c nsd 显示nsd进程现在打开的文件
# lsof -g gid 显示归属gid的进程情况
# lsof +d /usr/local/ 显示/usr/local目录下被进程开启的文件
# lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
# lsof -d 4 显示使用fd为4的进程
# lsof -i [i] 用以显示符合条件的进程情况
#lsof -i @192.168.1.10 显示了搜索与 192.168.1.10 之间的所有连接。
--------------------------------
#cat /proc/interrupts 显示中断信息
#cat /proc/2452/fd/7
#cat /proc/net/sockstat 网络套接字使用统计
#cat /proc/sys/fs/file-max 所有运行的程序同时能打开的文件总数
------------------------------------
将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
#tar -zxvf /tmp/etc.tar.gz 解压
---------------------------------------
#vmstat 2 第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。主要通过收集VMSTAT的信息来展现服务器状况。
-----------------------内核----------------------------
http://linuxtoy.org/ [哈工大linux站]
Linux 系统内核的调试 [IBM文档库]
《Linux 核心》原著: David A Rusling翻译: Banyan & fifa
《Linux 核心》原著: David A Rusling翻译: 胡宁宁 毕昕 仲盛 赵振平周笑波 李群 陈怀临
也谈Linux Kernel Hacking – 内核配置、编译与安装
使用 /proc 文件系统来访问 Linux 内核的内容 [IBM文档库]
linux内核PID管理 [很好]
Linux内核spin_lock与spin_lock_irq分析
linux上使用strace查看C语言级别的php源码【查看最终系统调用】
Linux下高并发socket最大连接数所受的各种限制 [很好]
摘录:Linux打Patch的方法 [很好]
Linux性能监控(1) [总结全面] linux系统性能监控常用命令 [全面]
系统调用的实现原理 [很好]
--------------------------内存管理-------------------------------
内存映射文件原理探索 [很好]
Linux slab 分配器剖析 [IBM文档库]
Linux Slub分配器(一)--概述 [很好]
[Pthread] Linux中的内存管理(一)--Paging
[Pthread] Linux中的内存管理(二)--Layout
[Pthread] Linux中的内存管理(三)--Stack
[Pthread] Linux中的内存管理(四)--Heap(brk()和mmap()) [很好]
分段和分页 [形象]
第十讲分段与分页 (图文并茂形象)
广东工大操作系统课件 [很好]
分页存储管理 [很好]
分段存储管理 [很好]
内存管理内幕 [IBM文档库]
内存分配原理 [转帖存档]
【百度分享】频繁分配释放内存导致的性能问题的分析 [写的非常好]
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
malloc()_分配内存,会用到brk(用于小内存申请<=128kb,在堆上)或mmap2(用于大内存申请,一般是堆和栈中间)系统调用
频繁分配释放内存导致的性能问题的分析___1、缺页中断的执行过程;2、内存分配释放的原理__brk,mmap,为什么会产生内存碎片等原因
Linux中brk(),sbrk(),mmap(),malloc(),calloc()的异同
-----------------------进程----------------------------
Linux启动新进程的几种方法及比较 linux编程-守护进程编写
使用ptrace跟踪进程 0号进程->1号内核进程->1号内核线程->1号用户进程(init进程)->getty进程->shell进程
linux进程创建:fork、vfork和clone联系与区别
在Linux下的进程资源的限制(struct rlimit)详解
Linux系统调用--getrlimit()与setrlimit()函数详解
窥探 kernel --- 浅析do_exit [有图很好]
------------------进程间通信----------------------
在 Linux 中使用共享对象 让共享内存为您服务,而不是为您制造麻烦
-------------------------线程-------------------------------
pthread_cond_signal和pthread_cond_wait简介
-----------------------信号----------------------------
-----------------------时间----------------------------
浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程
浅析 Linux 中的时间编程和实现原理,第 2 部分: 硬件和 GLibC 库的细节
浅析 Linux 中的时间编程和实现原理,第 3 部分: Linux 内核的工作
浅析 Linux 中的时间编程和实现原理,第 4 部分: Linux 内核的工作
-----------------------文件和锁----------------------------
硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
Linux文件IO__文件系统架构层次,IO调用链,一致性和安全性,性能问题,fclose,fflush,fsync的区别 [很好很好]
linux open 函数O_DIRECT标志位使用说明 open的O_DIRECT选项 【注意事项】
简析文件操作【图文并茂】
linux文件操作(一)(遇见0425的ChinaUnix博客)
mmap详解 [很好]
linux mmap 内存映射mmap() vs read()/write()/lseek() [很好]
Linux 文件系统剖析 [IBM文档库]
强制把系统缓存写入文件sync和fsync函数,, fflush和fsync的联系和区别 (c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘)
Iowait的成因、对系统影响及对策 [很好很深]
Linux 2.6内核中新的锁机制--RCU [IBM文档库]
日志模块的C语言实现 [很好]
Pthreads mutex vs Pthreads spinlock
-----------------------输入输出----------------------------
对STDOUT_FILENO和STDIN_FILENO的理解
-----------------------linux图形化----------------------
----------------------小例子很好-------
-----------------------中断-------------------
-----------------------linux数据结构----------------------------
-----------------------链接与加载 动态库 静态库----------------------------
-----------------------GCC和编译----------------------------
How to Build a GCC Cross-Compiler[技术含量很高]
GCC "-fomit-frame-pointer"编译选项的含义
Introduction to PIC - (Position Independent Code)
----------------网络编程----------------------
(摘录)sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
[gcc编程] socket编程——sockaddr_in结构体操作
高性能网络编程,第 2 部分: 加快客户机和服务器的处理速度
-------------------linux TCP/IP协议栈------------------------------------
linux tcp/ip协议栈研究--ip包的转发和本地传递
了解 TCP 系统调用序列 [IBM文档库]
-----------------------------------------------------------------
LVS
LVS+Keepalived
lvs 和 keepalived的有什么区别
lvs+keepalived和haproxy+heartbeat区别
------------------ljianhui的专栏-------------------------
------------------------TCP/IP-------------------------
----------------select和poll----------------------
select系统调用与FD_SET,FD_ISSET,FD_ZERO
select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
Linux 内核的排队自旋锁(FIFO Ticket Spinlock
Ticket spinlocks
--------------------------------------
epoll
使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?
file-max与ulimit的关系与差别
/proc/sys/fs/file-max
epoll_create, epoll_ctl和epoll_wait
Linux网络编程一步一步学-epoll同时处理海量连接的代码
----------tcpdump-------------------
---------------------------------------------------
监控
-----
zabbix
运维生存时间 【安装使用PDF】==========================
算法和数据结构
一致性哈希PHP实现flexihash版 [很好]
How browsers work--Behind the scenes of modern web browsers (前端必读)
Oracle编程高手箴言:位图索引(Bitmap Index)的故事
字符串相关算法问题 [很好]
C语言单链表实现19个功能完全详解[还可以]
=============================
C语言
为什么不常见include .c文件 [如果是include .c文件 在make文件中不能包含被include文件了否则编译不过去]
C/C++数组名与指针区别深入探索 [很好]
void指针 [总结的很到位]
结构体 数组名与指针区别 [很好]
《Understanding and Using C Pointers》要点先睹为快 [很好]
断言(C++大师Andrei Alexandrescu的文章)
C语言头文件的使用 [很好]
typedef用法小结[很好]
const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
shellcode之一:栈溢出 (很好)
日志模块的C语言实现 [还可以]
如何实现一个malloc [张洋 很全面]
C语言字符串库函数的实现 [很好]
Linux下程序设计____命令行参数的获取argc,argv的解析(getopt的使用)
C语言函数内部改变指针本身 [很好] 改变指针内容只能用指针的指针
C语言中的作用域和生存周期 for循环定义的局部变量在循环结束后就没了
--------------------libcurl-----------------------------
libcurl使用心得 (不错)
libcurl教程(不错)
libcurl教程(不错)
----------------gcc----------------------------
AT&T的malloc实现--malloc的基础和本质 (很好)
----------------内存对齐----------------------
如何高效的访问内存 [讲内存对齐很透彻]
---------------内存池slab分配器-----------------------------------
基于C语言的内存池的设计与实现 [讲mempool内存池实现]
http://blog.youkuaiyun.com/lenky0401
漫步Facebook开源C++库folly(1):string类的设计
动态内存分配(malloc/free)简单实现--隐式空闲链表
基于C语言的内存池的设计与实现 (有图很好)
-----------------Tcmaloc和jemalloc--------------------------------
tcmalloc官方说明汉化 [无暇]
2012年tcmalloc学习笔记之一 [很好]
让Redis使用TCMalloc,实现高性能NOSql服务器
==================================
C++
==================================
lua
==================================
Nginx
Emiller's Guide To Nginx Module Development
Nginx 内存池(pool)分析 [图画的非常好]
nginx源码学习----内存池 [很好]
nginx(engine x) 源代码分析 徐景(rainx), 王晓哲(chaoslawful) [很好]
github: ncx_mempool [很好]
ncx_mempool源码分析[很好]
nginx slab内存管理 [很好]
--------------------------Nginx开发从入门到精通-----------------------------------
--------------------------阿里集团数据平台-------------------------------------------
--------------------------张洋(Nginx模块开发入门)---------------------------------
--------------------------淘雕梁---------------------------------------------------------
nginx中cache的设计和实现(一) nginx对静态文件cache的处理 Nginx配置文件解析详解 nginx的upstream分享 nginx对keepalive和pipeline请求处理分析
nginx中request buf的设计和实现 nginx的启动流程分析(二) nginx的启动流程分析(一) nginx中if命令的设计和实现 nginx中http request处理的流程
nginx中slab分配器的实现 nginx中处理http header详解(1) nginx中处理http header详解(2) nginx中处理stale event nginx源码剖析
nginx中if命令的设计和实现 nginx对TCP_CORK/TCP_NOPUSH的使用 nginx least_conn 模块源码剖析
nginx中upstream的设计和实现(一) nginx中upstream的设计和实现(二) nginx中upstream的设计和实现(三)
--------------------------jizhao----------------------------------
Nginx基础数据结构分析-ngx_buf_t Nginx基础数据结构分析-ngx_list_t Nginx基础数据结构分析-ngx_chain_t
Nginx基础数据结构分析-ngx_hash_keys_arrays_t Nginx基础数据结构分析-ngx_hash_combined_t
Nginx基础数据结构分析-ngx_pool_t Nginx基础数据结构分析-ngx_array_t Nginx超时机制 ngx_snprintf说明
-----------------------阿波(livelylittlefish)--------------------------
nginx源码分析—内存池结构ngx_pool_t及内存管理 nginx源码分析—数组结构ngx_array_t nginx源码分析—全局变量ngx_cycle的初始化 nginx源码分析—模块及其初始化
nginx源码分析—hash结构ngx_hash_t(v1.0.4) nginx源码分析—core模块callback nginx源码分析—信号初始化 nginx源码分析—如何发送信号
-------------------------编程De(jzhlin)------------------------
Nginx 源码分析-- 内存池(pool)的分析 一 Nginx 源码分析-- 内存池(pool)的分析 二 Nginx 源码分析-- 内存池(pool)的分析 三
Nginx 源码分析-- 浅谈对模块module 的基本认知 Nginx 源码分析-- ngx_array、ngx_list基本数据结构 Nginx 源码分析-- ngx_string 的一些简单分析
Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 一 Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 二
-----------------------可乐爱上咖啡(marcky)----------------------------
Nginx源码分析-数组 nginx源码分析-链表 Nginx源码分析-启动初始化过程(一) Nginx源码分析-启动初始化过程(二) Nginx源码分析-内存池
Nginx源码分析-进程管理之master进程 Nginx源码分析-进程管理之worker进程 Nginx源码分析-master和worker进程间的通信
Nginx源码分析-事件驱动的初始化 Nginx源码分析-事件循环 Nginx源码分析-connections数组 Nginx源码分析-Epoll模块
----------------------风去无痕(fll369)-----------------------------
nginx中slab实现 Nginx共享内存 nginx进程通信--共享内存 nginx进程通信 nginx进程模型
nginx配置文件解析 nginx模块解析 nginx事件机制 nginx socket初始化 nginx建立连接
-------------------------lengzijian--------------------------
nginx 源码学习笔记(一)——初识nginx helloworld模块
nginx 源码学习笔记(六)——nginx基本数据结构 nginx 源码学习笔记(七)——内存分配相关源码分析
nginx 源码学习笔记(八)——基本容器——array数组 nginx 源码学习笔记(九)——基本容器——queue
nginx 源码学习笔记(十)——基本容器——ngx_hash nginx 源码学习笔记(十一)——基本容器——ngx_list
nginx 源码学习笔记(十二)——基本容器——ngx_buf
nginx 源码学习笔记(十三)——文件读写和配置文件读取 nginx 源码学习笔记(十四)—— 全局变量ngx_cycle
nginx 源码学习笔记(十五)—— ngx_master_process_cycle 多进程(一) nginx 源码学习笔记(十六)—— ngx_start_worker_processes子进程创建
nginx 源码学习笔记(十七)—— ngx_worker_process_cycle子进程执行
nginx 源码学习笔记(二十)—— event 模块(一) nginx 源码学习笔记(二十一)—— event 模块(二)
nginx 源码学习笔记(二十二)—— event 模块(三) ——epoll模块 nginx 源码学习笔记(二十三)—— event 模块(四) ——timer红黑树
-------------------钟超Michael · 个人技术笔记--------------------------------
Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c 解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!
-------------------但行好事 莫问前程(simohayha)--------------------------------
nginx的进程模型 nginx的内存管理 nginx中request请求的解析 nginx的filter的处理 nginx中锁的设计以及惊群的处理
nginx中handler的处理(一) nginx中handler的处理(二) nginx中的output chain的处理(一) nginx中的output chain的处理(二)
----------------------从这里开始(coder2012)-----------------------------
Nginx学习笔记(三) Nginx基本数据结构 Nginx学习笔记(二) Nginx--connection&request Nginx学习笔记(七) 创建子进程
Nginx学习笔记(六) 源码分析&启动过程 Nginx学习笔记(五) 源码分析&内存模块&内存对齐 Nginx学习笔记(四) 源码分析&socket/UDP/shmem
----------------------浪湾(langwan)-----------------------------
nginx源代码分析 Nginx源代码分析-ssi模块处理(一) Nginx源代码分析-ssi模块处理(二) Nginx源代码分析-ssi模块处理(三)
-----------------------那一剑的风情(fqing)----------------------------
nginx源码分析之开篇 nginx源码分析之模块化 nginx源码分析之设计之美 nginx源码分析之事件机制 nginx源码分析之配置图解
-------------------------bollaxu--------------------------
Nginx Proxy Cache的slab page内存缓存机制 Nginx的HTTP请求处理 Nginx的upstream模块和反向代理(一) Nginx的upstream模块和反向代理(二)
Nginx spinlock互斥锁 Nginx Proxy Cache分析 Nginx事件处理(epoll)
--------------------李子的博客(lifeibo)-------------------------------
Nginx源码分析之变量 Nginx中slab分配大内存的陷阱 Nginx问题定位之监控进程异常退出
--------------------yjf512-------------------------------
nginx的HTTP模块编写 nginx的http模块开发--一个验证url参数的例子 nginx模块_使用gdb调试nginx源码 nginx源码学习资源(不断更新)
--------------------那谁-------------------------------
Nginx0.7.61代码分析(一)–写在前面的话以及进程模型分析 Nginx0.7.61代码分析(二)–worker子进程之间的负载均衡 Nginx0.7.61代码分析(三)–事件处理 Nginx0.7.61代码分析(四)–处理超时连接 Lighty与Nginx的比较分析 内存池及其他
----------------------江南烟雨---------------------------
Nginx学习之十三-负载均衡-IP哈希策略剖析 Nginx学习之十一-Nginx启动框架处理流程 Nginx学习之二-配置项解析及编程实现
----------------------程序员的自我修养---------------------------
nginx源码学习----内存池 哈希表的C实现(一) 哈希表的C实现(二) Mina框架研究(1)
-------------------Dmee的专栏-----------------------------
------------------杂家--------
NGINX原理分析之SLAB分配机制 [图文并茂]
nginx源码剖析(3)----nginx中的内存池(简化去掉日志)
===================================
redis
Redis 命令参考[汉化]
Redis 命令参考[汉化和上面一样的,做个备份]
Redis学习手册(目录) [不错,命令例子很多,排版也不错]
--------------twemproxy代理---------------------
https://github.com/twitter/twemproxy
Twemproxy – Twitter 开源的 Redis proxy
----------------------------------
Redis内存存储结构分析 (淘宝搜索技术博客) 【很好很全】
Redis运行流程源码解析 (事件分析完整参开之三)[很好]
Redis内存使用优化与存储 [很好]
Redis 事务实现原理分析 [很好]
阿里云计算运维部高级工程师阮若夷:Redis深入浅出 [很好]
Redis采用不同内存分配器碎片率对比 [很好]
Redis内存容量的预估和优化 [很好 讲jemalloc]
redis/ae总结 [还可以,事件机制总结的很全]
为啥 redis 使用跳表(ziplist)而不是使用 red-black?
------------------Redis设计与实现---------------------------------
redisObject 数据结构,以及 Redis 的数据类型
-----------------------麦子迈------------------------------------
解读Redis中ziplist、zipmap、intset实现细节
Redis核心解读-从Master到Slave的Replicantion
Redis核心解读–pubsub(发布者-订阅者模式)的实现
Redis核心解读–集群管理工具(Redis-sentinel)
--------------------curve--------------------------------
Redis源码解析4 - 数据类型之 String & List
-----------------(董的博客)----------------------
Redis源码研究—代码整体架构 (事件分析完整参开之一)[很好]
----------------------用Bollger记录技术之路的点滴...------------------------------
----------------------------运维和开发----------------------------------
redis源代码分析 – event library (事件分析完整参开之二)[很好]
redis内存容量的预估和优化 (剖析set)
----------------------------Aegeaner的专栏-----------------------------
---------------------olylakers-------------------------------
---------------------------淘宝核心系统团队博客-------------------
------------------------------igloo1986-------------------
-------------------------------------刘浩de技术博客-----------------------
===================================
LevelDB
===================================
thttpd
thttpd轻量级web服务器(HTTP/1.1和简单的CGI支持)
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法
------------------------------------------------
libevent和libev网络库
libevent源码浅析: http库 libevent源码浅析: 事件处理框架 libevent源码浅析: 定时器和信号 libevent源码浅析: 主要的结构体
----------------libev---------------------
=====================
PHP
PHP中spl_autoload_register函数的用法
PHP包含文件(require/include/require_once/include_once/__autoload/spl_autoload_xxx)分析总结
BigPipe学习研究 很好
用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件 [很好]
php之aop实践 php老鸟
https://github.com/phpredis/phpredis [phpredis扩展]
-----------------PHP扩展----------------------------
用C语言写PHP扩展 (基础)
用C语言扩展PHP功能 (数据库操作)
PHP内核探索:zend_parse_parameters函数
Zend API:Zend_parse_parameters
--------------laruence-----------------------
再一次, 不要使用(include/require)_once
Yar – 并行的RPC框架(Concurrent RPC framework)
-----------------------------------------------------------
YII
Yii PHP 框架分析 (一) Yii PHP 框架分析(二) Yii PHP 框架分析(三) Yii PHP 框架分析(四)
-----------------------------------------------------------
PHP的MVC框架哪一个性价比最高?yii2 还是 thinkphp
==================================
Javascript
http://www.gruntjs.net/docs/getting-started/
大公司里怎样开发和部署前端代码 作者个人博客https://github.com/fouber/blog
百度web前端研发部 http://fex.baidu.com/
百度无线web研发部 http://mweb.baidu.com/
-----------------------------------------------------------
Ajax
说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;
2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);
3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;
4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;
5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
Ajax直接请求普通文件存在跨域无权限访问的问题。解决方法有JSONP,Flash等等。
JSONP
我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>。
那就是说如果要跨域访问数据,就服务端只能把数据放在js格式的文件里。恰巧我们知道JSON可以简洁的描述复杂数据,而且JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。
然后客户端就可以通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件。客户端在对JSON文件调用成功之后,也就获得了自己所需的数据。这就形成了JSONP的基本概念。
允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
以前要实现跨域访问,可以通过JSONP、Flash或者服务器中转的方式来实现,但是现在我们有了CORS。
CORS与JSONP相比,无疑更为先进、方便和可靠。
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS(这部分会在后文浏览器支持部分介绍)。
很简单,就是利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的。
当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,形如: <script src="http://www.example.net/api?param1=1¶m2=2"></script>
并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)。
第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),形如: callback({"name":"hax","gender":"Male"}) 这样浏览器会调用callback函数,并传递解析后json对象作为参数。
本站脚本可在callback函数里处理所传入的数据。
补充:“历史遗迹”的意思就是,如果在今天重新设计的话,也许就不会允许这样简单的跨域了嘿,比如可能像XHR一样按照CORS规范要求服务器发送特定的http头。
JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,
这样客户端就可以随意定制自己的函数来自动处理返回数据了。
==================================
mysql
orzdba工具使用说明 [非常好用重要]
MySQL线上常见故障剖析 [很好]
利用NetScaler和自行编写的健康检查脚本,完美解决多台MySQL Slave数据库的负载均衡 [张宴]
MySQL第三方复制工具 --- Tungsten-Replicator
Tungsten Replicator 的安装 2.0.4 2.0.6
Tungsten Replicator 是一种MySQL复制引擎,类似于MySQL 自身的replication,基于日志复制模式,不同的是 Tungsten 通过Extractor控件读取mysql主库的binlog 解析成自己的日志格式--THL(Transaction History Log), 在从库上通过Applier控件写入数据库。
第三方数据复制引擎--Tungsten-Replicator 主要特点:
1 支持高版本MySQL向低版本复制,5.1-->5.0
2 支持跨数据库系统的复制,MySQL->PgSQL ,MySQL->MongoDB
3 支持多主库向单台Slave的复制,Multi-Master-->Slave
4 G-Replicator提取数据的更新记录写到MySQL 队列表Queue;基于这个队列,可以为其他应用服务提供便利
https://code.google.com/p/tungsten-replicator/
高性能mysql(基于复制架构)(多图)高性能mysql(基于复制架构)(多图)
=================================
搜索技术
sphinx
亿级数据的高并发通用搜索引擎架构设计 [张宴]
基于Sphinx构建准实时更新的分布式通用搜索引擎平台 [张宴]
-----------------------------------------------
Lucene
Lucene原理与代码分析 [很好]
Lucene 原理与代码分析完整版 [很好]
http://wiki.apache.org/lucene-java/HowTo
=================================
memcached
关于Memcache内存管理模型的理解 [很好]
memcached内存管理(1) ----------------slabs [很好]
memcached内存管理(2) ----------------items
memcached内存管理(3) ----------------assoc
memcached全面剖析–2.理解memcached的内存存储 [很好]
memcached全面剖析–3.memcached的删除机制和发展方向
memcached全面剖析–4. memcached的分布式算法
memcached全面剖析–5. memcached的应用和兼容程序
memcache slabs [好]
微博高并发场景下的分布式缓存架构 [好]
memcached源码学习-内存管理机制slab allocator[好]
memcached浅析-韩建华 [好]
memcached源代码分析 [好]
Memcached FAQ(2) 集群架构方面的问题 [准确]
Memcached 结构分析 [很全面]
Memcached数据被踢(evictions>0)现象分析
memcache源码分析之slabs [很好]
C C++ 内存池分析 三 淘宝tair K-V 内存数据库 mem_pool
memcached server LRU 深入分析 [还不错]
==================================
存储
==================================
FastDFS
FastDFS分布式文件系统点滴记录3 -- 网络模型、libevent框架使用
FastDFS分布式文件系统点滴记录4 -- tracker 、storage 入口分析
FastDFS分布式文件系统点滴记录5 -- upload上传机制剖析1
FastDFS分布式文件系统点滴记录5 -- upload上传机制剖析2
FastDFS分布式文件系统点滴记录5 -- upload上传机制剖析3
FastDFS分布式文件系统点滴记录6 -- download下载机制剖析
==================================
TFS
--------------bingfox的专栏---------------
=================分布式理论===================
CAP原理
CAP定理 [wiki]
以两军问题为背景来演绎Basic Paxos【最形象,paxos和两军问题,不是说paxos解决了两军问题,只是借用两军问题的背景来演绎paxos。】
一步一步理解Paxos算法【黑夜路人 画图不错】
Paxos算法细节详解(一)--通过现实世界描述算法【很好】
在最初的第二阶段,议题是先入为主的,谁先占了先机,后面的proposer在第一阶段就会学习到这个议题而修改自己本身的议题,因为这样没职业操守,才能让一致性得到保证,这就是paxos算法的一个过程。原来paxos算法里的角色都是这样的不靠谱,不过没关系,结果靠谱就可以了。该算法就是为了追求结果的一致性。
Paxos是一个分布式选举算法就够了。
1. database replication, log replication等, 如bdb的数据复制就是使用paxos兼容的算法。Paxos最大的用途就是保持多个节点数据的一致性。
2. naming service, 如大型系统内部通常存在多个接口服务相互调用。
3.config配置管理
4.membership用户角色/access control list, 比如在权限设置中,用户一旦设置某项权限比如由管理员变成普通身份,这时应在所有的服务器上所有远程CDN立即生效,否则就会导致不能接受的后果。
5. 号码分配。通常简单的解决方法是用数据库自增ID, 这导致数据库切分困难,或程序生成GUID, 这通常导致ID过长。更优雅的做法是利用paxos算法在多台replicas之间选择一个作为master, 通过master来分配号码。当master发生故障时,再用paxos选择另外一个master。
Yahoo!开源的ZooKeeper [5]是一个开源的类Paxos实现。它的编程接口看起来很像一个可提供强一致性保证的分布式小文件系统。对上面所有的场合都可以适用。但可惜的是,ZooKeeper并不是遵循Paxos协议,而是基于自身设计并优化的一个2 phase commit的协议,因此它的理论[6]并未经过完全证明。但由于ZooKeeper在Yahoo!内部已经成功应用在HBase, Yahoo! Message Broker, Fetch Service of Yahoo! crawler等系统上,因此完全可以放心采用。
CAP理论以及Eventually Consistent 解析
关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
两阶段提交协议(two phase commit protocol,2PC)
CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。
但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。
CP without A:如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。
很多传统的数据库分布式事务都属于这种模式。
AP wihtout C:要高可用并允许分区,则需放弃一致性。
一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
基本可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
软状态( Soft State)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。
分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
最终一致性( Eventual Consistency)
最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
ACID和BASE的区别与联系
ACID是传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
ACID和BASE代表了两种截然相反的设计哲学
在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合使用。
分布式领域CAP理论,
Consistency(一致性), 数据一致更新,所有数据变动都是同步的
Availability(可用性), 好的响应性能
Partition tolerance(分区容错性) 可靠性
定理:任何分布式系统只可同时满足二点,没法三者兼顾。
忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。
关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:
Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。
Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。
Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。
Durability. 一旦事务完成,就不能返回。
跨数据库事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。
BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:
Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)
Soft state软状态 状态可以有一段时间不同步,异步。
Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致。
集中式系统用一句话概括就是:一个主机带多个终端。
在《分布式系统概念与设计》一书中,对分布式系统做了如下定义:
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统
简单来说就是一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。
分布式领域CAP理论告诉我们,任何一个分布式系统都无法同时满足Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。 但是,一个分布式系统无论在CAP三者之间如何权衡,都无法彻底放弃一致性(Consistency),如果真的放弃一致性,那么就说明这个系统中的数据根本不可信,数据也就没有意义,那么这个系统也就没有任何价值可言。所以,无论如何,分布式系统的一致性问题都需要重点关注。
有的架构师还说在某些场景中可以牺牲一致性呢?
通常这里说的放弃一致性指的是放弃数据的强一致性。
强一致性
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。
弱一致性
系统并不保证续进程或者线程的访问都会返回最新的更新过的值,可能保证在某个时间级别之后,可以让数据达到一致性状态。
最终一致性
弱一致性的特定形式。
在没有后续更新的前提下,系统最终返回上一次更新操作的值。
在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS是一个典型的最终一致性系统。
分布式事务是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。
二阶段提交:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。
两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。
二阶段提交还是有几个缺点的:
1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
3、数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
4、二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。
三阶段提交有两个改动点。
1、引入超时机制。同时在协调者和参与者中都引入超时机制。
2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
也就是说,除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
相对于2PC,3PC主要解决的单点故障问题,并减少阻塞,因为一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit。而不会一直持有事务资源并处于阻塞状态。但是这种机制也会导致数据一致性问题,因为,由于网络原因,协调者发送的abort响应没有及时被参与者接收到,那么参与者在等待超时之后执行了commit操作。这样就和其他接到abort命令并执行回滚的参与者之间存在数据不一致的情况。
无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题。只有一种一致性算法,那就是Paxos,所有其他一致性算法都是Paxos算法的不完整版。
数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
Chubby:面向松散耦合的分布式系统的锁服务 [谷歌原文翻译]
HBase vs Cassandra:我们迁移系统的原因[文章老 但是分布式理论说的还可以]
==================================
由于Java的内容太多了,单独一贴计算机科学精彩帖子收集--JAVA和分布式专栏
Java
http://openjdk.java.net/projects/jdk8/
------------Eclipse----------------------
eclipse颜色插件 color theme
Eclipse自动部署项目到Tomcat的webapps下的有效方法 【重要,一定要看】
Eclipse自动部署项目到Tomcat的webapps下的有效方法 [和上面一样,纯备份]
使用$JAVA_HOME/bin/jmap -dump来触发, Eclipse Memory Analyzer是一个快速并且功能强大的Java heap分析器,能够帮助你查找内存泄漏和减少内存消耗。
Eclipse怎样配置struts2?[成功配置]
在Eclipse中配置Struts2项目(二) [讲了JDK,和Tomcat的配置以及struts虽然是2007年写的不过很好]
-------------JVM-------------------------
jvm内存映像分析 好东西
一个优秀的Java程序员必须了解GC机制 一个优秀的Java程序员必须了解GC机制 原文
1.最基本的建议就是尽早释放无用对象的引用。
2.尽量少用finalize函数。finalize函数是Java提供给程序员一个释放对象或资源的机会。但是,它会加大GC的工作量,因此尽量少采用finalize方式回收资源。
3.注意集合数据类型,包括数组,树,图,链表等数据结构,这些数据结构对GC来说,回收更为复杂。另外,注意一些全局的变量,以及一些静态变量。这些变量往往容易引起悬挂对象(dangling reference),造成内存浪费。
4.当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。使用增量式GC可以缩短Java程序的暂停时间。
Java中三个引用类SoftReference 、 WeakReference 和 PhantomReference的区别
理解StrongReference,SoftReference, WeakReference的区别
StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
WeakReference, 顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收
SoftReference 与 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用
虚引用主要用来跟踪对象被垃圾回收器回收的活动。
理解 Java 的 GC 与 幽灵引用 Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用)
java中的4种reference的差别和使用场景(含理论、代码和执行结果)
GC学习笔记 总结很完整
JVM 垃圾回收算法 【图文非常好】
1.标记—清除算法(Mark-Sweep)
标记—清除算法包括两个阶段:“标记”和“清除”。在标记阶段,确定所有要回收的对象,并做标记。清除阶段紧随标记阶段,将标记阶段确定不可用的对象清除。
2.复制算法(Copying)
复制算法是把内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候,把存活的对象复制到另一块上,然后把这块内存整个清理掉。
3.标记—整理算法(Mark-Compact)
标记—整理算法和标记—清除算法一样,但是标记—整理算法不是把存活对象复制到另一块内存,而是把存活对象往内存的一端移动,然后直接回收边界以外的内存。
4.分代收集(Generational Collection)
分代收集是根据对象的存活时间把内存分为新生代和老年代,根据个代对象的存活特点,每个代采用不同的垃圾回收算法。新生代采用标记—复制算法,老年代采用标记—整理算法。
(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2) Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
(4) 所有新创建的Object 都将会存储在新生代Yong Generation中。如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在Eden Space。
JVM介绍 【非常全面,图文】
浅析Java虚拟机结构与机制 【全面】面向GC的Java编程
典型的对象不再堆上分配的情况有两种:TLAB和栈上分配。
编写内存效率的java代码-面向GC 【阿里沐剑】
GC最喜欢这种小而短命的对象。让对象的生命周期尽可能短,例如在方法体内创建,使其能尽快地在YoungGC中被回收,不会晋升(romote)到年老代(Old Generation)。
小对象的分配,会优先在线程私有的 TLAB 中分配,TLAB中创建的对象,不存在锁甚至是CAS的开销。TLAB占用的空间在Eden Generation。
当对象比较大,TLAB的空间不足以放下,而JVM又认为当前线程占用的TLAB剩余空间还足够时,就会直接在Eden Generation上分配,此时是存在并发竞争的,所以会有CAS的开销,但也还好。
当对象大到Eden Generation放不下时,JVM只能尝试去Old Generation分配,这种情况需要尽可能避免,因为一旦在Old Generation分配,这个对象就只能被Old Generation的GC或是FullGC回收了。
GC算法在扫描存活对象时通常需要从ROOT节点开始,扫描所有存活对象的引用,构建出对象图。
不可变对象对GC的优化,主要体现在Old Generation中。
Hotspot JVM为了提高YoungGC的性能,避免每次YoungGC都扫描Old Generation中的对象引用,采用了卡表(Card Table) 的方式。
在一个非常大的方法体内,对一个较大的对象,将其引用置为null,某种程度上可以帮助GC。大部分情况下,这种行为都没有任何好处。
System.gc()在JVM启动参数中如果允许显式GC,则会触发FullGC。
Never use Thread.yield()。
Never use System.gc()。除非你真的需要回收Native Memory。
由于Native Memory只能通过FullGC(或是CMS GC)回收,所以除非你非常清楚这时真的有必要,否则不要轻易调用System.gc(),且行且珍惜。
另外为了防止某些框架中的System.gc调用(例如NIO框架、Java RMI),建议在启动参数中加上-XX:+DisableExplicitGC来禁用显式GC。
这个参数有个巨大的坑,如果你禁用了System.gc(),那么上面的3种场景下的内存就无法回收,可能造成OOM,如果你使用了CMS GC,那么可以用这个参数替代:-XX:+ExplicitGCInvokesConcurrent。
如果对象很小,那么分配的开销本来就小,对象池只会增加代码复杂度。
如果对象比较大,那么晋升到Old Generation后,对GC的压力就更大了。
从线程安全的角度考虑,通常池都是会被并发访问的,那么你就需要处理好同步的问题,这又是一个大坑,并且同步带来的开销,未必比你重新创建一个对象小。
对于对象池,唯一合适的场景就是当池中的每个对象的创建开销很大时,缓存复用才有意义,例如每次new都会创建一个连接,或是依赖一次RPC。
即使你真的需要实现一个对象池,也请使用成熟的开源框架,例如Apache Commons Pool。
另外,使用JDK的ThreadPoolExecutor作为线程池,不要重复造轮子,除非当你看过AQS的源码后认为你可以写得比Doug Lea更好。
如果可以在方法内声明的局部变量,就不要声明为实例变量。
除非你的对象是单例的或不变的,否则尽可能少地声明static变量。
成为JavaGC专家Part I — 深入浅出Java垃圾回收机制
成为JavaGC专家Part II — 如何监控Java垃圾回收机制
主要有两种情况导致内存泄露:
1、如果Map本省有强引用存在的话,Map中对象即时不被JVM中的任何地方应用到,也不会被回收。
2、如果没有适当的管理,这个Map容器很容易失控,不断的增长。
要避免上面的两种情况,可以在对象不在使用的时候,将它从Map中移除。这就需要容易管理者构造一个清理的函数给对象调用者使用,或者使用一个监听器模式。
然而,这可能不适合某些特定的场景,比如交互式的扩展API。添加这样的函数会使得使用者的API变得更加复杂,增加类之间的耦合度,不好。
一个更简洁当实用的方法是使用一个Map的Key作为ID来标记缓存对象,这时Map不再需要GC来回收对象,而是使用编码逻辑,定期对容器进行检查,对Map进行清理,清除不需要的对象,保持Map容器的容量。
WeakashMap提供一个更优雅的方法解决这个问题。使用WaekHashMap实例化Map。当使用者不再有对象引用的时候,WeakHashMap将自动被移除对应Key值的对象。
正如Java API中对WeakHashMap的描述—-这个容器将不再保护key,不防止对应的key被GC回收。
Java垃圾回收(GC)精华 分代图画的好
JVM详解 Java虚拟机原理与优化[非常好]
深入JVM [非常好]
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
1:建议用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大。
2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。
3:调试的时候设置一些打印参数,如-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log,这样可以从gc.log里看出一些端倪出来。
4:系统停顿的时候可能是GC的问题也可能是程序的问题,多用jmap和jstack查看,或者killall -3 java,然后查看java控制台日志,能看出很多问题。有一次,网站突然很慢,jstack一看,原来是自己写的URLConnection连接太多没有释放,改一下程序就OK了。
5:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。
6:垃圾回收时promotion failed是个很头痛的问题,一般可能是两种原因产生,第一个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要放入救助空间;第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向Full GC,网站停顿时间较长。第一个原因我的最终解决办法是去掉救助空间,设置-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0即可,第二个原因我的解决办法是设置CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接纳来自年轻代的对象。
7:不管怎样,永久代还是会逐渐变满,所以隔三差五重起java服务器是必要的,我每天都自动重起。
8:采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿。
9:因为没有用到救助空间,所以年老代容易满,CMS执行会比较频繁。我改善了一下,还是用救助空间,但是把救助空间加大,这样也不会有promotion failed。
JDK中的bin目录下有很多工具,这些工具可以用来检测虚拟机运行情况以及cpu,内存,线程等的监控,比如jps、jstat、jinfo、jmap、jhat、jstatck等。
-------------Java基础-------------------------
jdb可以调试线上程序类似GDB
JAVA学习笔记 -- Vector, ArrayList, Array
Vector这个类是thread safe的。就是说,多线程同时调用同一个Vector的方法不会造成数据的混乱。而ArrayList不是thread safe。所以,如果是多线程的程序,多使用Vector,这样不需要自己维护concurrency。
数据的增长模式不一样。无论是Vector还是ArrayList,内部都是用一个Array来实现的,这就意味着,一旦数据越来越多超过了原来Array的容量的时候,Vector和ArrayList都需要扩充Array来满足新的数据。Vector每次扩充的时候都增长一倍,就是说新的Array的size是旧的Array的size的2倍。而ArrayList每次扩充,它的Array的size只增加50%.
最后,如果程序对于性能要求很高的话,Vector和ArrayList最好哪个都别用,而使用原始的Array。
asList()这个函数返回的不是一个”完整的“List对象,而是一个视图(View)。这意味着如果我们改变array中的元素,那么list中的元素也会相应的改变。实际上,array和list指向的是同一组数据。
但是,toArray()这个函数又不存在这个问题。toArray()返回的是一个”safe“的数组。意思就是toArray()会将List中的数据通过值传递的方式拷贝到新的数组中,List中的数据和新创建的数组中的数据不存在引用。如果改变list中的元素,不会影响到array中的数据。
很有趣吧,看上去是一个双向的转换,但其实asList()和toArray()在语义上有着很大的差别。
有了内部类事件驱动模式就非常的容易实现,内部类最大的好处就是它能够达到和多重继承一样的效果。
在《Effective Java》一书中第六条,消除陈旧对象时,提到了weakHashMap,即在我们使用短时间内就过期的缓存时最好使用weakHashMap,它包含了一个自动调用的方法expungeStaleEntries,这样就会在值被引用后直接执行这个隐含的方法,将不用的键清除掉。
注意:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象。你只put了没有get过,这个值是永远都存在的。
由于WeakHashMap是在有操作的情况下才会去执行expungeStaleEntries(),将entry中对value的引用释放。
对象序列化为何要定义serialVersionUID的来龙去脉【很好】
探究内存泄露—Part1—编写泄露代码 探究内存泄露—Part2—分析问题
什么是静态(static)?什么是静态方法,静态变量,静态块和静态类?
HashMap和Hashtable的区别 HashMap的工作原理 HashMap和Hashtable的区别
对比Java.nio 和 Java.io
NIO新功能Top 10
让你明白response.sendRedirect()与request.getRequestDispatcher().forward()区别
response.sendRedirect和request.getRequestDispatcher().forward什么时候用哪个
Java抓取网页数据(原网页+Javascript返回数据)
request.getParameterValues与request.getParameter的区别
request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型
request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型
如何取得wap和web用户的真实IP [很好]
java 字节流与字符流的区别 [很好]
ClassNotFoundException和NoClassDefFoundError的区别
Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题)
Servlet激活器和缺省Servlet Servlet激活器
在《Effective Java》这本书中也提到这个原则: float和double只能用来做科学计算或者是工程计算; 在商业计算中我们要用java.math.BigDecimal。
Java的4种代码块 java“块”的研究 javastatic块
在相同的硬件下,如果单个jvm不能完全发挥硬件的性能,通过多个jvm的集群可以,而且会超过php。
http://www.anarres.org/projects/jperf/
一个完美哈希函数(PHF)的java实现,不过没说是否最小的(MPHF)。
对所以key事先已知,key不再变化的静态字典,(M)PHF能节省内存,同时保持或提高查询时间。
抛异常最大的消耗在于构造整个异常栈的过程,如果你的栈很深,特别是用了一些框架的话,这个开销基本是不可忽视的,
最大开销的地方在这里,当你去new一个Exception的时候,会调用父类Throwable的构造函数,Throwable的构造函数中会调用native的fillInStackTrace(),这个方法就会构造整个异常栈了。
要优化这个地方,最简单的方案有两种:
1、去掉异常栈构造
2、去掉异常
---------------------Java线程--------------------------------------------------
Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。
要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中。
与锁相比,Volatile 变量是一种非常简单但同时又非常脆弱的同步机制,它在某些情况下将提供优于锁的性能和伸缩性。
如果严格遵循 volatile 的使用条件 —— 即变量真正独立于其他变量和自己以前的值 —— 在某些情况下可以使用 volatile 代替 synchronized 来简化代码。然而,使用 volatile 的代码往往比使用锁的代码更加容易出错。
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。
原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。
可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。
如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
volatile 变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由(读取-修改-写入)操作序列组成的组合操作,必须以原子方式执行,而 volatile 不能提供必须的原子特性。
实现正确的操作需要使x 的值在操作期间保持不变,而 volatile 变量无法实现这点。(然而,如果只从单个线程写入,那么可以忽略第一个条件。)
volatile的适用场景
模式 #1:状态标志
也许实现 volatile 变量的规范使用仅仅是使用一个布尔状态标志,用于指示发生了一个重要的一次性事件
而如果使用 synchronized 块编写循环要比使用 volatile 状态标志编写麻烦很多。由于 volatile 简化了编码,并且状态标志并不依赖于程序内任何其他状态,因此此处非常适合使用 volatile。
这种类型的状态标记的一个公共特性是:通常只有一种状态转换;shutdownRequested 标志从false 转换为true,然后程序停止。
【Java线程】锁机制:synchronized、Lock、Condition
---------------------Java json---------------------------------------
Json:JSON net.sf.json
--------------------Java泛型相关----------------------------
java 泛型详解 [很全面]
Java使用泛型编程提取类名上T类型
JAVA 泛型 - Class<T>
java泛型T.class的获取
-----------------------JTA-------------------------------------------
-----------------------JNDI-----------------------------------------------
Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API。命名服务即将名称与对象相关联,以便能通过相应名称访问这些对象。而目录服务即其对象具有属性及名称的命名服务。
命名或目录服务允许您集中管理共享信息的存储,这在网络应用程序中很重要,因为它可以使这类应用程序更加一致和易于管理。例如,可以将打印机配置存储在目录服务中,这样所有与打印机相关的应用程序都能够使用它。
-------------------Apache Commons-----------------------------------------------
Apache Common Pool包括很多已经实现的Pool,常用的Pool有GenericObjectPool,GenericKeyedObjectPool。
Commons-Pool首先定义了池管理方面的API,并考虑了多线程,多种数据结构,内容不足等情况。
其次它为我们提供一个同时管理多个池的解决方案。
留给使用者,主要就是PoolableObjectFactory与KeyedPoolableObjectFactory。
只要使用者将对象的生成,销毁,验证,激活与钝化做好,做到完善,没有歧义(比如什么样的状态算是激活,什么是钝化后的状态),那剩下的就可以放心的交给Commons-Pool来管理你的池了。
最好的一个例子也算是官方例子吧,就是Commons-DBCP(数据库连接池)。
采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,从而提高整体的性能。然而池化处理本身也要付出代价,因此,并非任何情况下都适合采用对象池化。
Dr. Cliff Click在JavaOne 2003上发表的《Performance Myths Exposed》中,给出了一组其它条件都相同时,使用与不使用对象池化技术的实际性能的比较结果。他的实测结果表明:
对于类似Point这样的轻量级对象,进行池化处理后,性能反而下降,因此不宜池化;
对于类似Hashtable这样的中量级对象,进行池化处理后,性能基本不变,一般不必池化(池化会使代码变复杂,增大维护的难度);
对于类似JPanel这样的重量级对象,进行池化处理后,性能有所上升,可以考虑池化。
根据使用方法的不同,实际的情况可能与这一测量结果略有出入。在配置较高的机器和技术较强的虚拟机上,不宜池化的对象的范围可能会更大。不过,对于像网络和数据库连接这类重量级的对象来说,目前还是有池化的必要。
基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术,以保持代码的简明,而使用更好的硬件和更棒的虚拟机来提高性能为佳。
------------------------------------------------------------------
JMS
JMS是一系列的接口及相关语义的集合,通过这些接口和和其中的方法,JMS客户端如何去访问消息系统,完成创建、发送、接收和读取企业消息系统中消息。
-------------------------------------------------------------------
JMX
(对 JVM 和系统的监测,Sun 公司也在其 Java SE 5 版本中,正式提出了 Java 管理扩展(Java Management Extensions,JMX)用来管理检测 Java 程序(同时 JMX 也在 J2EE 1.4 中被发布))
JMX是一种JAVA的正式规范,它主要目的是让程序且有被管理的功能
------------------------------------------------------------------
JPA
-----------------------------------------------------------------
Netty
本质:JBoss做的一个Jar包
目的:快速开发高性能、高可靠性的网络服务器和客户端程序
优点:提供异步的、事件驱动的网络应用程序框架和工具,统一的API,适用于不同的协议(阻塞和非阻塞)
通俗的说:一个好使的处理Socket的东东
如果没有Netty?
远古:java.net + java.io
近代:java.nio
其他:Mina,Grizzly
1、都是Trustin Lee的作品,Netty更晚;
2、Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;
3、Netty的文档更清晰,很多Mina的特性在Netty里都有;
4、Netty更新周期更短,新版本的发布比较快;
5、它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
6、Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;
7、Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。
-----------------------------------------------------------------
OSGI
-------------------------------------------------------------------
Disruptor
Java并发框架剖析--Disruptor_51CTO.COM
剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充
------------------------------------------------------------------
dom4j
----------------------听课笔记----------------------------------
方立勋Java Web听课笔记--Request--Response对象
方立勋Java Web听课笔记--Cookie---Session
方立勋Java Web听课笔记--JDBC对MYSQL的应用preparedStatement和Statement的区别
方立勋Java Web听课笔记JDBC--分页、三种连接池DBCP/C3P0/TOMCAT自带的连接池
方立勋Java Web听课笔记JDBC续-可滚动的结果集-批处理-事务-JDBC执行存储过程
方立勋Java Web听课笔记十四日知识点回顾-自动获取主键-resultSet结果集的滚动
方立勋Java Web听课笔记-DBUtils-QueryRunner-ReslutSetHandler-JDBC多表操作
方立勋Java Web听课笔记-文件上传和下载-ServletFileUpload-解决上传中文乱码问题
方立勋Java Web听课笔记-ServletFilter过滤器-FilterChain过滤器链Filter生命周期
方立勋Java Web听课笔记-映射Filter-Decorator(装饰器模式)-利用Filter对数据压缩(GZIP
-----------------Java EE容器---------------------------------
四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较
----------------apache commons包简介----------------------------
--------------------------------------------
-------------------------性能分析----------------------------------
Yourkit Eclipse 3.5 plugin installation
Yourkit 使用说明
-----------------------------------------------------
protostuff
protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式。
http://code.google.com/p/protostuff/
Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发
在Android 开发中使用Protobuf的实践和经验分享
---------------------------------------------------------
dyuproject
dyuproject 包含一个基于Servlet的REST框架、OpenID 2.0 的RP实现、oauth 1.0a consumer and service provider, json-ioc
---------------------------------------------------------
MessagePack
是一个基于二进制高效的对象序列化Library用于跨语言通信。MessagePack主要用于结构化数据的缓存和存储:
1.存在Memcache中,因为它比json小,可以省下一些内存来,速度也比json快一些.2.存在可以持久化的Key-val存储中。
新型序列化类库MessagePack,比JSON更快、更小的格式
--------------------------------------------------------
jedis
Jedis 2.1在线文档API [不错]
--------------------------------------------------------
Maven
Maven实战(三)Eclipse构建Maven项目 [很好]
Maven3实战笔记09Maven的私服-Nexus常用功能
Maven3实战笔记13Maven Profile定制化构建
Maven3 安装使用(三)--搭建公司局域网maven服务器
---------------------------------------------------------
Struts
---------------------------------------------------------
Hibernate
Spring Framework Tutorial – Hello World
---------------------------------------------------------
Spring
Spring中ApplicationContext的三种不同实现
Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
--------------------------------------------------------
iBatis/MyBatits
===========函数式编程======================
Haskell
也许,照耀大地的永远是在众恒星中普普通通的太阳,人们永远不会知道在宇宙的某个角落里曾经诞生过一颗绝美无比的小星星。
--------------------------------------------------------
Scheme
=================================
Hadoop
Hadoop Streaming 编程 [董西成]
Hadoop中国用户组(HCUG)[北京]2013第1次[总第1次]线下交流活动 [视频]
hdfs: 一个分布式文件系统(一) [易懂]
hdfs: 数据流(二) [易懂]
从wordcount 开始 mapreduce (C++\hadoop streaming模式) [易懂]
更快、更强——解析Hadoop新一代MapReduce框架Yarn
彻底了解mapreduce核心Shuffle--解惑各种mapreduce问题
------------------------------------------------
Hbase
================================
Zookeeper
Distributed Coordination with Zookeeper
ZooKeeper-李建斌[很好很全]
zookeeper学习记录[很好]
分布式服务框架 Zookeeper -- 管理分布式环境中的数据
ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念
架构设计:远程调用服务架构设计及zookeeper技术详解(上篇)
架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
Google利器之Chubby [非常好懂]
大数据处理的基础环境(一)——zookeeper集群环境搭建
--------------Cassandra-------------------------------
分布式 Key-Value 存储系统:Cassandra 入门
==================================
Storm
Storm与Spark、Hadoop相比是否有优势?
Storm与Spark、Hadoop这三种框架,各有各的优点,每个框架都有自己的最佳应用场景。
所以,在不同的应用场景下,应该选择不同的框架。
Storm是最佳的流式计算框架,Storm由Java和Clojure写成,Storm的优点是全内存计算,所以它的定位是分布式实时计算系统,按照Storm作者的说法,Storm对于实时计算的意义类似于Hadoop对于批处理的意义。
Storm的适用场景:
1)流数据处理
Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去。
2)分布式RPC。由于Storm的处理组件是分布式的,而且处理延迟极低,所以可以作为一个通用的分布式RPC框架来使用。
SparkSpark是一个基于内存计算的开源集群计算系统,目的是更快速的进行数据分析。Spark由加州伯克利大学AMP实验室Matei为主的小团队使用Scala开发开发,类似于Hadoop MapReduce的通用并行计算框架,Spark基于Map Reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点,但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的Map Reduce的算法。
Spark的适用场景:
1)多次操作特定数据集的应用场合
Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小。
2)粗粒度更新状态的应用
由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如Web服务的存储或者是增量的Web爬虫和索引。就是对于那种增量修改的应用模型不适合。
总的来说Spark的适用面比较广泛且比较通用。
Hadoop是实现了MapReduce的思想,将数据切片计算来处理大量的离线数据数据。Hadoop处理的数据必须是已经存放在HDFS上或者类似HBase的数据库中,所以Hadoop实现的时候是通过移动计算到这些存放数据的机器上来提高效率。
Hadoop的适用场景:
1)海量数据的离线分析处理
2)大规模Web信息搜索
3)数据密集型并行计算
=================================
Kafka消息队列
Big Data Architecture Kafka FlumeNG Storm HBase 张鑫 [很好]
分布式消息队列(Message Queue)系统:kafka
flume-ng+Kafka+Storm+HDFS 实时系统搭建
==================================
RabbitMQ
==================================
ZeroMQ
==================================
Thrift
==================================
Scala
==================================
scribe
==================================
Android
=================================
Swift语言
=================================
.NET
================================Ruby on Rails
================================
其他服务器开发
网站加速--服务器编写篇(上)
网站加速--服务器编写篇 (下)
网站加速--动态应用篇 (上)
网站加速--动态应用篇 (下)
lighttpd1.4.18代码分析(一)--watcher,worker模型
请注意Tokyo Tyrant (ttserver)在大数据量下的不稳定
Best Practices for Speeding Up Your Web Site
================================
监控
使用Cacti监控你的网络(一)- Cacti概述及工作流程
===============================
网络安全
RSA性能是非常低的,原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手时使用非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密。
我的理解
1.客户端发起请求,服务器给公钥A+;
2.客户端拿到公钥A+,用A加密随机数B-发给服务器;
3.服务器用私钥A-解密随机数B-,得到B-,给客户端回馈;
4.客户端用B-加密信息发给服务器;
5.服务器用B-解密信息。
HTTPS原理 【写的很好】
客户端发出安全会话请求(会同时将自己支持的一套加密规则发送给服务器)
服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了服务器地址,加密公钥,以及证书的颁发机构等信息。
客户端获得服务器CA证书之后浏览器要做以下工作:
用已知的CA列表来验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示,让用户选择自担风险。
如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机对称密钥,并用证书中提供的公钥加密。
使用约定好的HASH算法计算握手消息,并使用生成的随机对称密钥对消息进行加密,最后将之前生成的所有信息发送给服务器。
服务器接收客户端发来的数据之后要做以下的操作:
使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
使用对称密钥加密一段握手消息,发送给客户端。
客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前客户端生成的随机对称密钥并利用对称加密算法进行加密。
证书的合法性是通过证书的颁发机构权威性保证的。这引出了一个问题:怎么确保是合法的颁发机构呢?
系统有配置所谓的权威机构,就是CA root,这是安装系统时就配置在电脑上。(所以不要随便安装盗版操作系统,也不要随便安装不受信任的证书)
权威机构有级联性,即,如果证书是被机构B认证的,而机构B的证书被CA root认证,则证书也是受信的。这就是所谓的证书链(certification chain)
证书的常见格式
PKCS标准体系
X509为最常见的实现
证书最常见的后者名:cer, p12, crt, p7b
HTTPS一般使用的加密与HASH算法
对称加密算法:AES,RC4,3DES。速度快,但需要双方交换或者保存密钥,风险大。
非对称加密算法:RSA,DSA/DSS。不需要双方交换或者保存密钥,但是速度奇慢。
HASH算法:MD5,SHA1,SHA256。
一般来说服务器使用RSA非对称加密算法来生成公钥和私钥(CA证书)。
但是RSA性能是非常低的,原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手时使用RSA非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密。
HTTPS其实是两个过程来的
客户端通过CA证书认证服务器是否合法
双方交换对称密钥的过程(由客户端发起,具体是前面提到的5个步骤)
在每一个步骤,都有可能被伪造和欺骗。
第一个过程可以伪造证书来欺骗,所以强烈建议只安装信任机构颁发的证书(浏览器不会提醒风险的那种)。
比如12306要求安装它自己制造的证书,如果安装了,12306就能伪装google,不装12306,他就伪装不了。所以是有风险的。
第二个过程如果服务端私钥泄漏了,那么也交换私钥的过程虽然是用服务器公钥加密,也相当于明文传输了,这时候证书就可能被伪造。随后的通信过程当然也无安全可言。
此时,CA需要更换私钥和公钥,并申明所有下级CA和使用者的证书过期(revocation list)。随后,把所有过期证书重新用新的私钥签名。
在第二个过程中,很容易出错的一个步骤是步骤三:
客户端获得服务器CA证书之后浏览器要做以下工作:
1. 用已知的CA列表来验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示,让用户选择自担风险。
2. 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机对称密钥,并用证书中提供的公钥加密。
3. 使用约定好的HASH算法计算握手消息,并使用生成的随机对称密钥对消息进行加密,最后将之前生成的所有信息发送给服务器。
SSL证书可以向CA机构通过付费的方式申请,也可以自己制作。
证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。
我们可以这样理解,根CA机构就是一个公司,根证书就是他的身份凭证,每个公司由不同的部门来颁发不同用途的证书,这些不同的部门就是中级CA机构,这些中级CA机构使用中级证书作为自己的身份凭证,
其中有一个部门是专门颁发SSL证书,当把根证书,中级证书,以及最后申请的SSL证书连在一起就形成了证书链,也称为证书路径。
在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信。
根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。操作系统在安装过程中会默认安装一些受信任的CA机构的根证书,可以在“运行”里面运行“certmgr.msc”启动证书管理器
===============================
OAuth
OAuth 2.0系列教程(十) 资源拥有者密钥证书授权请求和响应
================================
前端开发
http://www.igvita.com/ [老外个人站点技术和牛]
浏览器的工作原理:现代网络浏览器幕后揭秘 - HTML5 Rocks
这两年业界说的前后端分离,是限于偏展示类的系统(用A代替),而不是应用、管控类Web项目(用B代替),在B类项目里,前后端是天然分离的,对此,除了少部分后端开发人员,基本所有人的认识都是一致的。
讨论A类项目的前后端分离。
这个问题的核心在什么地方呢,在于模板的与数据结合的位置,以及,模板的控制权在谁手里。
经过这两年的讨论,基本上我们可以达成的共识就是:模板应当由前端人员去控制,
主要原因有两方面:- 性能优化(尤其是外部资源的管理与发布,请求合并等等)- 协作的顺畅性(已形成模板的界面片段的返工等问题)那么,模板到底应该在什么地方跟数据结合?
这个问题就比较折腾了,有部分人尝试像B类项目那样,使用js模板,然后在浏览器端执行,这是存在一些问题的,比如说seo不友好,首屏性能不够,尤其对于首页DOM量很大的电商类网站,差距很明显。
所以我们还是得把主要的模板放在服务端来执行。
在这个过程中,阿里作了一些尝试,那就是引入Node层,在这一层把模板与数据进行合成,然后浏览器拿到的就是生成好的HTML了,但也不是所有HTML都是这么生成好的,还是会有一些内容等到了浏览器之后,再用js去加载和生成。
所以这一定会是一个混合方案,同一个系统中存在两种模板,一种在服务端执行,一种在浏览器中执行,互为补充。
至于说这个方案中,是否中间层一定要是node,我觉得无所谓,只要是能正常做web项目的东西都可以,这个还是要看所在企业的技术积累方向,
当然node做这块是有一些优势的,比如对前端人员的语言友好性,前后端模板的通用性等等,但这些都是细节,重点还是整体方案和流程。
我们输入的是AJAX请求,输出的是JSON数据,市面上有这样的技术来实现这个功能吗?答案是REST。
页面的缓存状态是由header决定的,header的参数有四种:
一、Cache-Control:
1、max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短。当浏览器向服务器发送请求后,在max-age这段时间里浏览器就不会再向服务器发送请求了。
2、s-maxage(单位为s)同max-age,只用于共享缓存(比如CDN缓存)。
比如,当s-maxage=60时,在这60秒中,即使更新了CDN的内容,浏览器也不会进行请求。也就是说max-age用于普通缓存,而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖掉max-age和Expires header。
3、public 指定响应会被缓存,并且在多用户间共享。也就是下图的意思。如果没有指定public还是private,则默认为public。
4、private 响应只作为私有的缓存(见下图),不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。
5、no-cache 指定不缓存响应,表明资源不进行缓存
但是设置了no-cache之后并不代表浏览器不缓存,而是在缓存前要向服务器确认资源是否被更改。因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。
6、no-store 绝对禁止缓存,一看就知道如果用了这个命令当然就是不会进行缓存啦~每次请求资源都要从服务器重新获取。
7、must-revalidate指定如果页面是过期的,则去服务器进行获取。这个指令并不常用,就不做过多的讨论了。
二、Expires
缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。也就是说,Expires=max-age + 请求时间,需要和Last-modified结合使用。
但在上面我们提到过,cache-control的优先级更高。 Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
三、Last-modified
服务器端文件的最后修改时间,需要和cache-control共同使用,是检查服务器端资源是否更新的一种方式。
当浏览器再次进行请求时,会向服务器传送If-Modified-Since报头,询问Last-Modified时间点之后资源是否被修改过。
如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。
四、ETag
根据实体内容生成一段hash字符串,标识资源的状态,由服务端产生。浏览器会将这串字符串传回服务器,验证资源是否已经修改
================================
协程
风格之争:Coroutine模型 vs 非阻塞/异步IO(callback) 协程
Coroutines in C
在C语言中实现coroutine
-----------------------------------------
SEDA架构
SEDA: An Architecture for Highly Concurrent Server Applications
---------------------------------------
Rest 面向资源的架构
---------------------------------------
SOA
-------------------------------------
架构
===============================
视频
HTTP Live Streaming (HLS) 不错的视频直播技术
M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。
===============================
代码阅读工具
=================================
编译原理
理解Continuation和CPS(Continuation Passing Style)
=================================
计算机网络
阿里为什要推出alidns? 有哪些好用的dns? 很好的讲了架构
=================================
编码解码
=================================
HTTP协议
=================================
代码分析
linux环境下 C++性能测试工具 gprof + kprof + gprof2dot
http://code.google.com/p/gperftools/
Google performance Tools (gperftools) 使用心得
使用 cloc 统计代码行数 [cloc统计代码非常好]
sublime_text2 可以画图
Graphviz+doxygen 对象调用图
=================================
Oracle
=================================
Sqlserver
======================
微信开发
=================================
goagent软件使用:
http://tieba.baidu.com/p/2276442741
==================================
PowerDesigner
PowerDesigner逆向获取数据库字典文件
PowerDesigner连接MySQL,建立逆向工程图解
powerdesigner连接mysql,并导出其数据模型的方法
===============================
Notepad++
代码格式化插件:UniversalIndentGUI
===============================
SVN
svn的merge使用例子 [很好]
Reviewboard+StrictReviewScript使用方法图解
SVN - 主干/分支 [很好]
================================
Git
http://pcottle.github.io/learnGitBranching/?demo
================================
综合
================================
好书
《Self-Service Linux》
http://book.douban.com/subject/2666819/
机械工业出版社:计算机科学丛书
电子工业出版社:国外计算机科学教材系列
清华大学出版社:世界著名计算机教材精选
高等教育出版社:国外优秀信息科学与技术系列教学用书
中国电力出版社:国外经典计算机科学教材