├── .swp ├── README.md ├── book ├── Compiled │ ├── 现代编译原理-c语言描述(虎书).pdf │ └── 编程语言实现模式.pdf ├── Data-structure │ ├── Data Structure For Game Programers - Ron Penton.pdf │ └── [数据结构(C语言版)].严蔚敏_吴伟民.扫描版_有目录.pdf ├── Language │ ├── C Primer Plus 第6版 中文版.pdf │ ├── C Primer Plus-英文版.pdf │ ├── OReilly.Programming.Rust.1491927283.pdf │ ├── Rust 程序设计语言(第二版)18.01.pdf │ ├── a byte of python.pdf │ └── language.md ├── system │ └── system.md └── thinking_model │ └── out_every.md ├── books ├── Cognitive-Psychology-and-Its-Enlightenment.md ├── Knowledge.md ├── jls7.md ├── top-performance │ ├── cache.md │ ├── cpu.md │ ├── disk.md │ ├── file-system.md │ ├── memory.md │ └── net.md ├── tport.md ├── 亿级流量架构核心技术.md └── 冰鉴.md ├── code-part ├── ExceptionUtils..java ├── InstallCert.java ├── RoundMode ├── code-part-tools ├── facebook.html ├── html.md ├── img │ ├── aqs-node.png │ ├── aqs2-2.png │ ├── concurrent-ipml.png │ ├── countdown-latch.png │ └── image.md ├── jdk │ ├── AbstractQueuedSynchronizer.md │ └── CompareAndSet.md ├── mybatis-excute-detail └── parttern.lua ├── command ├── linux-shell.md ├── linux │ └── network │ │ └── tools-for-network ├── mongo.md └── mysql ├── common ├── Language │ ├── c.md │ ├── css.md │ └── rust.md ├── Sequence-Diagram.md ├── computer-model.md ├── data-structure.md ├── draw.md ├── english │ ├── algorithrms.emacs │ ├── algorithrms.emacs~ │ ├── book │ │ └── books.md │ ├── english.md │ ├── sentence.md │ ├── word.md │ ├── 语法.md │ └── 音标.md ├── git.md ├── img │ ├── add.png │ ├── branch.png │ ├── commit.png │ ├── error.png │ ├── git-river.png │ ├── git-workspace.png │ ├── head.png │ ├── merge.png │ ├── readme.md │ ├── rebase.png │ ├── reset.png │ ├── tcpip-osi.png │ ├── tcpip-tcpip.png │ └── uml_class_struct.jpg ├── oauth.md ├── postgresql.md ├── secret-encryption.md └── uml.md ├── config-files ├── nginx.conf ├── pom.xml ├── server.xml └── web.xml ├── directory-section ├── Test-Web-Info.txt ├── cache └── litle-cache-about ├── distributed ├── data │ └── olap.md ├── distributed.md ├── img │ ├── paxos.png │ ├── raft10.png │ ├── raft7.png │ ├── raft8.png │ └── raft9.png ├── middleware │ └── kafka-DelayOperation.md ├── paxos.md ├── raft.md ├── redis-check-problem.emacs └── redis-check-problem.emacs~ ├── githup └── stars.md ├── idea ├── idea.md ├── java-code ├── language ├── project ├── summarized ├── think.emacs ├── think.emacs~ ├── thinking │ └── problems.md ├── truth.md ├── webp-image-io-for-java.txt ├── word_idea.md └── 每日三省吾身 ├── java ├── Design-pattern.md ├── Elasticsearch.md ├── Executor.md ├── Lambda.md ├── Reactor.md ├── cache │ ├── cache-tips.md │ └── cache-type.md ├── es.md ├── guava.md ├── img │ ├── design-patterns.jpg │ ├── java-exe-sort.png │ ├── java-happens-before.png │ ├── java-img.md │ ├── java-memory-mode-1.png │ ├── jvm │ │ ├── jvm-1.jpg │ │ ├── jvm-2.png │ │ └── jvm-pic.md │ ├── peactor.png │ └── proactor.png ├── java-dev-standard.emacs ├── java-dev-standard.emacs~ ├── java-log-log4j.md ├── java-memory-model.md ├── java-performance-tuning.md ├── java-quartz.md ├── jdk │ └── comand.md ├── jvm │ ├── classloader.md │ ├── g1.md │ ├── gc-algorithm.md │ ├── gc.md │ ├── heap.md │ ├── java-JIT.md │ ├── jvm-optimization.md │ ├── jvm.md │ ├── thread&synchronize.md │ └── 原生内存.md ├── netty │ └── netty.md ├── official-specification.md ├── open-project │ └── apache.md ├── pattern │ ├── Abstract-Factory.md │ ├── Factory-Method-Pattern.md │ └── Simple-Factory-Pattern.md ├── spring.md ├── test │ └── TestPerformance.java ├── thread.md ├── threadpool.md ├── tomcat.md ├── tools │ ├── 2.txt │ ├── eclipse-mat.md │ ├── jca457.jar │ ├── jdk&jre-bin-tools.md │ ├── jmc.md │ ├── jstack-find-top-cpu.md │ ├── jstat.md │ └── jvm-command.md ├── vo、po、entity.md └── zooKeeper.md ├── life ├── 20181013-dgjj.md ├── Go.md ├── Reflection.md ├── img │ ├── 20ee9836356ed93476f504feb962e72a_r.jpg │ ├── 30.jpg │ └── readme.md ├── in_out.md ├── lis.md ├── movie.md ├── photography.md ├── readme.md ├── rock.md ├── symphony.md ├── travel.md ├── 如何建立自己的知识体系.md └── 百年宪政.md ├── links ├── cache └── spider-for-java ├── linux ├── #redis-store.emacs# ├── db.SQL ├── field.md ├── imgs │ ├── img.md │ ├── l1.jpg │ ├── l2.jpg │ ├── l3.jpg │ └── l4.jpg ├── install-mysql-error.md ├── io.md ├── performance-field.md ├── redis-store.emacs ├── shell │ ├── awk.md │ ├── cal.awk │ ├── log.txt │ ├── pets.txt │ ├── readme.md │ ├── score.txt │ ├── sed.md │ ├── shell.md │ └── webkit_single_backup.sh ├── some_commands.md ├── sqlite-redis-rdb.emacs ├── tools-performance.md └── traces.svg ├── pr └── little-plan.md ├── project ├── task-design.md ├── task.md ├── temp-idea.md └── week │ └── 0326.md ├── protocol ├── git-command-detail.md ├── git.md ├── https.md ├── img │ ├── img.md │ ├── ssl.png │ ├── tls-keys-create.svg │ └── tls-ssl.svg └── ssl&tls.md ├── read-action ├── 201802.md ├── 201803.md ├── 201804.md ├── 201805.md ├── 201806.md ├── 201807.md └── read-action.md ├── schedule.md ├── service ├── emacs-test ├── lopscoop-api.eamcs ├── lopscoop-service.md └── service-architecture.md ├── test ├── web-test.md └── wrk2 │ ├── wrk-around-index-api.lua │ ├── wrk-around-more-request.lua │ ├── wrk-around-strategy-api.lua │ ├── wrk-around-upload-pic-api.lua │ └── wrk-standand-website.lua ├── thinking └── Thinkingmodel.md ├── tools ├── chrome.md └── tool.md ├── web-front-end ├── YSlow.md └── readme.md └── work └── 2018 ├── 11 ├── 1120.md └── 1120.md~ └── 08 └── 30_week.md /.swp: -------------------------------------------------------------------------------- 1 | b0VIM 8.0),roothost.localdomain U3210#"! U -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 没有多少干货,只是想整理下技术体系,一个庞大的图书馆从一开始就要设计好,才能够不断的积累,形成自己的体系,不停调整 2 | 3 | 其实每一个都在值得需要一大篇文字来解读,知道的太多,反而会恐惧。 4 | 5 | 找好路线,定下目标,然后action 6 | 7 | 8 | http://lopscoop-image.oss-ap-southeast-1.aliyuncs.com/temp/iflytek_v1.0.9_20200116.apk 9 | -------------------------------------------------------------------------------- /book/Compiled/现代编译原理-c语言描述(虎书).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Compiled/现代编译原理-c语言描述(虎书).pdf -------------------------------------------------------------------------------- /book/Compiled/编程语言实现模式.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Compiled/编程语言实现模式.pdf -------------------------------------------------------------------------------- /book/Data-structure/Data Structure For Game Programers - Ron Penton.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Data-structure/Data Structure For Game Programers - Ron Penton.pdf -------------------------------------------------------------------------------- /book/Data-structure/[数据结构(C语言版)].严蔚敏_吴伟民.扫描版_有目录.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Data-structure/[数据结构(C语言版)].严蔚敏_吴伟民.扫描版_有目录.pdf -------------------------------------------------------------------------------- /book/Language/C Primer Plus 第6版 中文版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Language/C Primer Plus 第6版 中文版.pdf -------------------------------------------------------------------------------- /book/Language/C Primer Plus-英文版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Language/C Primer Plus-英文版.pdf -------------------------------------------------------------------------------- /book/Language/OReilly.Programming.Rust.1491927283.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Language/OReilly.Programming.Rust.1491927283.pdf -------------------------------------------------------------------------------- /book/Language/Rust 程序设计语言(第二版)18.01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Language/Rust 程序设计语言(第二版)18.01.pdf -------------------------------------------------------------------------------- /book/Language/a byte of python.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/book/Language/a byte of python.pdf -------------------------------------------------------------------------------- /book/Language/language.md: -------------------------------------------------------------------------------- 1 | # language 2 | -------------------------------------------------------------------------------- /book/system/system.md: -------------------------------------------------------------------------------- 1 | # system 2 | -------------------------------------------------------------------------------- /book/thinking_model/out_every.md: -------------------------------------------------------------------------------- 1 | # out 疯狂输出 2 | 有些说的很有道理的句子,但是当时没有理解透 3 | ## -------------------------------------------------------------------------------- /books/Cognitive-Psychology-and-Its-Enlightenment.md: -------------------------------------------------------------------------------- 1 | # 认知心理学及其启示 2 | 3 | ## 知识 4 | 为什么你最近看过的文章、知识点,过了几天还是记不住呢? 5 | -------------------------------------------------------------------------------- /books/Knowledge.md: -------------------------------------------------------------------------------- 1 | # Knowledge 2 | 3 | ## 分类 4 | 按照更新时间 5 | * 语言类 、科学类 6 | * 7 | * 8 | -------------------------------------------------------------------------------- /books/jls7.md: -------------------------------------------------------------------------------- 1 | # The Java ® Language Specification Java SE 7 Edition 2 | 3 | ## Introduction 4 | 5 | ## Grammars 6 | 7 | ## Lexical Structure 8 | 9 | ## Types, Values, and Variables 10 | 11 | ## Conversions and Promotions 12 | 13 | ## Names 14 | 15 | ## Packages 16 | 17 | ## Classes 18 | 19 | ## Interfaces 20 | 21 | ## Arrays 22 | 23 | ## Exceptions 24 | 25 | ## Execution 26 | 27 | ## Binary Compatibility 28 | 29 | ## Blocks and Statements 30 | 31 | ## Expressions 32 | 33 | ## Definite Assignment 34 | 35 | ## Threads and Locks 36 | 37 | ## Syntax 38 | -------------------------------------------------------------------------------- /books/top-performance/cache.md: -------------------------------------------------------------------------------- 1 | # cache 2 | -------------------------------------------------------------------------------- /books/top-performance/cpu.md: -------------------------------------------------------------------------------- 1 | # CPU 2 | 3 | ## 模型 4 | ### cpu架构 5 | ### cpu内存缓存 6 | ### cpu运行队列 7 | 8 | ## 概念 9 | ### 时钟频率 10 | ### 指令 11 | ### 指令流水线 12 | ### 指令宽度 13 | ### cpi ipc 14 | ### 使用率 15 | ### 用户时间 内核时间 16 | ### 饱和度 17 | ### 抢占 18 | ### 优先级反转 19 | ### 多进程 多线程 20 | ### 字长 21 | ### 编译器优化 22 | 23 | ## 架构 24 | ### 硬件 25 | ### 软件 26 | 27 | ## 方法 28 | ### 工具法 29 | ### use方法 30 | ### 负载特征分析 31 | ### 剖析 32 | ### 周期分析 33 | ### 性能监控 34 | ### 静态性能分析 35 | ### 优先级调优 36 | ### 资源控制 37 | ### cpu绑定 38 | ### 微型基准测试 39 | ### 扩展 40 | 41 | ## 分析 42 | ### uptime 43 | ### vmstat 44 | ### mpstat 45 | ### sar 46 | ### ps 47 | ### top 48 | ### prstat 49 | ### pidstat 50 | ### time和ptime 51 | ### dtrace 52 | ### systemMap 53 | ### perf 54 | ### cpustat 55 | ### 其他工具 56 | ### 可视化 57 | 58 | ## 实验 59 | ###  ad hoc 60 | ### sysbench 61 | 62 | ## 调优 63 | ### 编译器选项 64 | ### 调度优先级和调度类 65 | ### 调度器选项 66 | ### 进程绑定 67 | ### 独占cpu组 68 | ### 资源控制 69 | ### 处理器选项 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /books/top-performance/disk.md: -------------------------------------------------------------------------------- 1 | # disk 2 | -------------------------------------------------------------------------------- /books/top-performance/file-system.md: -------------------------------------------------------------------------------- 1 | # file-system 2 | -------------------------------------------------------------------------------- /books/top-performance/memory.md: -------------------------------------------------------------------------------- 1 | # Memory 2 | -------------------------------------------------------------------------------- /books/top-performance/net.md: -------------------------------------------------------------------------------- 1 | # net 2 | -------------------------------------------------------------------------------- /books/tport.md: -------------------------------------------------------------------------------- 1 | # 超越智商 2 | > 如果把人比较成骑车,智商好比是骑车的行驶速度, 3 | > 而理性决定了驾驶的方向,速度与方向孰轻孰重? 4 | -------------------------------------------------------------------------------- /books/亿级流量架构核心技术.md: -------------------------------------------------------------------------------- 1 | ## 目录 2 | 3 | ## 交易型系统的一些设计原则 4 | 5 | ### 高并发原则 6 | * 无状态 7 | * 拆分 8 | * 服务化 9 | * 消息队列 10 | * 数据异构 11 | * 缓存银弹 12 | * 并发化 13 | 14 | ### 高可用原则 15 | * 降级 16 | * 限流 17 | * 切流量 18 | * 可回滚 19 | 20 | ### 业务设计原则 21 | * 防重设计 22 | * 幂等设计 23 | * 流程可定义 24 | * 状态和状态机 25 | * 后台系统操作可反馈 26 | * 后台系统审批化 27 | * 文档和注释 28 | * 备份 29 | 30 | # 高可用 31 | 32 | ### 负载均衡和反向代理 33 | * upstream 配置 34 | * 负载均衡算法 35 | * 失败重试 36 | * 健康检查 37 | 心跳: tcp、http 38 | * 其他配置 39 | 域名上游服务器、备份上游服务器、不可用上游服务器 40 | * 长链接 41 | * http反向代理 42 | * http 动态负载均衡 43 | consul+consul+template 、consul+openresty 44 | * nginx 四层负载均衡 45 | 静态负载均衡、动态负载均衡 46 | ### 隔离术 47 | * 线程隔离 48 | * 进程隔离 49 | * 集群隔离 50 | * 机房隔离 51 | * 读写隔离 52 | * 动静隔离 53 | * 爬虫隔离 54 | * 热点隔离 55 | * 资源隔离 56 | * 使用hystrix隔离 57 | hystrix简介、隔离事例 58 | * 基于servlet3实现请求隔离 59 | 1 请求解析和业务处理线程池分离 60 | 2 业务线程池隔离 61 | 3 业务线程池监控/运维/降级 62 | 4 如何使用servlet3异步化 63 | 5 一些servlet3 异步化压测数据 64 | 65 | ## 限流详解 66 | 67 | ### 限流算法 68 | * 令牌桶算法 69 | * 漏桶算法 70 | ### 应用级限流 71 | * 限流总并发、链接、请求数 72 | * 限流总资源数 73 | * 限流某个接口的总并发、请求数 74 | * 限流某个接口的时间窗口请求数 75 | * 平滑限流某个接口的请求数 76 | 77 | ### 分布式限流 78 | * redis+lua 79 | * nginx+lua 80 | ### 接入层限流 81 | * ngx_http_limit_conn_module 82 | * ngx_http_limit_req_module 83 | * lua_resty-limit-traffic 84 | 85 | ### 节流 86 | * throttleFirst/throttleLast 87 | * throttleWithTimeout 88 | 89 | ## 降级特技 90 | * 降级预案 91 | * 自动开关降级 92 | 1. 超时降级 93 | 2. 统计失败次数降级 94 | 3. 故障降级 95 | 4. 限流降级 96 | * 人工开关降级 97 | * 读服务降级 98 | * 写服务降级 99 | * 多级降级 100 | * 配置中心 101 | 1. 应用层api封装 102 | 2. 使用配置文件实现开关配置 103 | 3. 使用配置中心实现开关配置 104 | * 使用hystrix 实现降级 105 | * 使用hystrix 实现熔断 106 | 1. 熔断机制实现 107 | 2. 配置示例 108 | 3. 采样统计 109 | ## 超时与重试机制 110 | 111 | * 简介 112 | * 代理层超时与重试 113 | 1. nginx 114 | 2. twemproxy 115 | * web容器超时与重试 116 | * 数据库客户端超时 117 | * nosql 客户端超时 118 | * 业务超时 119 | * 前端ajax超时 120 | * 总结&参考资料 121 | 122 | ## 回滚机制 123 | * 事务回滚 124 | * 代码库回滚 125 | * 部署版本回滚 126 | * 数据版本回滚 127 | * 静态资源版本回滚 128 | 129 | ## 压测与预案 130 | * 系统压测 131 | online/offline 132 | * 系统优化与容灾 133 | * 应急预案 134 | 135 | # 高并发 136 | 137 | ## 应用级缓存 138 | * 缓存简介 139 | * 缓存命中率 140 | * 缓存回收策略 141 | * java 缓存类型 142 | 1. 堆缓存 143 | 2. 堆外缓存 144 | 3. 磁盘缓存 145 | 4. 分布式缓存 146 | 5. 多级缓存 147 | *  应用级缓存示例 148 | 1. 多级缓存api封装 149 | 2. null cache 150 | 3. 强制获取最新数据 151 | 4. 失败统计 152 | 5. 延迟报警 153 | * 缓存使用模式实践 154 | 1. cache-aside 155 | 2. cache-as-sor 156 | 3. read-through 157 | 4. write-through 158 | 5. write-behind 159 | 6. copy-pattern 160 | * 性能测试 161 | 162 | 163 | ## http缓存 164 | * http缓存 165 |      last-modified 166 | etag 167 | * httpclient客户端缓存 168 | 1. 主流程 169 | 2. 清除无效缓存 170 | 3. 查找缓存 171 | 4. 缓存未命中 172 | 5. 缓存命中 173 | 6. 缓存内容陈旧需要验证 174 | 7. 缓存内容无效需重新执行请求 175 | 8. 缓存相应 176 | 9. 缓存头总结 177 | * nginx http 缓存设置 178 | 1. expires 179 | 2. is-modified-since 180 | 3. nginx proxy_pass 181 | * nginx代理层缓存 182 | 1. nginx代理层缓存配置 183 | 2. 清理缓存 184 | ## 多级缓存 185 | * 如何缓存数据 186 | 1. 过期与不过期 187 | 2. 维度化缓存与增量缓存 188 | 3. 大value缓存 189 | 4. 热点缓存 190 | * 分布式缓存与应用负载均衡 191 | 1. 缓存分布式 192 | 2. 应用负载均衡 193 | * 热点数据与更新缓存 194 | 1. 单机全量缓存+主从 195 | 2. 分布式缓存和应用本地热点 196 | * 更新缓存与原子性 197 | * 缓存崩溃与快速修复 198 | 1. 取模 199 | 2. 一致性哈希 200 | 3. 快速恢复 201 | 202 | ## 链接池线程池详解 203 | * 数据库连接池 204 | 1. dbcp 205 | 2. dpcp配置建议 206 | 3. 数据库驱动超时实现 207 | 4. 连接池使用的一些建议 208 | 209 | * httpclient连接池 210 | 1. httpclient 4.5.4配置 211 | 2. httpclient 连接池源码分析 212 | 3. httpclient 4.2.3 213 | 4. 问题示例 214 | 215 | * 线程池 216 | 1. java 217 | 2. tomcat 218 | 219 | ## 异步并发实战 220 | * 同步阻塞调用 221 | * 异步future 222 | * 异步callback 223 | * 异步编排completablefuture 224 | * 异步web服务实现 225 | * 请求缓存 226 | * 请求合并 227 | 228 | ## 如何扩容 229 | * 单体应用垂直扩容 230 | * 单体应用水平扩容 231 | * 应用拆分 232 | * 数据库拆分 233 | * 数据库分表分裤示例 234 | 1. 应用层还是中间层 235 | 2. 分库分表策略 236 | 3. 使用 sharding-jdbc 分库分表 237 | 4. sharding-jdbc 分库分表配置 238 | 5. 使用sharding-jdbc 读写分离 239 | * 数据异构 240 | 1. 查询维度异构 241 | 2. 聚合数据异构 242 | * 任务系统扩容 243 | 1. 简单任务 244 | 2. 分布式任务 245 | 3. elastic-job-lite 246 | 247 | ## 队列 248 | * 应用场景 249 | * 缓冲队列 250 | * 任务队列 251 | * 消息队列 252 | * 请求队列 253 | * 数据总线队列 254 | * 混合队列 255 | * 其他队列 256 | * disruptor_redis 队列 257 | * 下单系统水平可扩展架构 258 | * 基于 canal实现数据异构 259 | 260 | -------------------------------------------------------------------------------- /books/冰鉴.md: -------------------------------------------------------------------------------- 1 | # 冰鉴 2 | 3 | ## 神骨第一 4 | 5 | ### 人之神犹如稻谷的精华 6 | 7 | ### 人之骨犹如支撑山体的岩石 8 | 9 | ### 透过双眼可以看到整个人的精神状态 10 | 11 | ### 开门见山观文人神骨 12 | 13 | ### 人之邪正最为难辨 14 | 15 | ### 通过动静两种状态全面考察 16 | 17 | ### 动静状态下眼中所表现出神情 18 | 19 | ### 败器、隐流之眼神 20 | 21 | ### 在抖擞处鉴别人的本色 22 | 23 | ### 收拾入门观其神 24 | 25 | ### 表面细致,实质粗心者不足以重用 26 | 27 | ### 慎重周密者可堪重用 28 | 29 | ### 骨色反映人之优劣 30 | 31 | ### 从骨 “质”中看人之贵贱 32 | 33 | ## 刚柔第二 34 | 35 | ### 神骨之后辩刚柔 36 | 37 | ### 刚柔与阴阳五行 38 | 39 | ### 刚柔与命运息息相关 40 | 41 | ### 五行的顺合与逆合 42 | 43 | ### 由内刚柔看人的心性本质 44 | 45 | ### 喜怒无常之人近乎粗鲁 46 | 47 | ### 没有激情的人近乎愚笨 48 | 49 | ### 考虑事情由浅入深的人较为机智 50 | 51 | ### 内心机智则功名可期 52 | 53 | ### “粗蠢”之人多长寿 54 | 55 | ### 机智而豁达之人有非凡成就 56 | 57 | ### 做事粗莽必半途而废 58 | 59 | ## 容貌第三 60 | 61 | ### 观人姿容应以七尺之躯为限 62 | 63 | ### 人的姿容以“整”为贵 64 | 65 | ### 容貌有清、古、奇、秀之别 66 | 67 | ### 眼睛是人面部的两方水潭 68 | 69 | ### 鼻子是人面部的一座山 70 | 71 | ### 大嘴有大福 72 | 73 | ### 容貌中贵征与贱征 74 | 75 | ## 情态第四 76 | 77 | ### 容貌弥补骨之不足,情态弥补神之不足 78 | 79 | ### 长久地识人要看其精神内质 80 | 81 | ### 初次识人宜观其行为举止 82 | 83 | ### 有大家风度,羞涩又何妨 84 | 85 | ### 越是叫嚣的厉害,越是不成熟 86 | 87 | ### 细处论取舍 88 | 89 | ### 情态种种之弱态 90 | 91 | ### 情态种种之狂态 92 | 93 | ### 情态种种之疏懒态 94 | 95 | ### 情态种种周旋态 96 | 97 | ### 优缺点未尝不能成器 98 | 99 | ### 察人要恒态、时态相结合 100 | 101 | ### 不足与论请的两种人 102 | 103 | ### 卑庸可耻之辈,不足与论事 104 | 105 | ### 优柔寡断之人,不足与贪心 106 | 107 | ### 根据情态交朋友 108 | 109 | ## 须眉第五 110 | 111 | ### 透过须眉看男人 112 | 113 | ### 眉毛中的秘密 114 | 115 | ### 胡须与眉毛之间的玄妙关系 116 | 117 | ## 声音第六 118 | 119 | ### 闻其声如见其人 120 | 121 | ### “声”与“音”的区别 122 | 123 | ### 从声音中听出贵与贱 124 | 125 | ### 大言不张唇,细言不露齿 126 | 127 | ### 粗鄙俗陋之声 128 | 129 | ### 从说话的情形中看人 130 | 131 | 132 | ## 气色第七 133 | 134 | ### 面部气色,显其命运 135 | 136 | ### 禀气而生,见之贤愚 137 | 138 | ### 色为外气,气为神表 139 | 140 | ### 躁静之决,多在气色 141 | 142 | ### 观色望气,可知其命 143 | 144 | ### 视色察情,尽览其质 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /code-part/ExceptionUtils..java: -------------------------------------------------------------------------------- 1 | public class ExceptionUtils { 2 | 3 | /** 4 | * ClassName LineNumber MethodName 5 | * @param throwable 6 | * @return 7 | */ 8 | public static String getStackException(Throwable throwable) { 9 | StringBuilder builder = new StringBuilder(); 10 | StackTraceElement[] stackElements = throwable.getStackTrace(); 11 | if (stackElements != null && stackElements.length > 0) { 12 | for (int i = 0; i < stackElements.length; i++) { 13 | builder.append("ClassName=" + stackElements[i].getClassName()); 14 | builder.append(",LineNumber=" + stackElements[i].getLineNumber()); 15 | builder.append(",MethodName=" + stackElements[i].getMethodName()); 16 | } 17 | } 18 | return builder.toString(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /code-part/RoundMode: -------------------------------------------------------------------------------- 1 | public static void main(String[] args) { 2 | MathContext mathContext = new MathContext(1,RoundingMode.DOWN);//0.2向零方向舍入的舍入模式 3 | BigDecimal qu = new BigDecimal(12).multiply(new BigDecimal(0.002),mathContext); 4 | System.out.println(qu); 5 | // MathContext m2 = new MathContext(2,RoundingMode.UP);//0.24 远离零方向舍入的舍入模式 6 | MathContext m2 = new MathContext(2,RoundingMode.CEILING);//0.25 向正无限大方向舍入的舍入模式 7 | // MathContext m2 = new MathContext(2,RoundingMode.FLOOR);//0.25 向负无限大方向舍入的舍入模式。 8 | // MathContext m2 = new MathContext(2,RoundingMode.HALF_DOWN);//0.24 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入 9 | // MathContext m2 = new MathContext(2,RoundingMode.HALF_EVEN);//0.24 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入 10 | // MathContext m2 = new MathContext(2,RoundingMode.HALF_UP);//0.24 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入 11 | // MathContext m2 = new MathContext(2,RoundingMode.UNNECESSARY);//用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入. 12 | BigDecimal q2 = new BigDecimal(12).multiply(new BigDecimal(0.002),m2); 13 | System.out.println(q2); 14 | } 15 | -------------------------------------------------------------------------------- /code-part/code-part-tools: -------------------------------------------------------------------------------- 1 | public class CodePartTools { 2 | /** 3 | * url www.lopscoop.com?h=2&content_id=1&w=1 4 | * get params 5 | */ 6 | public static String getPara(String url, String name) { 7 | String params = url.substring(url.indexOf("?") + 1, url.length()); 8 | Map split = Splitter.on("&").withKeyValueSeparator("=").split(params); 9 | return split.get(name); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /code-part/facebook.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FaceBook Login JavaScript Example 5 | 6 | 7 | 8 | 99 | 100 | 105 | 106 | 107 | 108 | 109 |
110 |
111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /code-part/html.md: -------------------------------------------------------------------------------- 1 | # html 2 | ## jsoup 3 | ``` 4 | //把jsoup转义的html替换成原来的标签 5 | Entities.EscapeMode.base.getMap().clear(); //转义前清除jsoup 转义表 6 | Document doc = Jsoup.parseBodyFragment(sourceData); 7 | doc.outputSettings().prettyPrint(false);//设置document 输出属性,设置是否压缩打印为false; 8 | 9 | ``` 10 | -------------------------------------------------------------------------------- /code-part/img/aqs-node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/code-part/img/aqs-node.png -------------------------------------------------------------------------------- /code-part/img/aqs2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/code-part/img/aqs2-2.png -------------------------------------------------------------------------------- /code-part/img/concurrent-ipml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/code-part/img/concurrent-ipml.png -------------------------------------------------------------------------------- /code-part/img/countdown-latch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/code-part/img/countdown-latch.png -------------------------------------------------------------------------------- /code-part/img/image.md: -------------------------------------------------------------------------------- 1 | # code part 2 | -------------------------------------------------------------------------------- /code-part/mybatis-excute-detail: -------------------------------------------------------------------------------- 1 | mybatis excute detail 2 | org.apache.ibatis.session.SqlSession.selectList(String) 3 | org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(String, Object, RowBounds) 4 | org.apache.ibatis.executor.BaseExecutor.query(MappedStatement, Object, RowBounds, ResultHandler) 5 | org.apache.ibatis.executor.CachingExecutor.query(MappedStatement, Object, RowBounds, ResultHandler) 6 | //sql语句缓存 7 | public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { 8 | BoundSql boundSql = ms.getBoundSql(parameterObject);// 9 | CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql); 10 | return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); 11 | } 12 | public class BoundSql { 13 | private String sql; 14 | private List parameterMappings; 15 | private Object parameterObject; 16 | private Map additionalParameters; 17 | private MetaObject metaParameters; 18 | } 19 | -------------------------------------------------------------------------------- /code-part/parttern.lua: -------------------------------------------------------------------------------- 1 | local function readfile(filename) 2 | local f =assert(io.open(filename,'r')) 3 | local content = f:read('*all') 4 | -- local content =f:read('*line') 5 | f:close() 6 | return content 7 | end 8 | 9 | -- print(readfile("catalina.out")) 10 | 11 | -- print(readfile("catalina.out","^tbl_")) 12 | 13 | -- s_content = readfile("catalina.out") 14 | 15 | -- print(string.find(s_content,"tbl_(%l+)")) 16 | 17 | -- for word in string.gmatch(readfile("catalina.out"),"tbl_%a*_%a*_%a*_%a*") 18 | for word in string.gmatch(readfile("catalina.out"),"(tbl_%a*_%a*)") 19 | 20 | do print(word) 21 | end 22 | -------------------------------------------------------------------------------- /command/linux-shell.md: -------------------------------------------------------------------------------- 1 | # shell 2 | 3 | ### 列出最常使用的命令 4 | history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head 5 | 6 | ### 列出所有网络状态:ESTABLISHED / TIME_WAIT / FIN_WAIT1 / FIN_WAIT2 7 | netstat -n | awk '/^tcp/ {++tt[$NF]} END {for (a in tt) print a, tt[a]}' 8 | 9 | ### 通过 SSH 来 mount 文件系统 10 | sshfs name@server:/path/to/folder /path/to/mount/point 11 | 12 | ### 显示前十个运行的进程并按内存使用量排序 13 | ps aux | sort -nk +4 | tail 14 | 15 | ### 在右上角显示时钟 16 | while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done& 17 | 18 | ### 从网络上的压缩文件中解出一个文件来,并避免保存中间文件 19 | wget -qO - "http://www.tarball.com/tarball.gz" | tar zxvf - 20 | 21 | ### 性能测试:测试处理器性能 22 | python -c "import test.pystone;print(test.pystone.pystones())" 23 | 24 | ### 性能测试:测试内存带宽 25 | dd if=/dev/zero of=/dev/null bs=1M count=32768 26 | 27 | ### Linux 下挂载一个 iso 文件 28 | mount /path/to/file.iso /mnt/cdrom -oloop 29 | 30 | ### 通过主机 A 直接 ssh 到主机 B 31 | ssh -t hostA ssh hostB 32 | 33 | ### 下载一个网站的所有图片 34 | wget -r -l1 --no-parent -nH -nd -P/tmp -A".gif,.jpg" http://example.com/images 35 | 36 | ### 快速创建项目目录 37 | mkdir -p work/{project1,project2}/{src,bin,bak} 38 | 39 | ### 按日期范围查找文件 40 | find . -type f -newermt "2010-01-01" ! -newermt "2010-06-01" 41 | 42 | ### 显示当前正在使用网络的进程 43 | lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2 44 | 45 | ### Vim 中保存一个没有权限的文件 46 | :w !sudo tee > /dev/null % 47 | 48 | ### 在 .bashrc / .bash_profile 中加载另外一个文件(比如你保存在 github 上的配置) 49 | source ~/github/profiles/my_bash_init.sh 50 | 51 | ### 终端下正确设置 ALT 键和 BackSpace 键 52 | http://www.skywind.me/blog/archives/2021 53 | 54 | ###  打印指定名称的pid并且kill掉 55 | ps -ef | grep tomcat-tuiguang/ | grep -v grep | awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh - 56 | 57 | ###  打印指定名称的pic并且kill掉 58 | ps -ef | grep tomcat-tuiguang/ | grep -v grep | awk '{print $2}' 59 | 60 | ###   grep 61 | [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename   62 | 选项与参数: 63 | -a :将 binary 文件以 text 文件的方式搜寻数据 64 | -c :计算找到 '搜寻字符串' 的次数 65 | -i :忽略大小写的不同,所以大小写视为相同 66 | -n :顺便输出行号 67 | -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! 68 | --color=auto :可以将找到的关键词部分加上颜色的显示喔! 69 | 70 | 71 | -------------------------------------------------------------------------------- /command/linux/network/tools-for-network: -------------------------------------------------------------------------------- 1 | linux Monitoring network 2 | http://os.51cto.com/art/201404/435279.htm 3 | -------------------------------------------------------------------------------- /command/mongo.md: -------------------------------------------------------------------------------- 1 | # mongo 2 | 3 | ## hello word 4 | 5 | db.channel_articles.update({"processed":false},{$set:{"processed":true}},{multi:true}) 6 | db.channel_articles.update({'processed':false},{$set:{'processed':true}}) 7 | db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) 8 | db.channel_articles.find({"processed":false}).count(); 9 | db.channel_articles.find().count(); 10 | db.channel_articles.remove({}); 11 | 12 | ## links 13 | [MongoDB 教程](http://www.runoob.com/mongodb/mongodb-tutorial.html) 14 | -------------------------------------------------------------------------------- /command/mysql: -------------------------------------------------------------------------------- 1 | show processlist; 2 | 查看现在正在执行的sql 3 | -------------------------------------------------------------------------------- /common/Language/css.md: -------------------------------------------------------------------------------- 1 | # Css (Cascading Style Sheets) 2 | * CSS 指层叠样式表 (Cascading Style Sheets) 3 | * 样式定义如何显示 HTML 元素 4 | * 样式通常存储在样式表中 5 | * 把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题 6 | * 外部样式表可以极大提高工作效率 7 | * 外部样式表通常存储在 CSS 文件中 8 | * 多个样式定义可层叠为一 9 | 10 | ## CSS优先级 11 | * 浏览器缺省设置 12 | * 外部样式表 13 | * 内部样式表(位于 标签内部) 14 | * 内联样式(在 HTML 元素内部) 15 | 16 | ## 语法 17 | CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明。 18 | ``` 19 | selector {declaration1; declaration2; ... declarationN } 20 | 21 | selector {property: value} 22 | 23 | h1 {color:red; font-size:14px;} 24 | ``` 25 | * 值的不同写法 26 | * 记得写引号 27 | * 多重声明 28 | * 空格和大小写 29 | 30 | ## 高级语法 31 | * 选择器的分组 32 | * 继承 33 | 根据 CSS,子元素从父元素继承属性 34 | 35 | ## 选择器 36 | ### 派生选择器 37 | ``` 38 | li strong { 39 | font-style: italic; 40 | font-weight: normal; 41 | } 42 | 43 | ``` 44 | 45 | ``` 46 | strong { 47 | color: red; 48 | } 49 | 50 | h2 { 51 | color: red; 52 | } 53 | 54 | h2 strong { 55 | color: blue; 56 | } 57 | ``` 58 | 59 | ### id 选择器 60 | ``` 61 | #red {color:red;} 62 | #green {color:green;} 63 | ``` 64 | 65 | ``` 66 | #sidebar p { 67 | font-style: italic; 68 | text-align: right; 69 | margin-top: 0.5em; 70 | } 71 | ``` 72 | 73 | ### CSS 类选择器 74 | ``` 75 | .center {text-align: center} 76 | ``` 77 | 78 | ``` 79 | .fancy td { 80 | color: #f60; 81 | background: #666; 82 | } 83 | ``` 84 | 85 | ``` 86 | td.fancy { 87 | color: #f60; 88 | background: #666; 89 | } 90 | ``` 91 | 92 | ### CSS 属性选择器 93 | ``` 94 | [title] 95 | { 96 | color:red; 97 | } 98 | ``` 99 | ``` 100 | [title=W3School] 101 | { 102 | border:5px solid blue; 103 | } 104 | ``` 105 | 106 | 107 | ## 样式 108 | ### 背景 109 | ### 文本 110 | ### 字体 111 | ### 链接 112 | ### 列表 113 | ### 表格 114 | ### 轮廓 115 | 116 | ## 框模型 117 | 1. 边框(border),可以设置边框的宽窄、样式和颜色。 118 | 2. 内边距(padding),可以设置盒子内容区与边框的间距。 119 | 3. 外边距(margin),可以设置盒子与相邻元素盒子的间距。 120 | ### 内边 121 | ### 边距 122 | ### 外边距 123 | ### 外边距合并 124 | ``` 125 | * { 126 | margin:0; 127 | padding:0; 128 | } 129 | ``` 130 | [css](http://caibaojian.com/css3/properties/padding/index.htm) 131 | ## 定位 132 | ###  相对 133 | ###  绝对 134 | ###  浮动 135 | 136 | 137 | -------------------------------------------------------------------------------- /common/Language/rust.md: -------------------------------------------------------------------------------- 1 | # Rust 2 | 3 | -------------------------------------------------------------------------------- /common/Sequence-Diagram.md: -------------------------------------------------------------------------------- 1 | # Sequence Diagram 2 | 时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。 3 | 4 | ## 时序图元素(Sequence Diagram Elements) 5 | 6 | * 角色(Actor) 7 | 系统角色,可以是人、及其甚至其他的系统或者子系统。 8 | * 对象(Object) 9 | 对象包括三种命名方式: 10 | 第一种方式包括对象名和类名; 11 | 第二中方式只显示类名不显示对象名,即表示他是一个匿名对象; 12 | 第三种方式只显示对象名不显示类明。 13 | * 生命线(Lifeline) 14 | 生命线在顺序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间 15 | * 控制焦点(Focus of Control) 16 | 控制焦点是顺序图中表示时间段的符号,在这个时间段内对象将执行相应的操作。用小矩形表示 17 | * 消息(Message) 18 | 消息一般分为同步消息(Synchronous Message),异步消息(Asynchronous Message)和返回消息(Return Message) 19 | 同步消息=调用消息(Synchronous Message) 20 | 消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义。 21 | 22 | 异步消息(Asynchronous Message) 23 | 消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。 24 | 25 | 返回消息(Return Message) 26 | 返回消息表示从过程调用返回 27 | * 自关联消息(Self-Message) 28 | 表示方法的自身调用以及一个对象内的一个方法调用另外一个方法。 29 | * Combined Fragments 30 | Ø Alternative fragment(denoted “alt”) 与 if…then…else对应 31 | Ø Option fragment (denoted “opt”) 与 Switch对应 32 | Ø Parallel fragment (denoted “par”) 表示同时发生 33 | Ø Loop fragment(denoted “loop”) 与 for 或者 Foreach对应 34 | -------------------------------------------------------------------------------- /common/computer-model.md: -------------------------------------------------------------------------------- 1 | # 计算机模型图 2 | 3 | ## OSI网络 七层模型 4 | 5 | !["OSI"](https://github.com/micolore/blogs/blob/master/common/img/tcpip-osi.png) 6 | 7 | * 物理层:负责0、1比特流(0、1序列)与电压的高低、光的闪灭(电信号)之间的互换。 8 | 9 | * 数据链路层:负责物理层上互连的、节点之间的通信传输。例如一个与以太网相连的2个节点之间的通信 10 | 11 | * 网络层:将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主要是负责寻址和路由选择。 12 | 13 | * 传输层:可靠地传输数据。只在通信双方节点上进行处理,而无需在路由器上处理。 14 | 15 | * 会话层:负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。 16 | 17 | * 表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。 18 | 19 | * 应用层:为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登录等协议。 20 | 21 | ## TCP/IP参考模型 22 | 23 | TCP/IP更强调“在计算机上实现协议应该开发哪种程序 24 | !["tcp/ip"](https://github.com/micolore/blogs/blob/master/common/img/tcpip-tcpip.png) 25 | 26 | * 物理层 TCP/IP物理层是负责数据传输的硬件 27 | 28 | * 网络接口层 网络接口层利用以太网的数据链路层进行通信 29 | 30 | * 网络层 网络层使用IP协议,相当于OSI参考模型的第三层网络层。IP协议基于IP地址转发分包数据,作用是将分组数据报发送到目的主机 31 | 32 | * 传输层 传输层的主要功能就是让应用程序之间实现通信 33 | 34 | * 应用层 TCP/IP应用的架构大多数属于客户端/服务器模型。常见的应用有www、E-mail、FTP、TELNET、SNMP(网络管理) 35 | 36 | 参考连接:     37 | [TCP/IP(一)分层模型](http://liuguoquan727.github.io/2015/12/17/TCP-IP1%E6%A8%A1%E5%9E%8B/) 38 | -------------------------------------------------------------------------------- /common/data-structure.md: -------------------------------------------------------------------------------- 1 | # 数据结构 2 | 3 | ## 概念 4 | * 数据data 5 | * 数据元素 data element 6 | * 数据对象 data object 7 | * 数据结构 data structure 8 | 1. 集合 9 | 2. 线性结构 10 | 3. 树型结构 11 | 4. 图状结构or网状结构 12 | * 数据类型 data type 13 | * 抽象数据类型 14 | 1. 原子类型 15 | 2. 固定聚合类型 16 | 3. 可变聚合类型 17 | 4. 多型数据类型 18 | 19 | ## 线性结构 20 | 21 | ### 线性表 22 | 一个线性表是n个数据元素的有序序列,更复杂的可以由多个数据项组成,通常把数据元素称为记录,含有大量记录的线性表又为文件 23 | 24 | ### 线性链表 25 | 没有顺序存储的线性结构 26 | 27 | #### 线性链表 28 | 对应存储的数据元素,本身存储其本身信息还需要存储一个指示其后继的信息,称之为节点。 29 | 存储数据元素信息的域称为数据域,存储直接后继存储位置的域称为指针域,指针域中存储的信息指针或链,n个节点链接成一个链表 30 | 又称为线性链表或者单链表 31 | > 动态结构 32 | 33 | * 静态链表 一开始初始化所有的位置,然后修改位置 34 | 35 | #### 循环链表 36 | 37 | #### 双向链表 38 | 39 | ### 栈和队列 40 | 41 | ### 串 42 | 43 | ## 数组和广义表 44 | 45 | ## 树和二叉树 46 | 47 | ## 图 48 | 49 | # 动态存储管理 50 | 51 | 52 | 53 | # 算法 54 | 55 | ## 特性 56 | * 有穷 57 | * 确定 58 | * 可行 59 | * 输入 60 | * 输出 61 | ## 算法要求设计 62 | * 正确性 63 | * 可读性 64 | * 健壮性 65 | * 效率与低存储量需求 66 | ## 算法效率的度量 67 | * 时间复杂度 68 | 69 | ## 算法的存储空间需求 70 | * 空间复杂度 71 | 72 | ## 学习计划 20180417开始 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /common/draw.md: -------------------------------------------------------------------------------- 1 | # 画图 2 | 3 | ## 系统流程图 4 | 5 | ## 时序图 6 | 7 | ## UC图 8 | 9 | ## DFD Data Flow Diagram 10 | 11 | ## ERD(Entity-Relationship Diagram) 12 | 13 | ## IPO(input process output) 14 | 15 | ## STD(State Transition Diagram) 16 | 17 | ## 层次方框图 18 | 19 | ## warnier图 20 | 21 | [各种图](https://blog.csdn.net/t131452n/article/details/41381393) 22 | 23 | -------------------------------------------------------------------------------- /common/english/algorithrms.emacs: -------------------------------------------------------------------------------- 1 | 1. refer 2 | 2. individual 3 | 3. enclosing 4 | 4. terminate 5 | 5. aliasing 6 | 6. fragment 7 | 7. demensional 8 | 8. sense 9 | 9. straightforward 10 | 10. equivalent 11 | -------------------------------------------------------------------------------- /common/english/algorithrms.emacs~: -------------------------------------------------------------------------------- 1 | 1. refer 2 | 2. individual 3 | 3. enclosing 4 | 4. -------------------------------------------------------------------------------- /common/english/book/books.md: -------------------------------------------------------------------------------- 1 | # book 2 | ## 3 | [词典](https://bookfere.com/dict) 4 | 5 | -------------------------------------------------------------------------------- /common/english/english.md: -------------------------------------------------------------------------------- 1 | # english 2 | 3 | # c 4 | * the C99 standard drops support for this implicit assumption of type int 5 | * you generally inform the compiler about functions by declaring them in advance 6 | * In either case 7 | * your chief concern should be that the function declaration appears before the function is used 8 | * among other things 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /common/english/sentence.md: -------------------------------------------------------------------------------- 1 | # sentence 2 | 3 | # c 4 | 1. C is an efficient language 5 | 2. The result is a more reliable, understandable program 6 | 3. Its design makes it natural for top-down planning, structured programming 7 | 8 | # read 9 | 10 | ## avro 11 | * A compact, fast, binary data format 12 | * A container file, to store persistent data 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /common/english/word.md: -------------------------------------------------------------------------------- 1 | * adjective 2 | 形容词 adj在英语中用来修饰名词、感官动词 3 | organic -The company’s path to success was by means of organic growth. 4 | * noun 5 | 名词 6 | * verb 7 | 动词 8 | * adverb 9 | 副词 10 | obediently 11 | -------------------------------------------------------------------------------- /common/english/语法.md: -------------------------------------------------------------------------------- 1 | # 语法 2 | 3 | ## 词类 4 | 是一个语言学术语,是一种语言中词的语法分类,是以语法特征(包括句法功能和形态变化)为主要依据、兼顾词汇意义对词进行划分的结果 5 | * 冠词名词 6 | * 代词 7 | 1. 人称代词: They are my school mates. 8 | 2. 物主代词: Our friends have great concern for each other. 9 | 3. 反身代词: Take good care of yourselves. 10 | 4. 相互代词:We should help each other. 11 | 5. 指示代词: Who are these people? 12 | 6. 疑问代词:What are you doing? 13 | 7. 关系代词:She married Tony Harper, who is a student too. 14 | 8. 连接代词:Do you know who did it? 15 | 9. 不定代词:Do you know anything about it? 16 | * 动词 17 | * 形容词 18 | 修饰名词等,说明事物或人的性质或特征的词 19 | 1. 性质形容词 20 | 2. 叙述形容词 21 | * 副词 22 | 主要用来修饰动词,形容词,副词或整个句子 23 | 1. 时间副词: soon, then, today, tomorrow, afterwards , now, 地点副词: here, there 24 | 2. 程度副词: very, quite, rather 25 | 3. 方式副词: beautifully, reluctantly, well 频度副词: often , frequently, always 26 | * 介词 27 | * 连词 28 | * 助词 感叹词 29 | 30 | ## 句子成分 31 | 名词可以作主语、宾语、表语和补语; 32 | 形容词可以作定语、表语和补语; 33 | 副词只可以作状语; 34 | 动词只可以作谓语; 35 | > 英语中绝大部分的句子都是由“四大词性”和“七类辅助结构”(介词短语、三类从句、三类非谓语动词)所组成的 36 | 37 | -------------------------------------------------------------------------------- /common/english/音标.md: -------------------------------------------------------------------------------- 1 | # 音标 2 | 24个 3 | ## 单元音 i 4 | 发汉语 衣音 ,但是声音拉长 5 | > eat 6 | > need 7 | > thief 8 | * 比较 9 | i 嘴型较扁长 I 短元音 嘴型较开 部队里 一 二 一 10 | eat heat sheep 11 | it hit ship 12 | -------------------------------------------------------------------------------- /common/git.md: -------------------------------------------------------------------------------- 1 | # Git 2 | ![git river](https://github.com/micolore/blogs/blob/master/common/img/git-river.png) 3 | * Workspace:工作区 4 | 程序员进行开发改动的地方,是你当前看到的,也是最新的,平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。 5 | 6 | * Index / Stage:暂存区 7 | .git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。 8 | 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。 9 | 10 | * Repository:仓库区(或本地仓库) 11 | 保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些,git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步 12 | 13 | * Remote:远程仓库 14 | 远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。 15 | 16 | ![git river](https://github.com/micolore/blogs/blob/master/common/img/git-workspace.png) 17 | 18 | ## HEAD 19 | 它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变 20 | 21 | ### Command 22 | 1. add 23 | 主要实现将工作区修改的内容提交到暂存区,交由git管理 24 | * git add .添加当前目录的所有文件到暂存区 25 | * git add 添加指定目录到暂存区,包括子目录 26 | * git add 添加指定文件到暂存区 27 | 28 | 2. commit 29 | 主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点 30 | * git commit -m 提交暂存区到本地仓库,message代表说明信息 31 | * git commit -m 提交暂存区的指定文件到本地仓库 32 | * git commit --amend -m 使用一次新的commit,替代上一次提交 33 | 34 | 3. branch 35 | 涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作 36 | * git branch列出所有本地分支 37 | * git branch -r列出所有远程分支 38 | * git branch -a列出所有本地分支和远程分支 39 | * git branch 新建一个分支,但依然停留在当前分支 40 | * git checkout -b 新建一个分支,并切换到该分支 41 | * git branch --track 新建一个分支,与指定的远程分支建立追踪关系 42 | * git checkout 切换到指定分支,并更新工作区 43 | * git branch -d 删除分支 44 | * git push origin --delete 删除远程分支 45 | 46 | 4. merge 47 | 我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge 48 | * git fetch merge之前先拉一下远程仓库最新代码 49 | * git merge 合并指定分支到当前分支 50 | 一般在merge之后,会出现conflict,需要针对冲突情况,手动解除冲突。主要是因为两个用户修改了同一文件的同一块区域 51 | 52 | 5. rebase 53 | rebase又称为衍合,是合并的另外一种选择 54 | 在开始阶段,我们处于new分支上,执行git rebase dev,那么new分支上新的commit都在master分支上重演一遍,最后checkout切换回到new分支。这一点与merge是一样的,合并前后所处的分支并没有改变。git rebase dev,通俗的解释就是new分支想站在dev的肩膀上继续下去。rebase也需要手动解决冲突。 55 | > rebase与merge的区别 56 | >merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。 57 | 58 | >如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase 59 | 60 | >如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge 61 | 62 | 6. reset 63 | reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区 64 | * git reset —soft 只改变提交点,暂存区和工作目录的内容都不改变 65 | * git reset —mixed 改变提交点,同时改变暂存区的内容 66 | * git reset —hard 暂存区、工作区的内容都会被修改到与提交点完全一致的状态 67 | * git reset --hard HEAD让工作区回到上次提交时的状态 68 | 69 | 7. revert 70 | git revert用一个新提交来消除一个历史提交所做的任何修改。 71 | git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 72 | 73 | 8. push 74 | 上传本地仓库分支到远程仓库分支,实现同步 75 | * git push 上传本地指定分支到远程仓库 76 | * git push --force强行推送当前分支到远程仓库,即使有冲突 77 | * git push --all推送所有分支到远程仓库 78 | 79 | 9. other 80 | * git status显示有变更的文件 81 | * git log显示当前分支的版本历史 82 | * git diff显示暂存区和工作区的差异 83 | * git diff HEAD显示工作区与当前分支最新commit之间的差异 84 | * git cherry-pick 选择一个commit,合并进当前分支 85 | 86 | [Git高级教程](https://www.jianshu.com/p/15b8e6b7e3d7) 87 | [Git 分支 - 分支的新建与合并](https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6) 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /common/img/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/add.png -------------------------------------------------------------------------------- /common/img/branch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/branch.png -------------------------------------------------------------------------------- /common/img/commit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/commit.png -------------------------------------------------------------------------------- /common/img/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/error.png -------------------------------------------------------------------------------- /common/img/git-river.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/git-river.png -------------------------------------------------------------------------------- /common/img/git-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/git-workspace.png -------------------------------------------------------------------------------- /common/img/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/head.png -------------------------------------------------------------------------------- /common/img/merge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/merge.png -------------------------------------------------------------------------------- /common/img/readme.md: -------------------------------------------------------------------------------- 1 | /img 2 | -------------------------------------------------------------------------------- /common/img/rebase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/rebase.png -------------------------------------------------------------------------------- /common/img/reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/reset.png -------------------------------------------------------------------------------- /common/img/tcpip-osi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/tcpip-osi.png -------------------------------------------------------------------------------- /common/img/tcpip-tcpip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/tcpip-tcpip.png -------------------------------------------------------------------------------- /common/img/uml_class_struct.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/common/img/uml_class_struct.jpg -------------------------------------------------------------------------------- /common/oauth.md: -------------------------------------------------------------------------------- 1 | # OAUTH 2 | -------------------------------------------------------------------------------- /common/postgresql.md: -------------------------------------------------------------------------------- 1 | # postgresql 2 | 3 | ## install 4 | ### Installation from Source Code 5 | 6 | ``` 7 | ./configure 8 | make 9 | su 10 | make install 11 | adduser postgres 12 | mkdir /usr/local/pgsql/data 13 | chown postgres /usr/local/pgsql/data 14 | su - postgres 15 | /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data 16 | /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 & 17 | /usr/local/pgsql/bin/createdb test 18 | /usr/local/pgsql/bin/psql test 19 | 20 | ``` 21 | ### YUM 22 | 23 | ## Hello World 24 | 25 | ## 26 | [PostgreSql-wiki](https://zh.wikipedia.org/wiki/PostgreSQL) 27 | [What_is_PostgreSQL](http://wiki.postgresql.org/wiki/FAQ#What_is_PostgreSQL.3F_How_is_it_pronounced.3F_What_is_Postgres.3F) 28 | -------------------------------------------------------------------------------- /common/secret-encryption.md: -------------------------------------------------------------------------------- 1 | 详细的整理下常见的加密方式,实现,特点,以及具体的使用场景,以及选择加密方式的原则 2 | 3 | # 概念 4 | 加密的关注点: 是否对称、是否可逆、单向双向 5 | * 单向加密是不可逆的,也就是只能加密,不能解密,通常用来传输类似用户名和密码,直接将加密后的数据提交到后台, 6 | 因为后台不需要知道用户名和密码,可以直接将收到的加密后的数据存储到数据库 7 | * 双向加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了 8 | 非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密, 9 | 然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理 10 | * 线性散列算法 11 |  属于签名算法 12 | ## 对称与不对称 13 | 1. 对称算法即加密用的密钥和解密用的密钥是一个 14 | 2. 还有一种加密解密算法称之为非对称算法。这种算法加密用的密钥(公钥)和解密用的密钥(私钥)是两个不同的密钥;通过公钥加密的内容一定要使用私钥才能够解密 15 | 16 | ## DES加密算法 (对称) 17 | 18 | DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES加密算法加密的密文数据 19 | DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密 20 | ``` 21 | DES:算法DES要求密钥长度为64位密钥, 有效密钥56位。64bits=8*8*1,即8个ascii字符。 22 | DESede:算法DESede要求的密钥位数为192位,即192bits=64*3=8*8*3,即24个ascii字符。 23 | Blowfish:算法Blowfish要求密钥长度为8--448字位,即8--448(bits)。即:1个到56个ascii字符 24 | 25 | DESede密钥位数不符合时的,报错如下: 26 | 27 | java.security.InvalidKeyException: Wrong key size 28 | at com.sun.crypto.provider.SunJCE_x.a(DashoA12275) 29 | at com.sun.crypto.provider.SunJCE_i.a(DashoA12275) 30 | at com.sun.crypto.provider.SunJCE_h.a(DashoA12275) 31 | at com.sun.crypto.provider.SunJCE_h.a(DashoA12275) 32 | at com.sun.crypto.provider.DESedeCipher.engineInit(DashoA12275) 33 | at javax.crypto.Cipher.init(DashoA12275) 34 | at com.yourCompany.CryptUtils.encrypt(CryptUtils.java:112) 35 | at com.yourCompany.CryptUtils.encrypt(CryptUtils.java:144) 36 | at com.yourCompany.CryptUtils.main(CryptUtils.java:260) 37 | ``` 38 | 39 | 40 | ## AES加密算法 (对称) 41 | AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256, 42 | 分组长度128位,算法应易于各种硬件和软件实现 ,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准 43 | 44 | # 3DES 对称 45 | 3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高 46 | 47 | ## RSA加密算法 (非对称) 48 | RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。 49 | RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准 50 | 51 | ## Base64加密算法 52 | Base64加密算法是网络上最常见的用于传输8bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息 53 | 54 | ## MD5加密算法 (线性散列) 55 | MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护,MD5被广泛用于各种软件的密码认证和钥匙识别上 56 | 57 | ## SHA1加密算法 58 | SHA1是和MD5一样流行的消息摘要算法。SHA加密算法模仿MD4加密算法。SHA1设计为和数字签名算法(DSA)一起使用 59 | 60 | ## DSA (非对称) 61 | 62 | ## ECC (非对称) 63 | ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等 64 | 65 | ## HMAC (线性散列) 66 | 67 | ### 加密方式选择 68 | 由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。 69 | 在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点 70 | 71 | -------------------------------------------------------------------------------- /common/uml.md: -------------------------------------------------------------------------------- 1 | # uml 2 | ![uml-class](https://github.com/micolore/note/blob/master/common/img/uml_class_struct.jpg) 3 | * 车的类图结构为<>,表示车是一个抽象类; 4 | * 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示; 5 | * 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示; 6 | * 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示; 7 | * 学生与班级之间是聚合关系,使用带空心箭头的实线表示; 8 | * 学生与身份证之间为关联关系,使用一根实线表示; 9 | * 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示; 10 | 11 | ## 关系 12 | ### 泛化关系(generalization) 13 | 类的继承结构表现在UML中为:泛化(generalize)与实现(realize): 14 | 继承关系为 is-a的关系;两个对象之间如果可以用 is-a 来表示,就是继承关系:(..是..) 15 | eg:自行车是车、猫是动物 16 | 注:最终代码中,泛化关系表现为继承非抽象类;   17 | 18 | ### 聚合关系(aggregation) 19 | 聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成; 20 | 21 | ### 组合关系(composition) 22 | 与聚合关系一样,组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成; 23 | 但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如, 公司不存在了,部门也将不存在了; 24 | 25 | ### 关联关系(association) 26 | 它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系; 27 | 比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系; 28 | 29 | ### 依赖关系(dependency) 30 | 他描述一个对象在运行期间会用到另一个对象的关系; 31 | 与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化; 32 | 33 | 显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生; 34 | 35 | ## 时序图 36 | 为了展示对象之间的交互细节,后续对设计模式解析的章节,都会用到时序图; 37 | 38 | 时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。时序图中显示的是参与交互的对象及其对象之间消息交互的顺序。 39 | 40 | 时序图包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。 41 | 42 | ## 参考 43 | [看懂UML类图和时序图](https://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html) 44 | -------------------------------------------------------------------------------- /config-files/nginx.conf: -------------------------------------------------------------------------------- 1 | worker_processes 1; 2 | 3 | pid logs/nginx.pid; 4 | error_log logs/error.log warn; 5 | 6 | events { 7 | worker_connections 3000; 8 | } 9 | 10 | http { 11 | include mime.types; 12 | server_tokens off; 13 | 14 | ## 下面配置反向代理的参数 15 | server { 16 | listen 8089; 17 | 18 | location / { 19 | root F:\static-flie; 20 | index index.html index.htm; 21 | } 22 | #filter file type 23 | location ~ ^/(images|javascript|js|css|flash|media|static|html)/ { 24 | root F:\static-flie; 25 | access_log off; 26 | expires 30d; 27 | } 28 | location /README.md { 29 | proxy_set_header X-Real-IP $remote_addr; 30 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 31 | proxy_pass https://github.com/moonbingbing/openresty-best-practices/blob/master/README.md; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /config-files/server.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 | 46 | 47 | 48 | 49 | 54 | 55 | 56 | 61 | 62 | 63 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /directory-section/Test-Web-Info.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/directory-section/Test-Web-Info.txt -------------------------------------------------------------------------------- /directory-section/litle-cache-about: -------------------------------------------------------------------------------- 1 | 2 | 2018-1.10 3 | 由于之前业务需求在不断的新增,导致缓存这边的管理跟不上,现在update get 是一个很头大的问题。 4 | 只有一块数据,但是最终要维护大概7、8个版本,这就很头大了,根本不敢改 5 | 业务区分 6 | 频道区分 7 | 是否爬虫 8 | 类型区分 9 | app pc mobiel-web 10 | 渠道区分、来源区分 11 | 多个运营渠道 12 | 怎么能使多个相同数据的缓存进行管理呢? 13 | 缓存的数据最好不进行业务上的关联 业务缓存耦合低 14 | 缓存!= 业务 15 | 代码里面控制具体的业务逻辑进行get 16 | 单独业务单独进行 update get cache 业务耦合比较高 17 | -------------------------------------------------------------------------------- /distributed/data/olap.md: -------------------------------------------------------------------------------- 1 | # OLAP On-line Analytical Processing 2 | -------------------------------------------------------------------------------- /distributed/distributed.md: -------------------------------------------------------------------------------- 1 | # Distributed System 2 | ## 什么是分布式系统? 3 | A. Tanenbaum定义:分布式网络的计算机中的组件之间协调动作是通过消息进行通讯。 4 | G. Coulouris定义:当你知道有一台电脑崩溃,但是你的软件运行从来不会停止。 5 | Leslie Lamport定义:分布式系统是这样系统:旨在支持应用程序和服务的开发,可以利用物理架构 由多个自治的处理元素,不共享主内存,但通过网络发送异步消息合作。 6 | ### 计算和存储 7 | ## 分布式系统特点 8 | * 并发性 9 | 共享资源,采取ACID或Base原则 CAP是:Consistency(一致性), Availability(可用性), 和 Partition tolerance(分区容错性) 可靠性 10 | 简称,CAP定理认为,CAP三种之中,只能同时满足其中两种 11 | * 可扩展性Scalable 12 | 通过扩展能够获得高性能 高吞吐量 低延迟Latency 13 | * 可靠性/可用性 14 | 故障发现和处理以及恢复 容错处理,Availability = uptime / (uptime + downtime) 15 | * 消息处理 16 | 具体产品有:RabbitMQ ZeroMQ Netty等等 17 | * 异构性 18 | 不同操作系统 硬件 程序语言 开发者,中间件是一种解决方案 19 | * 安全性 20 | 授权认证 SSO单点登录 Oauth等等。 21 | * 定位命令 22 | 标识资源 URLs 23 | 命名服务Naming services 24 | 定位寻找Lookup 25 | 主要见SOA中的服务查找。如Zookeeper实现服务查找 26 | * 透明性 27 | 访问透明度: 使用相同的操作本地和远程资源 28 | 位置透明:访问资源无需知道其物理或网络位置 29 | 并发透明度:多个进程可以同时运行访问使用共享资源,当不能干扰堵塞 它们的处理进程 30 | 复制透明性: 资源的多个实例可以被用来复制以提高可靠性和性能,但无需由用户编制专门的应用程序来实现。 31 | 故障透明度:出现软件硬件故障时,使用户和应用方案能继续完成他们的任务不受影响。 32 | 移动透明度:允许在 系统存在移动的资源和客户。 33 | 性能透明度:允许系统重新配置以 提高性能负荷变化 34 | 缩放透明度:在应用程序结构没有变化的情况下能够在规模上扩展或伸缩系统,以提高吞吐量处理能力。   35 | ## 分布式挑战 36 | 分布式系统是难于理解、设计、构建 和管理的,他们将比单个机器成倍还要多的变量引入到设计中,使应用程序的根源问题更难发现。SLA(服务水平协议)是衡量停机和/或性能下降的标准,大多数现代应用程序有一个期望的弹性SLA水平,通常按"9"的数量增加(如,每月99.9或99.99%可用性)。每个额外的9变得越来越难实现 37 | ### 分布式系统由两个物理因素的限制: 38 | * 节点的数量(能够增加所需的存储和计算能力 39 | * 节点之间的距离(信息的传送距离,最好以光速) 40 | 这两个约束导致下面值得挑战的情况发生:   41 | * 独立节点随着数目的增加发生故障的概率增加(减少可用的和管理成本增加) 42 | * 独立节点随着数目增加可能会增加节点之间的通信的消耗(随着规模的增大性能降低) 43 | * 地理距离的增加提高遥远的节点之间的通信延迟(减少某些操作的性能) 44 | 45 | ## 如何架构分布式系统 46 | 适用于分布式系统架构的最常见的一个术语是SOA(面向服务架构)。SOA可以避免不愉快的CORBA(公共对象请求代理体系结构),通过WS - 标准,一套松散耦合的Web服务完成独立的小功能,并且彼此独立,他们是一个有弹性的分布式系统的基础。对比上一代,服务是新流程,他们是正确的抽象层次系统中的离散功能。 47 | * 地理. 系统是全球还是地区单独运行? 48 | * 数据隔离. 这个系统提供一个单个或多租户模型? 49 | * SLAs. 可用性 延迟 吞吐量 一致性和冗余性都必须定义。 50 | * 安全. IAAA (身份identity, 验证authentication, 授权authorization, 和 审核audit), 数据的保密性和隐私性都必须考虑 51 | * 可用性跟踪. 了解系统的使用是每天系统的日常运作,如容量规划。也可能用于执行计费系统的使用和/或治理(配额/速度限制)。 52 | * 部署和配置管理. 系统是如何部署更新? 53 | 54 | ### 分布式系统的模型抽象 55 | 56 | * 系统模型(异步/同步) 57 | * 失效模型(崩溃故障,分区) 58 | * 一致性模型(强,最终) 59 | 60 | ### CAP抉择 61 | 62 | * CA (consistency高一致性 + availability高可用性). 使用2pc 两阶段事务提交来保证。其缺点无法实现分区容错性,一旦某个操作失败,整个系统就出错,无法容忍(水至清则无鱼)。 63 | * CP (consistency高一致性 + partition tolerance分区容错性). 使用Paxos来保证,可用性降低。 64 | * AP (availability高可用性 + partition tolerance分区容错性). 使用Gossip等实现最终一致性,如Dynamo. 65 | 66 | ### 分布式系统的设计技巧:分区和复制 67 | 对于一个数据集有两种设计方式 68 | 1. 分区:它可以被分割在多个节点,以允许更多的并行处理。有更好的性能,但是容错能力低。 69 | 2. 复制:它也可以被复制或缓存在不同的节点上,以减少在客户端和服务器之间的距离,更强的容错能力,但是复制消耗性能。 70 | 关键是复制数据之间的一致性。弱一致性提供更低的延迟和更高的可用性。 71 | 72 | ### 分布式系统的设计技巧:时钟和顺序 73 |   分布式系统针对计算和存储的策略是不同的,对于数据的存储主要是分区和复制,而对于计算主要是保证事件的顺序,因为分布式计算任务是由事件驱动的,比如Storm等等。那么事件的顺序代表了业务逻辑的顺序,事件有时是树形嵌套事件,可靠性就是必须保证一个树形集合所有事件都得到网站执行是一个事务原子的。 74 | 75 | 76 | ## 相关链接 77 | [学习分布式系统需要怎样的知识?](https://www.zhihu.com/question/23645117) 78 |   79 | 80 | -------------------------------------------------------------------------------- /distributed/img/paxos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/distributed/img/paxos.png -------------------------------------------------------------------------------- /distributed/img/raft10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/distributed/img/raft10.png -------------------------------------------------------------------------------- /distributed/img/raft7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/distributed/img/raft7.png -------------------------------------------------------------------------------- /distributed/img/raft8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/distributed/img/raft8.png -------------------------------------------------------------------------------- /distributed/img/raft9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/distributed/img/raft9.png -------------------------------------------------------------------------------- /distributed/middleware/kafka-DelayOperation.md: -------------------------------------------------------------------------------- 1 | # DelayOperation 2 | 3 | ## DelayedFetch 4 | 存在DelayedFetch是为了更高效地fetch(batch fetch) 5 | 6 | ## DelayedProduce 7 | 存在DelayedProduce是为了等待更多副本的写入 8 | 9 | [Kafka源码分析 DelayOperation](http://zqhxuyuan.github.io/2016/01/15/2016-01-15-Kafka-Delay/) 10 | -------------------------------------------------------------------------------- /distributed/raft.md: -------------------------------------------------------------------------------- 1 | # Raft 协议 2 | 3 |     在了解Raft之前,我们先了解Consensus一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程 4 | 5 |     为了以容错方式达成一致,我们不可能要求所有服务器100%都达成一致状态,只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2 +1 就超过半数,代表大多数了。 6 | 7 |     Paxos和Raft都是为了实现Consensus一致性这个目标,这个过程如同选举一样,参选者需要说服大多数选民(服务器)投票给他,一旦选定后就跟随其操作。Paxos和Raft的区别在于选举的具体过程不同 8 | 9 |     在Raft中,任何时候一个服务器可以扮演下面角色之一: 10 | * eader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader. 11 | * Follower: 类似选民,完全被动 12 | * Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人。 13 | 14 |     Raft阶段分为两个,首先是选举过程,然后在选举出来的领导人带领进行正常操作,比如日志复制等。下面用图示展示这个过程: 15 | 1. 任何一个服务器都可以成为一个候选者Candidate,它向其他服务器Follower发出要求选举自己的请求: 16 | 2. 其他服务器同意了,发出OK。 17 |     注意如果在这个过程中,有一个Follower当机,没有收到请求选举的要求,因此候选者可以自己选自己,只要达到N/2 + 1 的大多数票,候选人还是可以成为Leader的。 18 | 3. 这样这个候选者就成为了Leader领导人,它可以向选民也就是Follower们发出指令,比如进行日志复制。 19 | 4. 以后通过心跳进行日志复制的通知 20 | 5. 如果一旦这个Leader当机崩溃了,那么Follower中有一个成为候选者,发出邀票选举。 21 | 6. Follower同意后,其成为Leader,继续承担日志复制等指导工作: 22 | 23 | ![raft7](https://github.com/micolore/blogs/blob/master/distributed/raft7.png) 24 | 25 |     Splite Vote是因为如果同时有两个候选人向大家邀票,这时通过类似加时赛来解决,两个候选者在一段timeout比如300ms互相不服气的等待以后,因为双方得到的票数是一样的,一半对一半,那么在300ms以后,再由这两个候选者发出邀票,这时同时的概率大大降低,那么首先发出邀票的的候选者得到了大多数同意,成为领导者Leader,而另外一个候选者后来发出邀票时,那些Follower选民已经投票给第一个候选者,不能再投票给它,它就成为落选者了,最后这个落选者也成为普通Follower一员了 26 | 27 | ## 日志复制 28 |     下面以日志复制为例子说明Raft算法,假设Leader领导人已经选出,这时客户端发出增加一个日志的要求,比如日志是"sally": 29 | ![raft8](https://github.com/micolore/blogs/blob/master/distributed/raft8.png)   30 | 31 | 2. Leader要求Followe遵从他的指令,都将这个新的日志内容追加到他们各自日志中: 32 | ![raft9](https://github.com/micolore/blogs/blob/master/distributed/raft9.png)   33 | 34 | 3.大多数follower服务器将日志写入磁盘文件后,确认追加成功,发出Commited Ok: 35 | ![raft10](https://github.com/micolore/blogs/blob/master/distributed/raft10.png) 36 |     对于每个新的日志记录,重复上述过程。 37 | 38 | 4. 在下一个心跳heartbeat中,Leader会通知所有Follwer更新commited 项目。 39 | 40 |     如果在这一过程中,发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwers了,那么Leader只能正常更新它能访问的那些Follower服务器,而大多数的服务器Follower因为没有了Leader,他们重新选举一个候选者作为Leader,然后这个Leader作为代表于外界打交道,如果外界要求其添加新的日志,这个新的Leader就按上述步骤通知大多数Followers,如果这时网络故障修复了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新。 41 | 42 | 总结:目前几乎所有语言都已经有支持Raft算法的库包 43 | -------------------------------------------------------------------------------- /distributed/redis-check-problem.emacs: -------------------------------------------------------------------------------- 1 | client list 2 | client kill 3 | slowlog get 10 结果为查询ID、发生时间、运行时长和原命令 默认10毫秒 4 | log 5 | redis.log 为主 6 | sentinel.log 监控日志 7 | info 8 | total_connections_received 连接数 9 | 服务可用 ping -> pong 10 | 正在执行的命令 monitor 生产慎用 11 | 12 | 延迟检查 13 | INFO commandstats 执行多少次命令 14 | 15 | RDB 分析内存相关 -------------------------------------------------------------------------------- /distributed/redis-check-problem.emacs~: -------------------------------------------------------------------------------- 1 | client list 2 | client kill 3 | slowlog get 10 结果为查询ID、发生时间、运行时长和原命令 默认10毫秒 4 | log 5 | redis.log 为主 6 | sentinel.log 监控日志 7 | info 8 | 9 | -------------------------------------------------------------------------------- /githup/stars.md: -------------------------------------------------------------------------------- 1 | # Githup all Stars 2 | 3 | 4 | ## Tutorial 5 | 6 | ## JAVA 7 | 8 | ## JAVA Script 9 | 10 | ## css 11 | [A curated collection of useful CSS snippets](https://github.com/atomiks/30-seconds-of-css) 12 | 13 | ## RUST 14 | 15 | ## VIM 16 | [Automatic programming in Vim. Works by copy-pasting Stack Overflow answers.](https://github.com/MilesCranmer/gso) 17 | [A community-driven modular vim distribution](https://github.com/SpaceVim/SpaceVim) 18 | ## OTHER 19 | 20 | ## Interview 21 | [技术面试需要掌握的基础知识整理](https://github.com/CyC2018/Interview-Notebook) 22 | 23 | ## Common 24 | [Switch hosts quickly!](https://github.com/oldj/SwitchHosts) 25 | [超级速查表](https://github.com/skywind3000/awesome-cheatsheets) 26 | 27 | ## ico 28 | [所有区块链(BlockChain)技术开发相关资料](https://github.com/chaozh/awesome-blockchain-cn) 29 | -------------------------------------------------------------------------------- /idea/idea.md: -------------------------------------------------------------------------------- 1 | # idea 2 | 3 | ## long time ago 4 | * a product? 5 | 6 | * up basic 7 | but how to make money ? ad ? uper? 8 | 9 | * music 10 | a play music ? 11 | 12 | * idea is great need long time to confirm! 13 | 14 | * infomation not symmetry 15 | 16 | * 我能体会到第一个说地球是圆的所面临的质疑了! 17 | 18 | * 伞兵思维 19 | 20 | * 同样的时间我花到英语上.半年我就可以谈笑风生了. 21 | 22 | * 每天进行思考之前发生的与之后发生的事情,有没有什么必然的联系。大脑需要大量的练习否则就是个猪! 23 | 24 | 25 | 26 | * 时间有限,不足以你分在其他的事情上面 27 | 没有恒心,也没有目标,随着时间流逝就慢慢的沦为泥沙了。 28 | 29 | 30 | ## all idea 31 | ### 06-21 32 | 建一个表情网站 33 | 类型、版本、组合 34 | 35 | ### 06-30 36 | 记录人一生的app 37 | 每天只记录今天的事情,让以后可以看到你每天都做了什么。类似之前的树洞。 38 | 25岁的现状并不是很满意,还需要继续加油. 39 | 40 | ### 09-06 41 | mysql的作者说,写代码的要有自己的项目,尽量能够开源。我的爬虫项目至今没有行动,idea从开始的不靠谱,到后面越来越成熟越有 42 | 更大的操作性 43 | 44 | ### 10-26 45 | 产品形式抄袭,内容也抄袭,没有任何创新,这特么是最坑爹的,没有任何原创的东西在里面。 46 | 框架可以抄袭别人的,内容为啥也要抄别人的 ,什么都不改,即使内容抄袭别人的,但也要让看的人喜欢这些。 47 | 48 | ### 11-28 49 | 这个私活让我熟悉了git,这是刚刚开始,以后要多写工作中会用到的工具。 50 | 例如 临时缓存,netty 51 | 多看开源的代码练手,下次出去面试有底气。 52 | 53 | ### 12-04 54 | a、每天传一张图,记录当天的所见所闻,一年之后翻阅放佛每天都在昨天。 55 | b、赞图 56 | 类似热搜 57 | 可评论 58 | 59 | > 极简主义 60 | 61 | ### 04-29 62 | life note 63 | 1. 每天只写一篇选择什么时间段可以看 64 | 65 | 66 | ## 07-02 67 | 做事情要专注,多去思考事情的反面,学会规划,掌控 68 | 69 | ## 2018-09-10 70 | 小程序记录相关 1/1 xx电影 xxx 0/1 玩 71 | 简单 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /idea/java-code: -------------------------------------------------------------------------------- 1 | action --- service 2 | action 负责校验,以及组装服务端需要的参数 3 | service 负责处理,并且返回处理的结果 4 | -------------------------------------------------------------------------------- /idea/language: -------------------------------------------------------------------------------- 1 | rust 2 | lua 3 | perl 4 | lua 5 | go 6 | ruby 7 | python 8 | java 9 | c 10 | c++ 11 | php 12 | java script 13 | 14 | 15 | 语言本身有自己的优势,能写出什么优秀的程序,有没有可以借鉴的思想,但主要还是看使用的人。 16 | java 有 storm、hadoop,也有20年历史了,使用人基数最多的语言之一了吧。 17 | 冷门语言有他自己的特殊用处,但是受众太小导致影响力不足。发展推广相对缓慢。 18 | 小语言的场景是针对性的,相对某些大语言是天生有他自己的优势所在的(春哥) 19 | 20 | 21 | -------------------------------------------------------------------------------- /idea/project: -------------------------------------------------------------------------------- 1 | 不会干-初学者 2 | 逼着干-懒人 3 | 给了干-没想法 4 | 自己干-有想法 5 | 干最好-有好想法 6 | 7 | 看到特么的不靠谱的产品经理,就想骂娘.一个app为什么要搞那么复杂,有很多的业务? 8 | 为什么看到的app都是那么的臃肿? 用户都特码的研究很久? 9 | 我特码以后绝壁要做一个牛逼的产品出来? 10 | 多留意身边的产品设计,有哪些可取之处,哪些垃圾产品?是不是订个小目标来锻炼这方面的能力? 11 | 12 | 写代码里面有产品思维的,产品里面懂写代码的? 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /idea/summarized: -------------------------------------------------------------------------------- 1 | 1、工作空间与系统的文件目录一定要清晰,记忆不如搜索好用。 2 | 定义关键字 3 | 2、 4 | -------------------------------------------------------------------------------- /idea/think.emacs: -------------------------------------------------------------------------------- 1 | ## think why? 2 | 3 | ## 为什么你看了很多书,却依然没有洞见? 4 | 最近在看中哲方面的书(劳思光的中国哲学史),看了也有几章了(孔子相关的、孟子相关的、宋明儒学的一部分) 5 | 有几个最直观的感触,人是哲学的核心,没有了人也没有哲学了,那么有了人,接下来是什么呢?人心,不管是什么观念,到最后 6 | 都是人去找自己合适的,或者天 或者自然 或者神仙 。这里不谈其他的,只谈谈人心,孔子说人有了自觉心才有了后面的其他一切 7 | 基础,如果没有了自觉心,其他以前一切都是徒劳的。-输入的时候感觉学到了,等等输出的时候才发现并没有自己的感悟,亦或者 8 | 没有建立自己的哲学知识体系,一团乱麻,还指望能怎么指导你的行为以及思想,想想都不可能。那么怎么才能建立自己的知识体系呢? 9 | 信息的载体都没有什么区别,唯一与那些人的区别是处理信息的方式(看书的方式不同) 10 | 怎么建立知识的联系? 11 | 1. 每看到一个有用的知识点,都停下来去寻找联系,看看有什么其他的现象能够被这个理论解释 12 | 真正导致人与人之间知识水平差异的,往往并不是知识数量,而是知识之间的联系 13 | 2. 构思知识的多种方法 14 | 我的哪些行为可以被这个知识改进? 15 | 很多人的问题并不是缺乏知识,而是到了某个时刻想不起来应该用什么知识 16 | 3. 尝试去探索事物背会的原因 17 | 对周围习以为常的时候,仍然积极地探索答案 18 | 很多人可以容忍生活中的奇怪现象和模糊性,在他们眼里,世界已经变得如此熟悉,所有的事情都可以见怪不怪了 19 | 直到后来,不知道什么时候,你对所有的事情都习以为常,失去了对世界的好奇心,也就渐渐的失去了洞察力,当你开始觉得 20 | 天是蓝的是因为它一直都是蓝的。公司有这个规定是因为它一直是那么做的,某个偏方有效是因为一千年来一直都是这样,那么你就事情了洞察力。 21 | 22 | ## 为什么你懂了很多道理,却现在依然过着混乱的生活状态? 23 | 24 | ## 怎么合理的安排时间? 25 | 26 | ## 学习的目的是什么? 27 | 28 | ## 你每天的、每个阶段、每个月的的目标是什么? 29 | 30 | 31 | -------------------------------------------------------------------------------- /idea/think.emacs~: -------------------------------------------------------------------------------- 1 | ## think 2 | 3 | ## 为什么你看了很多书,却依然没有洞见? 4 | -------------------------------------------------------------------------------- /idea/thinking/problems.md: -------------------------------------------------------------------------------- 1 | ## basic 2 | 3 | 1 思考与认知的区别,有什么联系没有? 4 | 2 思维与想法的区别?有哪些共同点? 5 | 3 人的行为由什么控制呢? 6 | 大脑为主和心里为辅,具体看个人是感性还是理性的 7 | 8 | ## work 9 | 10 | ### program 11 | #### dev 12 | 1. 关于bug的几个问题 13 | * 这个bug的现象是什么?bug的表现形式是什么? 14 | * 出现bug的原因是什么?为什么出现这个bug 15 | * 这个bug会不会引起别的地方bug?(影响范围) 16 | * 解决这个bug的方式是什么? 17 | * 以后还会不会出现类似的问题? 18 | 是不是可以做一个bug记录呢?个人名义或者公司或者项目名义的层面上。 19 | 20 | 2. 关于定义任务或者功能完成了的关键标准是什么? 21 | * 时间维度 22 | 当时有没问题,过几天有没问题,过几个月有没问题 23 | * 数量维度 24 | 一个人有没有问题,1w个人有没有问题,1kw有没有问题,这就是要考虑后期大数据量的层面上的问题 25 | 人都是不亲身经历就永远不会有记性 26 | 27 | 3. 线上服务的关注 28 | 服务器压力情况?是不是有数据支撑? 29 | * 缓存服务器 30 | 内存容量 31 | * 应用服务器 32 | 请求数量、响应时间 33 | * 数据库服务器 34 | * 文件服务器 35 | * 搜索服务器 36 | 37 | 如果每天的产生数据是不是清楚,否则就是在高速公路上闭着眼睛开车,你也就不是一个合格的负责人。 38 | 39 | -------------------------------------------------------------------------------- /idea/truth.md: -------------------------------------------------------------------------------- 1 | # 说理-陈嘉映 2 | ## field 3 | 环境 事中理 4 | 道近于宗教 而理近于科学 5 | 道是应该怎么样 理是所以然 6 | 道行之而成 可以创造,理本然存在,绝对不变 7 | 理规定一切,道完成一切 8 | 规律是外部说到事物 道理是内部说到事物 9 | #### 道与术 10 | 君子不器 11 | #### 凿与虚 12 | -------------------------------------------------------------------------------- /idea/webp-image-io-for-java.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/idea/webp-image-io-for-java.txt -------------------------------------------------------------------------------- /idea/word_idea.md: -------------------------------------------------------------------------------- 1 | ## work 2 | 工作上的想法、问题,每周都去check一遍,哪些可以实现,哪些只是个想法 3 | 4 | ### 2018-12-13 5 | 6 | 1. 现在线上服务器的缓存日益增加,怎么能更好的监控起来它的变化趋势呢? 7 | 数据库上 8 | 1M = 1024(KB) = 1048576(Byte) 9 | 8(bit) = 1(Byte) 10 | 计算机基础太差了,我真的不是一个合格的“架构师”. 11 | 12 | 2. 系统的缓存维护可以根据用户级别(user_id),增加相关的delete、init操作 13 | 一直以来都想做一个业务相关的缓存系统(类似中间件的概念),怎么设计呢? 14 | 15 | 3. 项目的进度控制(bug管理),迭代比较混乱怎么管理怎么办呢?有没什么好的方法? -------------------------------------------------------------------------------- /idea/每日三省吾身: -------------------------------------------------------------------------------- 1 | 2017-12-25 2 | 1、改掉说脏话的习惯,时刻记住 3 | 4 | 2017-12-26 5 | 1、晚上不吃肉,能超过11点才睡觉 6 | desc: 7 | 体检报告出来了,不是很理想,几个指标刚到警戒线,熬夜,超重,饮食问题,运动少都是主要的原因 8 | -------------------------------------------------------------------------------- /java/Design-pattern.md: -------------------------------------------------------------------------------- 1 | # 设计模式 2 | 3 | ## 设计模式分类 4 | 5 | * 创建型模式: 6 | 创建型模式涉及对象的实例化,特点是不让用户代码依赖于对象的创建或排列方式,避免用户直接使用new创建对象。 7 | 有以下几种,工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 8 | 9 | * 结构型模式: 10 | 结构型模式涉及如何组合类和对象以形成更大的结构,和类有关的结构型模式涉及如何合理使用继承机制;和对象有关的结构型模式涉及如何合理的使用对象组合机制。 11 | 有以下几种,适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 12 | 13 | * 行为型模式: 14 | 行为型模式涉及怎样合理的设计对象之间的交互通信,以及怎样合理为对象分配职责,让设计富有弹性,易维护,易复用。   15 | 有以下几种,策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 16 | 17 | 18 | ![](https://github.com/micolore/blogs/blob/master/java/img/design-patterns.jpg) 19 | 20 | ## 设计模式六大原则 21 | * 开闭原则(Open Close Principle) 22 | 23 | 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 24 | 25 | * 里氏代换原则(Liskov Substitution Principle) 26 | 27 | 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 28 | 29 | * 依赖倒转原则(Dependence Inversion Principle) 30 | 31 | 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 32 | 33 | * 接口隔离原则(Interface Segregation Principle) 34 | 35 | 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 36 | 37 | * 迪米特法则(最少知道原则)(Demeter Principle) 38 | 39 | 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 40 | 41 | * 合成复用原则(Composite Reuse Principle) 42 | 43 | 原则是尽量使用合成/聚合的方式,而不是使用继承。 44 | 45 | 46 | ## java 中的设计模式 47 | 48 | 49 | -------------------------------------------------------------------------------- /java/Elasticsearch.md: -------------------------------------------------------------------------------- 1 | ## Elasticsearch 2 | 3 | ### 4 | -------------------------------------------------------------------------------- /java/Executor.md: -------------------------------------------------------------------------------- 1 | # Executor 2 | 3 | ## ExecutorService 4 | 5 | ### AbstractExecutorService 6 | 7 | #### ThreadPoolExecutor 8 | ScheduledThreadPoolExecutor 比较特殊 9 | 10 | 11 | ## Future 12 | 13 | ### RunnableFuture 14 | 15 | ### FutureTask 16 | 17 | ## BlockingQueue 18 | 19 | * LinkedBlockingQueue 20 | * ArrayBlockingQueue 21 | * SynchronousQueue 22 | 23 | -------------------------------------------------------------------------------- /java/Lambda.md: -------------------------------------------------------------------------------- 1 | # Lambda 2 | -------------------------------------------------------------------------------- /java/Reactor.md: -------------------------------------------------------------------------------- 1 | # Reactor 2 | >在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式 3 | >其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作 4 | 5 | ## 什么是同步和异步? 6 | >同步和异步是针对应用程序和内核的交互而言的,消息通知机制而言 7 | >同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪   8 | >异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知   9 | ### 消息通知 10 | >异步的概念和同步相对。当一个同步调用发出后,调用者要一直等待返回消息(结果)通知后,才能进行后续的执行;当一个异步过程调用发出后,调 11 | > 用者不能立刻得到返回消息(结果)。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者 12 | > 具体实现依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制 13 | 1. 如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人, 14 | 总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误); 15 | 2. 如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。 16 | ## 什么是阻塞和非阻塞? 17 | >阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式, 18 | 说白了是一种读取或者写入操作函数的实现方式   19 | 阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务 20 | >阻塞方式下读取或者写入函数将一直等待 21 | >非阻塞方式下,读取或者写入函数会立即返回一个状态值 22 | 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 23 | 虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。 24 | 增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。 25 | 26 | ## 四种I/O模型 27 | 1. 同步阻塞 28 | >在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成, 29 | 只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式! 30 | 2. 同步非阻塞 31 | >在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪, 32 | 这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。 33 | 3. 异步阻塞 34 | >此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别, 35 | 同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的, 36 | 而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性! 37 | 异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞 38 | 4. 异步非阻塞IO 39 | >在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知, 40 | 此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作, 41 | 因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。 42 | 43 | # Reactor 44 | > 读取操作: 45 | >1. 应用程序注册读就需事件和相关联的事件处理器 46 | 47 | >2. 事件分离器等待事件的发生 48 | 49 | >3. 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器 50 | 51 | >4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理 52 | # Proactor 53 | > 读取 54 | >1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。 55 | 56 | >2. 事件分离器等待读取操作完成事件 57 | 58 | >3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。 59 | 60 | >4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。 61 | # Reactor和Proactor模式的主要区别 62 | > 从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的, 63 | Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程, 64 | 它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备. 65 | 66 | >同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁 67 | 而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。 68 | 69 | 参考连接: 70 | [reactor和proactor模式(epoll和iocp)](http://blog.csdn.net/zccracker/article/details/38686339) 71 | [聊聊同步、异步、阻塞与非阻塞](https://www.jianshu.com/p/aed6067eeac9) 72 | 73 | -------------------------------------------------------------------------------- /java/cache/cache-tips.md: -------------------------------------------------------------------------------- 1 | # cache tips 2 | 3 | ## 常见问题 4 | 5 | ### 缓存穿透 6 | 概念: 7 | 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。 8 | 如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。 9 | 解决思路: 10 | 1. 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。 11 | 2. 对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。 12 | 13 | ``` 14 | public object GetProductListNew() 15 | { 16 | const int cacheTime = 30; 17 | const string cacheKey = "product_list"; 18 | 19 | var cacheValue = CacheHelper.Get(cacheKey); 20 | if (cacheValue != null) 21 | return cacheValue; 22 | 23 | cacheValue = CacheHelper.Get(cacheKey); 24 | if (cacheValue != null) 25 | { 26 | return cacheValue; 27 | } 28 | else 29 | { 30 | cacheValue = GetProductListFromDB(); //数据库查询不到,为空。 31 | 32 | if (cacheValue == null) 33 | { 34 | cacheValue = string.Empty; //如果发现为空,设置个默认值,也缓存起来。 35 | } 36 |                CacheHelper.Add(cacheKey, cacheValue, cacheTime);//设置缓存时间,不要太长 37 |                 38 |                return cacheValue; 39 | } 40 | } 41 | 42 | ``` 43 | > 这里还要考虑一点就是,缓存何时进行更新还是没有逻辑进行触发更新。 44 |  尽量有入口进行自动或者手动进行调用更新缓存的操作 45 | 46 | ### 缓存雪崩 47 | 概念: 48 |   当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。   49 | 再详细点就是: 50 | 1. 服务提供者不可用 51 | 2. 重试加大流量 52 | 3. 服务调用者不可用 53 | 造成不可用的原因可能有多个: 54 | 1. 硬件故障 55 | 2. 程序Bug 56 | 3. 缓存击穿 57 | 4. 用户大量请求 58 | 59 | 重试加大流量的有两个原因: 60 | 1. 用户重试 61 | 2. 代码逻辑重试 62 | 63 | 服务调用者不可用的原因: 64 | 同步等待造成的资源耗尽 65 | 66 | 具体的解决策略: 67 | 1. 流量控制 68 | * 网关限流 69 | * 用户交互限流 70 | * 关闭重试 71 | 2. 改进缓存模式 72 | * 缓存预加载 73 | * 同步改为异步刷新 74 | 3. 服务自动扩容 75 | * AWS的auto scaling 76 | 4. 服务调用者降级服务 77 | * 资源隔离 78 | * 对依赖服务进行分类 79 | * 不可用服务的调用快速失败 80 | 81 | 解决思路: 82 | 1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。 83 | 相应的会减少系统的吞吐量为代价 84 | 2. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。 85 | 3. 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充) 86 | 87 | ``` 88 | public object GetProductListNew() 89 | { 90 | const int cacheTime = 30; 91 | const string cacheKey = "product_list"; 92 | //缓存标记。 93 | const string cacheSign = cacheKey + "_sign"; 94 | 95 | var sign = CacheHelper.Get(cacheSign); 96 | //获取缓存值 97 | var cacheValue = CacheHelper.Get(cacheKey); 98 | if (sign != null) 99 | { 100 | return cacheValue; //未过期,直接返回。 101 | } 102 | else 103 | { 104 | CacheHelper.Add(cacheSign, "1", cacheTime); 105 | ThreadPool.QueueUserWorkItem((arg) => 106 | { 107 | cacheValue = GetProductListFromDB(); //这里一般是 sql查询数据。 108 | CacheHelper.Add(cacheKey, cacheValue, cacheTime*2); //日期设缓存时间的2倍,用于脏读。 109 | }); 110 | 111 | return cacheValue; 112 | } 113 | } 114 | ``` 115 | 使用互斥锁: 116 | 业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。 117 | SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。在redis2.6.1之前版本未实现setnx的过期时间 118 | ``` 119 | //2.6.1前单机版本锁 120 | String get(String key) { 121 | String value = redis.get(key); 122 | if (value == null) { 123 | if (redis.setnx(key_mutex, "1")) { 124 | // 3 min timeout to avoid mutex holder crash 125 | redis.expire(key_mutex, 3 * 60) 126 | value = db.get(key); 127 | redis.set(key, value); 128 | redis.delete(key_mutex); 129 | } else { 130 | //其他线程休息50毫秒后重试 131 | Thread.sleep(50); 132 | get(key); 133 | } 134 | } 135 | } 136 | 137 | public String get(key) { 138 | String value = redis.get(key); 139 | if (value == null) { //代表缓存值过期 140 | //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db 141 | if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功 142 | value = db.get(key); 143 | redis.set(key, value, expire_secs); 144 | redis.del(key_mutex); 145 | } else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可 146 | sleep(50); 147 | get(key); //重试 148 | } 149 | } else { 150 | return value; 151 | } 152 | } 153 | 154 | ``` 155 | 156 | ### 缓存预热 157 | 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样避免,用户请求的时候,再去加载相关的数据 158 | 解决思路: 159 | 1. 直接写个缓存刷新页面,上线时手工操作下。 160 | 2. 数据量不大,可以在WEB系统启动的时候加载。 161 | 3. 定时刷新缓存, 162 | 163 | ### 缓存更新 164 | 缓存淘汰的策略有两种: 165 | 1. 定时去清理过期的缓存。 166 | 2. 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 167 | -------------------------------------------------------------------------------- /java/cache/cache-type.md: -------------------------------------------------------------------------------- 1 | # 集中式 2 | 3 | 1. OSCache 4 | 5 | OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。 6 | 7 | 2. JCache 8 | 9 | Java缓存新标准(javax.cache) 10 | 11 | 3. cache4j 12 | 13 | cache4j是一个有简单API与实现快速的Java对象缓存。它的特性包括:在内存中进行缓存,设计用于多线程环境,两种实现:同步与阻塞,多种缓存清除策略:LFU, LRU, FIFO,可使用强引用。 14 | 15 | 4. ShiftOne 16 | 17 | ShiftOneJavaObject Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。 18 | 19 | 5. WhirlyCache 20 | 21 | Whirlycache是一个快速的、可配置的、存在于内存中的对象的缓存。 22 | 23 | 6. Guava Cache 24 | 25 | Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。 26 | 27 | 28 | ## 分布式 29 | 1. Ehcache 30 | 31 | Ehcache是一个Java实现的开源分布式缓存框架,EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取。同时EhCache 扩展非常简单,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。 32 | 33 | 2. Cacheonix– 高性能Java分布式缓存系统 34 | 35 | Cacheonix同样也是一个基于Java的分布式集群缓存系统,它同样可以帮助你实现分布式缓存的部署。 36 | 37 | 3. JBoss Cache– 基于事物的Java缓存框架 38 | 39 | JBoss Cache是一款基于Java的事务处理缓存系统,它的目标是构建一个以Java框架为基础的集群解决方案,可以是服务器应用,也可以是Java SE应用。 40 | 41 | 4. Voldemort– 基于键-值(key-value)的缓存框架 42 | 43 | Voldemort是一款基于Java开发的分布式键-值缓存系统,像JBoss Cache一样,Voldemort同样支持多台服务器之间的缓存同步,以增强系统的可靠性和读取性能。 44 | 45 | 5. Redis 46 | 47 | Redis是基于内存、可持久化的日志型、Key-Value数据库高性能存储系统,并提供多种语言的API. 48 | 49 | 6. memcached 50 | 51 | memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较简单。memcached的分布式主要在于客户端,通过客户端的路由处理来搭建memcached集群环境,因此在服务端,memcached集群环境实际上就是一个个memcached服务器的堆积品,环境的搭建比较简单。下面从客户端做路由和服务端集群环境搭建两方面来谈如何让memcached分布式 52 | 53 | 54 | # note 55 | 使用集中式缓存,必须要注意不能在程序中操作缓存里面的数据,否则你会怀疑人生。 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /java/es.md: -------------------------------------------------------------------------------- 1 | ### 2 | ## comand 3 | 1. 索引统计信息 4 | http://192.168.1.5:9200/lop_search/_stats 5 | * 文档数量 6 | * 存储大小 7 | * 索引统计 8 | http://192.168.1.5:9200/lop_search/_stats/indexing 9 | http://192.168.1.5:9200/lop_search/_stats/merge,refresh 10 | -------------------------------------------------------------------------------- /java/guava.md: -------------------------------------------------------------------------------- 1 | # GUAVA 2 | 3 | ## 基本工具 4 | * 使用和避免null 5 | ``` 6 | Optional.fromNullable(collections).or(null); 7 | Optional.of(T) 8 | Optional.absent() 9 | //当你需要用一个默认值来替换可能的null,请使用 10 | Objects.firstNonNull(T, T) 11 | Optional.of(first).or(second) 12 | emptyToNull(String)) 13 | nullToEmpty(String)) 14 | isNullOrEmpty(String) 15 | ``` 16 | 17 | ## 集合 18 | 19 | ## 缓存 20 | 21 | ## 函数式编程 22 | 23 | ## 并发 24 | 25 | ## 字符串处理 26 | 27 | ## 原生类型 28 | 29 | ## 区间 30 | 31 | ## I/O 32 | 33 | ## 散列 34 | 35 | ## 事件 36 | 37 | ## 数学运算 38 | 39 | ## 反射 40 | 41 | [Google Guava官方教程(中文版)](https://willnewii.gitbooks.io/google-guava/content/index.html) 42 | -------------------------------------------------------------------------------- /java/img/design-patterns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/design-patterns.jpg -------------------------------------------------------------------------------- /java/img/java-exe-sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/java-exe-sort.png -------------------------------------------------------------------------------- /java/img/java-happens-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/java-happens-before.png -------------------------------------------------------------------------------- /java/img/java-img.md: -------------------------------------------------------------------------------- 1 | # java img 2 | -------------------------------------------------------------------------------- /java/img/java-memory-mode-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/java-memory-mode-1.png -------------------------------------------------------------------------------- /java/img/jvm/jvm-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/jvm/jvm-1.jpg -------------------------------------------------------------------------------- /java/img/jvm/jvm-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/jvm/jvm-2.png -------------------------------------------------------------------------------- /java/img/jvm/jvm-pic.md: -------------------------------------------------------------------------------- 1 | #jvm 2 | -------------------------------------------------------------------------------- /java/img/peactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/peactor.png -------------------------------------------------------------------------------- /java/img/proactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/img/proactor.png -------------------------------------------------------------------------------- /java/java-dev-standard.emacs: -------------------------------------------------------------------------------- 1 | java dev standard 2 | 语言在更新,思想有没有也在更新呢 3 | 4 | JAVA 开发规范 5 | 1.变量命名这种都不需要再强调了 6 | 1.1 命名 7 | 1.2 常量定义 8 | 1.3 代码格式 9 | 1.4 OOP规约 10 | 1.5 集合处理 11 | 详细参考:https://blog.csdn.net/dingjianmin/article/details/77433961 12 | 13 | 14 | 架构篇 15 | 为什么需要架构?可不可以不进行架构?怎么架构? 16 | 一一来解决上面的问题,架构可以让软件更好的适应业务的发展,不至于架构是业务发展的瓶颈,亦或者架构使组织的效率难以有更高的提示其实也是瓶颈 17 | 不架构意味着不去以丰富的经验来预测未来的发展情况,回归到最原始的开发方式,那样也是不适合现在的社会发展的。怎么架构,不是简单简单的选择几个 18 | 组件就是架构了,那是最简单的层次架构,其实把这些事情做好也是不容易的,那需要很厚的技术功底。最近几年开始流行业务架构师了,他不是单纯的技术 19 | 架构师而是业务与技术共存,可能他不是一个牛逼的工程师,但是他是一个很了解实际业务的人,技术终归是技术,如果脱离了业务那么技术一文不值,这个 20 | 观点我以前是很认同,但是现在我认为这个也是不对的,技术与业务就是鸡和蛋的问题,两者都是重要的,无论谁先谁后都是可以的,都可以说的通,关键是 21 | 你怎么去看待它。 22 | 那么怎么系统的去思考架构这个东西呢?怎么能更好的运用它? 23 | 从技术角度上看,是系统的稳定性、安全性、易用性等等,从业务角度上看,是开发人员与业务人员的效率提升的保障。简单的说就是系统更稳定,而且技术能 24 | 够随着业务的发展,不会阻碍业务的快速发展。 25 | 架构的核心思想 26 | 1. 满足业务发展需求是最高准则 27 | 2. 业务建模,抽象和枚举是两种方式,需要平衡,不能走极端 28 | 3. 模型要能更真实的反应事物的本质,不是名词概念的堆砌,不能过度设计 29 | 4. 基础架构最关键的是分离不同业务领域、不同技术领域,让整个系统具有持续优化的能力 30 | 5. 分离基础服务、业务规则、业务流程,选择合适的工具外化业务规则和业务流程 31 | 6. 分离业务组件和技术组件,高内聚,低耦合 - 业务信息的执行可以分散,但业务信息的管理要尽量集中 32 | 7. 不要让软件的逻辑架构与最后物理部署绑死 - 选择合适的技术而不是高深的技术,随着业务的发展调整使用的技术 33 | 8. 好的系统架构需要合适的组织架构去保障 - 团队成员思想的转变,漫长而艰难 34 | 9. 业务架构、系统架构、数据模型 35 | 下面讨论技术架构、业务架构、应用架构、数据架构等相关的问题 36 | 遇到一个新的系统,怎么架构? 37 | 首先,业务分析、系统划分、系统分层、模块化 38 | 然后,考虑模块化,水平、垂直、单一职责、不易变or易变 39 | 最后考虑系统的稳定性,流控、容灾、稳定性、容量规划 -------------------------------------------------------------------------------- /java/java-dev-standard.emacs~: -------------------------------------------------------------------------------- 1 | java dev standard 2 | 语言在更新,思想有没有也在更新呢 3 | 4 | JAVA 开发规范 5 | 1.变量命名这种都不需要再强调了 6 | 1.1 命名 7 | 1.2 常量定义 8 | 1.3 代码格式 9 | 1.4 OOP规约 10 | 1.5 集合处理 11 | 详细参考:https://blog.csdn.net/dingjianmin/article/details/77433961 12 | 13 | 14 | 架构篇 15 | 为什么需要架构?可不可以不进行架构?怎么架构? 16 | 一一来解决上面的问题,架构可以让软件更好的适应业务的发展,不至于架构是业务发展的瓶颈,亦或者架构使组织的效率难以有更高的提示其实也是瓶颈 17 | 不架构意味着不去以丰富的经验来预测未来的发展情况,回归到最原始的开发方式,那样也是不适合现在的社会发展的。怎么架构,不是简单简单的选择几个 18 | 组件就是架构了,那是最简单的层次架构,其实把这些事情做好也是不容易的,那需要很厚的技术功底。最近几年开始流行业务架构师了,他不是单纯的技术 19 | 架构师而是业务与技术共存,可能他不是一个牛逼的工程师,但是他是一个很了解实际业务的人,技术终归是技术,如果脱离了业务那么技术一文不值,这个 20 | 观点我以前是很认同,但是现在我认为这个也是不对的,技术与业务就是鸡和蛋的问题,两者都是重要的,无论谁先谁后都是可以的,都可以说的通,关键是 21 | 你怎么去看待它。 22 | 那么怎么系统的去思考架构这个东西呢?怎么能更好的运用它? 23 | 从技术角度上看,是系统的稳定性、安全性、易用性等等,从业务角度上看,是开发人员与业务人员的效率提升的保障。简单的说就是系统更稳定,而且技术能 24 | 够随着业务的发展,不会阻碍业务的快速发展。 25 | 架构的核心思想 26 | 1. 满足业务发展需求是最高准则 27 | 2. 业务建模,抽象和枚举是两种方式,需要平衡,不能走极端 28 | 3. 模型要能更真实的反应事物的本质,不是名词概念的堆砌,不能过度设计 29 | 4. 基础架构最关键的是分离不同业务领域、不同技术领域,让整个系统具有持续优化的能力 30 | 5. 分离基础服务、业务规则、业务流程,选择合适的工具外化业务规则和业务流程 31 | 6. 分离业务组件和技术组件,高内聚,低耦合 - 业务信息的执行可以分散,但业务信息的管理要尽量集中 32 | 7. 不要让软件的逻辑架构与最后物理部署绑死 - 选择合适的技术而不是高深的技术,随着业务的发展调整使用的技术 33 | 8. 好的系统架构需要合适的组织架构去保障 - 团队成员思想的转变,漫长而艰难 34 | 9. 业务架构、系统架构、数据模型 35 | 下面讨论技术架构、业务架构、应用架构、数据架构等相关的问题 36 | -------------------------------------------------------------------------------- /java/java-log-log4j.md: -------------------------------------------------------------------------------- 1 | # log4j 2 | 3 | ## history 4 | 1996 5 | ## development 6 | 7 | ## structure 8 | 9 | ### Logger 10 | 公共类Logger, 负责处理日志记录的大部分操作 11 | ALL 打开所有日志 12 | DEBUG 细粒度信息事件,对调试应用程序是非常有帮助的 13 | INFO 粗粒度信息事件,突出强调应用程序的运行过程 14 | WARN 可能出现潜在错误的情形 15 | ERROR 虽然发生错误事件,但仍然不影响系统的继续运行 16 | FATAL 指出每个严重的错误事件将会导致应用程序的退出 17 | OFF 关闭所有日志 18 | 19 | ### Appender 20 | 公共接口Appender,负责控制日志记录操作的输出 21 | ConsoleAppender 使用用户指定的布局(layout)输出日志事件到System.out或者 System.err。默认的目标是System.out 22 | FileAppender 把日志事件写入一个文件 23 | DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录 24 | RollingFileAppender 扩展FileAppender,备份容量达到一定大小的日志文件 25 | WriterAppender 根据用户的选择把日志事件写入到Writer或者OutputStream 26 | SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件 27 | SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象 28 | SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象 29 | SyslogAppender 给远程异步日志记录的后台精灵程序(daemon)发送消息 30 | TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender 31 | 32 | ### Layout 33 | 公共抽象类,负责格式化Appender的输出 34 | HTMLLayout 格式化日志输出为HTML表格 35 | PatternLayout 根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式 36 | SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息 37 | 38 | ## Features 39 |  logback 、log4j2 40 | 41 | ### PatternLayout-ConversionPattern 42 | * %m 输出代码中指定的消息 43 | * %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 44 | * %r 输出自应用启动到输出该log信息耗费的毫秒数 45 | * %c 输出所属的类目,通常就是所在类的全名 46 | * %t 输出产生该日志事件的线程名 47 | * %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” 48 | * %d 输出日志时间点的日期或时间。默认格式为ISO8601,也可以在其后指定格式。比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22:10:28, 921 49 | * %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 50 | -------------------------------------------------------------------------------- /java/java-quartz.md: -------------------------------------------------------------------------------- 1 | # quartz 2 | 3 | ## Cron Trigger Tutorial 4 | 5 | ### Cron Expressions 6 | * Seconds 7 | * Minutes 8 | * Hours 9 | * Day of month 10 | * Month 11 | * Day of week 12 | * Year 13 | 14 | ### Special characters 15 | 1. *(“all values”) - used to select all values within a field. For example, “” in the minute field means *“every minute”. 16 | 2. ? (“no specific value”) - useful when you need to specify something in one of the two fields in which the character is allowed, but not the other. For example, if I want my trigger to fire on a particular day of the month (say, the 10th), but don’t care what day of the week that happens to be, I would put “10” in the day-of-month field, and “?” in the day-of-week field. See the examples below for clarification. 17 | 3. \- used to specify ranges. For example, “10-12” in the hour field means “the hours 10, 11 and 12” 18 | 4. , - used to specify additional values. For example, “MON,WED,FRI” in the day-of-week field means “the days Monday, Wednesday, and Friday”. 19 | 5. / - used to specify increments. For example, “0/15” in the seconds field means “the seconds 0, 15, 30, and 45”. And “5/15” in the seconds field means “the seconds 5, 20, 35, and 50”. You can also specify ‘/’ after the ‘’ character - in this case ‘’ is equivalent to having ‘0’ before the ‘/’. ‘1/3’ in the day-of-month field means “fire every 3 days starting on the first day of the month”. 20 | 6. L (“last”) - has different meaning in each of the two fields in which it is allowed. For example, the value “L” in the day-of-month field means “the last day of the month” - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means “7” or “SAT”. But if used in the day-of-week field after another value, it means “the last xxx day of the month” - for example “6L” means “the last friday of the month”. You can also specify an offset from the last day of the month, such as “L-3” which would mean the third-to-last day of the calendar month. When using the ‘L’ option, it is important not to specify lists, or ranges of values, as you’ll get confusing/unexpected results. 21 | 7 W (“weekday”) - used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify “15W” as the value for the day-of-month field, the meaning is: “the nearest weekday to the 15th of the month”. So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify “1W” as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not ‘jump’ over the boundary of a month’s days. The ‘W’ character can only be specified when the day-of-month is a single day, not a range or list of days. 22 | > The 'L' and 'W' characters can also be combined in the day-of-month field to yield 'LW', which translates to *"last weekday of the month"*. 23 | 8. \# - used to specify “the nth” XXX day of the month. For example, the value of “6#3” in the day-of-week field means “the third Friday of the month” (day 6 = Friday and “#3” = the 3rd one in the month). Other examples: “2#1” = the first Monday of the month and “4#5” = the fifth Wednesday of the month. Note that if you specify “#5” and there is not 5 of the given day-of-week in the month, then no firing will occur that month. 24 | 25 | ### example 26 | 27 | + 0 0 12 * * ? Fire at 12pm (noon) every day 28 | + 0 15 10 ? * * Fire at 10:15am every day 29 | + 0 15 10 * * ? Fire at 10:15am every day 30 | + 0 15 10 * * ? * Fire at 10:15am every day 31 | + 0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005 32 | + 0 * 14 * * ? Fire every minute starting at 2pm and ending at 2:59pm, every day 33 | + 0 0/5 14 * * ? Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day 34 | + 0 0/5 14,18 * * ? Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day 35 | + 0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day 36 | + 0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. 37 | + 0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday 38 | + 0 15 10 15 * ? Fire at 10:15am on the 15th day of every month 39 | + 0 15 10 L * ? Fire at 10:15am on the last day of every month 40 | + 0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month 41 | + 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month 42 | + 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month 43 | + 0 15 10 ? * 6L 2002-2005 Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005 44 | + 0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month 45 | + 0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. 46 | + 0 11 11 11 11 ? Fire every November 11th at 11:11am. 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /java/jdk/comand.md: -------------------------------------------------------------------------------- 1 | # comand 2 | 首先怎么进行分类,就是在你的大脑中怎么进行定义这些点,否则是很难理解这些知识点的。其次在这里,命令固然重要,但是命令所产生的数据,数据带来的背后的本质 3 | 更加的重要。这样你才能理解所以然。这些需要系统进行理解,因为你遇到的问题可能是孤立的,临时解决了它,并不会在你的脑海中留下什么印象,得到什么深刻的启发 4 | ,所以下次你还遇到这个问题,可能还只剩下印象,其他的都忘记了。很常见的问题,但是怎么解决呢?有什么方法解决这样的问题呢?1.扩展自己的知识结构2思考问题 5 | 背后的原因(why)3建立问题之间的联系,其实就是建立知识点与知识点之间的联系。 6 | ## basic 7 | * 查看当前系统Java运行的进程PID 8 | jps -l 9 | * 查看内存占用情况 10 | jmap -heap PID 11 | * 查看进程所包含的线程情况 12 | jstack PID 13 | * 查看GC情况 14 | jstat -gcutil -t PID 15 | -------------------------------------------------------------------------------- /java/jvm/classloader.md: -------------------------------------------------------------------------------- 1 | # 类加载器 2 | 3 | ## 加载器类型 4 | * Bootstrap类加载器 5 | 负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器,也称类初始化加载器 6 | * Extension 7 | 从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类,sun.misc.Launcher$ExtClassLoader 8 | * System 9 | Application类加载器,classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义, 10 | 或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher$AppClassLoader实现 11 | 12 | ## 工作机制 13 | * 可见性 14 | * 委托 15 | * 单一性 16 | 根据这个机制,父加载器加载过的类不能被子加载器加载第二次 17 | 18 | ## 如何显示的加载类 19 | Class.forName(classname)和Class.forName(classname, initialized, classloader)。defineClass()字节码转换成类实例 20 | ### 类加载的过程 21 | * 加载:类加载过程的一个阶段:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Class对象 22 | 23 | * 验证:目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。 24 | 25 | * 准备:为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即0(如static int i=5;这里只将i初始化为0,至于5的值将在初始化时赋值),这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。 26 | 27 | * 解析:主要将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析(这里涉及到字节码变量的引用,如需更详细了解,可参考《深入Java虚拟机》)。 28 | 29 | * 初始化:类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)。 30 | 31 | ## 双亲委派机制 32 | 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式 33 | 34 | ### 双亲委派机制的优势 35 | 采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载 36 | 另外一个是安全(java.lang.Integer) 37 | 38 | ## ClassLoader 39 | * loadClass(String className)、loadClass(String name, boolean resolve) 40 | ``` 41 | protected Class loadClass(String name, boolean resolve) 42 | throws ClassNotFoundException 43 | { 44 | synchronized (getClassLoadingLock(name)) { 45 | // 先从缓存查找该class对象,找到就不用重新加载 46 | Class c = findLoadedClass(name); 47 | if (c == null) { 48 | long t0 = System.nanoTime(); 49 | try { 50 | if (parent != null) { 51 | //如果找不到,则委托给父类加载器去加载 52 | c = parent.loadClass(name, false); 53 | } else { 54 | //如果没有父类,则委托给启动加载器去加载 55 | c = findBootstrapClassOrNull(name); 56 | } 57 | } catch (ClassNotFoundException e) { 58 | // ClassNotFoundException thrown if class not found 59 | // from the non-null parent class loader 60 | } 61 | 62 | if (c == null) { 63 | // If still not found, then invoke findClass in order 64 | // 如果都没有找到,则通过自定义实现的findClass去查找并加载 65 | c = findClass(name); 66 | 67 | // this is the defining class loader; record the stats 68 | sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); 69 | sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); 70 | sun.misc.PerfCounter.getFindClasses().increment(); 71 | } 72 | } 73 | if (resolve) {//是否需要在加载时进行解析 74 | resolveClass(c); 75 | } 76 | return c; 77 | } 78 | } 79 | ``` 80 | * findClass(String) 81 | ``` 82 | protected Class findClass(String name) throws ClassNotFoundException { 83 | throw new ClassNotFoundException(name); 84 | } 85 | ``` 86 | -------------------------------------------------------------------------------- /java/jvm/g1.md: -------------------------------------------------------------------------------- 1 | # G1 2 | ## JVM体系 3 | ### HotSpot 4 | * 类加载器 5 | * 运行时数据区 6 | * 执行引擎 7 | > 对jvm调优的时候有三大组件需要关注 1、堆 2、jit 3、垃圾收集器 8 | 9 | ## 性能基础 10 | 两个指标 11 | 1. 响应速度 12 | * 程序ui响应多灵敏 13 | * 网站页面响应多块 14 | * 数据库查询多块 15 | 对响应速度要求很高的系统,不能有较大的停顿时间(large pause times)。 16 | 2. 吞吐量 17 | * 给定时间内的完成事务数 18 | * 每小时批处理系统能够完成的作业数量 19 | * 每小时能完成多少数据库查询 20 | 在吞吐量方面优化的系统, 停顿时间长(High pause times)也是可以接受的 21 | ## Garbage Collector 22 | G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停 23 | 顿时间要求的同时,还具备高吞吐量性能特征. 24 | G1的长期目标是取代CMS(Concurrent Mark-Sweep Collector, 并发标记-清除) 25 | 26 | ### 堆内存 27 | * 年轻代(younggeneration) 28 | * 年老代(old generation) 29 | * 以及持久代(permanent generation) 30 | 31 | 32 | 33 | ## 34 | -------------------------------------------------------------------------------- /java/jvm/gc-algorithm.md: -------------------------------------------------------------------------------- 1 | # 垃圾收集算法 2 | 3 | ## 理解 throughput收集器 4 | 基本操作: 5 | 1. 回收新生代的垃圾 6 | 一般在eden区空间快用尽时,把eden空间所有对象移走,一部分对象会移动到survivor空间 其他会被移动到老年代 7 | Minor GC 8 | ``` 9 | 17.806: [GC [PSYoungGen: 227983K->14463K(264128K)] 280122K->66610K(613696K), 0.0169320 secs] 10 | [Times: user=0.05 sys=0.00, real=0.02 secs] 11 | ``` 12 | 13 | 2. 回收老年代的垃圾 14 | Full GC 15 | ``` 16 | 64.546: [Full GC [PSYoungGen: 15808K->0K(339456K)] 17 | [ParOldGen: 457753K->392528K(554432K)] 473561K->392528K(893888K) 18 | [PSPermGen: 56728K->56728K(115392K)], 1.3367080 secs] 19 | [Times: user=4.44 sys=0.01, real=1.34 secs] 20 | ``` 21 | 结论: 22 | 1. throughput 收集器 会进行两种操作 分别是Minor Gc 和 Full Gc 23 | 2. 通过 GC日志中的时间输出,我们可以判断throughput收集器的gc操作对应用程序总体性能的影响 24 | 25 | ### 堆大小的自适应调整和景泰调整 26 | Throughput 收集器的调优总是围绕着停顿时间进行的,寻求堆的总体大小,新生代的大小以及老年代的大小之间平衡 27 | 两种取舍: 28 | 1. 时间与空间的取舍 29 | 2. 取舍与完成垃圾回收所需的时长相关 30 | 采用动态调整是进行堆调优极好的入手点 31 | 静态地设置堆的大小也可能获得最优的性能 32 | 33 | 34 | ## 理解cms收集器 35 | 基本操作: 36 | 1. cms收集器会对新生代的对象进行回收 所有的应用线程暂停 37 | 2. cms收集器会启动一个并发的线程对老年代空间的垃圾进行回收 38 | 3. 如果有必要,cms会引发full gc 39 | 40 | 结论: 41 | 1. cms垃圾回收有多个回收操作,但是期望的操作是Minor GC和并发回收 42 | 2. cms收集过程中的并发模式失效以及晋升失败的代价非常昂贵,我们尽量调优cms收集器以避免这种情况 43 | 3. 默认情况下cms收集器不会对永久代进行垃圾回收 44 | 45 | ### 针对并发模式失效的调优 46 | 避免cms收集器并发模式失效的方法 47 | 1. 想办法增大老年代空间,要么只移动部分的新生代对象到老年代,要么增加更多的堆空间 48 | 2. 以更高的频率运行后台回收线程 49 | 3. 使用更多的后台回收线程 50 | -XX:CMSInitiatingOccupancyFraction=N 和 -XX:+UseCMSInitiatingOccupancyOnly  更早的启动并发收集周期 51 | -XX:ConcGCThreads=N 调整cms后台线程 52 | 53 | ### cms收集器的永久代调优 54 | -XX:+CMSPermGenSweepingEnabled 永久代中的垃圾使用与老年代同样的方式进行垃圾收集 55 | -XX:CMSInitiatingPermOccupancyFraction=N 指定 CMS 收集器在永久代空间占用比达到设定值时启动永久代垃圾回收线程 56 | 57 | -XX:+CMSClassUnloadingEnabled 58 | -XX:CMSIncrementalSafetyFactor=N 59 | -XX:CMSIncrementalDutyCycleMin=N 和 -XX:CMSIncrementalPacing 60 | -XX:+CMSIncrementalMode 61 | 可以控制垃圾收集后台线程为应用程序线程让出多少 CPU 周期 62 | 63 | 增量式 CMS 垃圾收集依据责任周期(duty cycle)原则进行工作 64 | 责任周期的时间长度是以新生代相邻两次垃圾收集之间的时间长度计算得出的   65 | -CMSIncrementalDutyCycleMin 受jvm自动调整影响,可以使用CMSIncrementalDutyCycle 关闭自动调节 66 | ### 增量式cms收集器 67 | 68 | ## 理解g1收集器 69 | 工作在堆内不同分区(region)的收集器,又为首先收集垃圾最多的分区 70 | 71 | 为老年代设计分区的初衷是我们发现并发后台线程在回收老年代中,没有引用的对象时,有的分区垃圾对象的数量很多,另一些分区的垃圾对象相对较少。虽然分区的垃圾收集工作实际仍然会暂停应用程序线程,不过由于 G1 收集器专注于垃圾最多的分区,最终的效果是花费较少的时间就能回收这些分区的垃圾     72 | 73 | 基本操作: 74 | 1. 新生代垃圾收集 75 | 2. 后台收集 并发周期 76 | 3. 混合式垃圾收集 77 | 4. 以及必要的full gc 78 | 79 | 结论: 80 | 1. g1 垃圾收集包含多个周期 ,调优良好的jvm运行g1收集器时应该只经历 新生代周期、混合式周期、并发gc周期 81 | 2. g1 的并发阶段会产生少量的停顿 82 | 3. 恰当的时候,对g1进行调优,才能避免full gc周期发生 83 | 84 | ### g1垃圾收集器调优 85 | 主要目标就是避免发生并发模式失败或者疏散失败     86 | * 通过增加总的堆空间大小或者调整老年代、新生代之间的比例来增加老年代空间的 87 | 大小。 88 | * 增加后台线程的数目(假设我们有足够的 CPU 资源运行这些线程)。 89 | * 以更高的频率进行 G1 的后台垃圾收集活动。 90 | * 在混合式垃圾回收周期中完成更多的垃圾收集工作。 91 | -XX:MaxGCPauseMillis=N   200ms 92 | ## 高级调优 93 | ### 晋升及survivor空间 94 | 1. 设计 Survivor 空间的初衷是为了让对象(尤其是已经分配的对象)在新生代停留更多的 GC 周期。这个设计增大了对象晋升到老年代之前被回 95 | 收释放的几率。 96 | 2. 如果 Survivor 空间过小,对象会直接晋升到老年代,从而触发更多的老年代 GC。 97 | 3. 解决这个问题的最好方法是增大堆的大小(或者至少增大新生代),让JVM 来处理 Survivor 空间的回收。 98 | 4. 有的情况下,我们需要避免对象晋升到老年代,调整晋升阈值或者Survivor 空间的大小可以避免对象晋升到老年代 99 | ### 分配大对象 100 | Thread Local Allocation Buffer,TLAB 线程本地分配缓冲区 101 | -XX:+PrintTLAB 102 | ``` 103 | TLAB: gc thread: 0x00007f3c10b8f800 [id: 18519] desired_size: 221KB 104 | slow allocs: 8 refill waste: 3536B alloc: 0.01613 11058KB 105 | refills: 73 waste 0.1% gc: 10368B slow: 2112B fast: 0B 106 | ``` 107 | ### aggressiveheap标志 108 | 1. AggressiveHeap 是个历史悠久的调优标志,设计初衷是为了在强大的机 109 | 器上运行单一 JVM 时调整堆的各种参数。 110 | 2. 这个标志设定的值并没有随着 JVM 技术的发展同步调整,因此它的有 111 | 效性从长远来看是值得质疑的(虽然到目前为止,这个标志还常常被 112 | 使用) 113 | ### 全盘掌握堆空间的大小 114 | 1. 大多数的机器上堆的初始空间和最大空间的默认值计算是比较直观的。 115 | 2. 达到堆大小的临界情况时,需要考虑的因素更多,计算也更加复杂。 116 | -------------------------------------------------------------------------------- /java/jvm/gc.md: -------------------------------------------------------------------------------- 1 | # 垃圾收集入门 2 | 3 | ## 主流垃圾回收收集器 4 | * Serial收集器 5 | * Throughput(Parallel)收集器 6 | * Concurrent(CMS)收集器 7 | * G1收集器 8 | cms 与g1 称为concurrent垃圾收集器,属于低停顿收集器,当然也有代价就是消耗更多的cpu 9 | 10 | ## 概述 11 | 垃圾收集主要分两部 1 查找不再使用的对象 2 以及如何释放这些对象的内存 12 | ### 分代垃圾收集器 13 | * 新生代 14 | 1. eden 15 | 2. survivor 16 |   form 、to 17 | * 老年代 18 | 当新生代的内存填满时会发生minor gc,这种方式的好处有两个1新生代仅仅是堆的一部分,与处理整个堆相比,处理新生代的速度更快 19 | 意味着应用线程停顿的时间也越短(stw),但是停顿的次数会变多。2 源于新生代中对象的分配方式,对象分配到eden空间 垃圾收集时 20 | eden空间的对象要么移走要么被回收,所有存活的对象要么被移动survivor空间要么被移动到老年代,这回自动产生了一次压缩整理,最终 21 | 老年代也会不断的变大,然后开始回收老年代,full gc产生,通常会导致应用长时间的停顿 22 | 考虑垃圾收集器 主要考虑单个请求与批量应用进行考量 23 | ### GC算法 24 | 1. Serial垃圾收集器 25 | 2. Throughput垃圾收集器 26 | 3. CMS收集器 27 | 4. G1垃圾收集器 28 | ### 选择GC算法 29 | 耗时、吞吐量、平均响应时间 30 | * GC算法及批量任务 31 | * GC算法和吞吐量测试 32 | * GC算法及响应时间测试 33 | * CMS收集器和G1收集器之间的抉择 34 | ## GC调优基础 35 | ###  调整堆的大小 36 | 堆的大小影响系统停顿的时间 37 | 首个原则就是尽量不要把堆的大小设置大于机器的物理内存 38 | 虽然可以大于,但是GC会以数个数量级的停顿时间 39 | 两个参数 40 | * 初始值 -xms 41 | * 最大值 -xmx 42 | 43 | ###  代空间的调整 44 | 新生代过大,导致回收次数变少,full gc可能相应的变多 45 | 1. 新生代空间调整 46 | -XX:NewRatio=N 设置新生代与老年代的空间占用比率 默认为2 47 | -XX:NewSize=N  设置新生代初始化的值 48 | -XX:MaxNewSize=N 设置新生代空间的最大大小 49 | -XmnN   快捷方法 new & max 50 | 计算公式: 51 | Initial Young Gen Size = Initial Heap Size / (1 + NewRatio)     52 | 默认情况下 新生代占初始堆大小的33% 53 | 小结: 54 | 1. 整个堆范围内,不同代的大小划分是由新生代所占用的空间控制的 55 | 2. 新生代的大小会随着整个堆的大小而增长,但这也是随着整个堆的空间比率波动变化的。 56 | 57 | ### 永久代与元空间的调整 58 | Permgen 或Permanent Generation,java8 称之为metabace 59 | > 类的元数据     60 | >永久代和元空间内保存的信息只对编译器或者jvm运行时有用     61 | 永久代或者元空间的大小与程序所使用的类的数量成比率相关 62 | 63 | ###  控制并发 64 | 几乎所有的垃圾收集算法中基本的垃圾回收线程都依据机器上的cpu数目计算得出     65 | 多个jvm运行同一个物理机上时,依据公式计算出的线程数会过高,必须进行减少 66 | 67 | ###  自适应调整 68 | 1. jvm在堆的内部如何调整新生代及老年代的百分比是由自适应调整机制控制的 69 | 2. 通常情况下我们应该开启它,因为垃圾回收算法依赖于调整后的代的大小来达到它停顿时间的性能指标 70 | 3. 对于已经精细调整过的堆,可以关闭自适应调整以提升性能 71 | 72 | ## 垃圾回收工具 73 | 开启GC日志 -verbose:gc 或者 -XX:+PrintGC 74 | -XX:+PrintGCDetails  更详细的 75 | -XX:+PrintGCTimeStamps  推荐 76 | -XX:+PrintGCDateStamps 精确判断gc操作之间的时间 77 | -Xloggc:filename 输出到某个文件 78 | 79 | # 概念 80 | ## 不再引用与不再需要 81 | 前者是从虚拟机的角度看对象,后者是从人的角度上看程序 82 | 83 | ## 定义垃圾的标准是什么 84 | 根对象与某个对象之间还有引用路径 85 | 86 | ## java 对象的size byte为单位 87 | java.lang.Object 8 88 | java.lang.Float 16 89 | java.lang.Double 16 90 | java.lang.Integer 16 91 | java.lang.Long 16 92 | java.math.BigInteger 56 (*) 93 | java.lang.BigDecimal 72 (*) 94 | java.lang.String 2*(Length) + 38 ± 2 95 | empty java.util.Vector 80 96 | object reference 4 97 | float array 4*(Length) + 14 ± 98 | ## obj= null 有没有必要? 99 | 如果obj是局部变量那么这样写没有任何价值,因为一旦作用域结束,虚拟机会自动收集 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /java/jvm/heap.md: -------------------------------------------------------------------------------- 1 | # heap 2 | 3 | ## 堆分析 4 | ### 堆直方图 5 | jcmd 19941 GC.class_histogram 6 | jmap -histo process_id 7 | jmap -histo:live process_id 8 | 9 | ### 堆转储 10 | jcmd process_id GC.heap_dump /path/to/heap_dump.hprof 11 | jmap -dump:live,file=/path/to/heap_dump.hprof process_id 12 | 13 | 1. 了解哪些对象正在消耗内存,是了解要优化代码中哪些对象的第一步。 14 | 2. 对于识别由创建了太多某一特定类型对象所引发的内存问题,直方图这 15 | 一方法快速且方便。 16 | 3. 堆转储分析是追踪内存使用的最强大的技术,不过要利用好,则需要一 17 | 些耐心和努力。 18 | ### 内存溢出错误 19 | JVM 没有原生内存可用: 20 | * 永久代(在 Java 7 和更早的版本中)或元空间(在 Java 8 中)内存不足 21 | 如果你正在编写的应用会创建并丢弃大量类加载器,一定要非常谨慎,确保类加载器本身能正确丢弃(尤其是,确保没有线程将其上下文加载器设置成 22 | 一个临时的类加载器) 23 | Exception in thread "main" java.lang.OutOfMemoryError: Metaspace 24 | Exception in thread "main" java.lang.OutOfMemoryError: PermGen space 25 | * Java 堆本身内存不足——对于给定的堆空间而言,应用中活跃对象太多 26 | Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 27 | 28 | * JVM 执行 GC 耗时太多。 29 | Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 执行 GC 上花费了太多时间 30 | 原因: 31 | 1. 花在 Full GC 上的时间超出了 -XX:GCTimeLimit=N 标志指定的值。其默认值是 98(也就 32 | 是,如果 98% 的时间花在了 GC 上,则该条件满足)。 33 | 2. 一次 Full GC 回收的内存量少于 -XX:GCHeapFreeLimit=N 标志指定的值。其默认值是 2, 34 | 这意味着如果 Full GC 期间释放的内存不足堆的 2%,则该条件满足。 35 | 3. 上面两个条件连续 5 次 Full GC 都成立(这个数值是无法调整的)。 36 | 4. -XX:+UseGCOverhead-Limit 标志的值为 true (默认如此)。 37 | 38 | 自动堆转储 39 | -XX:+HeapDumpOnOutOfMemoryError JVM 会在抛出 OutOfMemoryError 时创建堆转储 40 | -XX:HeapDumpPath= 指定了堆转储将被写入的位置,默认当前目录下面 41 | -XX:+HeapDumpAfterFullGC 运行一次 Full GC 后生成一个堆转储文件 42 | -XX:+HeapDumpBeforeFullGC 运行一次 Full GC 之前生成一个堆转储文件 43 | 44 | 结论: 45 | 1. 有多种原因会导致抛出 OutOfMemoryError,因此不要假设堆空间就是问题所在。 46 | 2. 对于永久代和普通的堆,内存泄漏是出现 OutOfMemoryError 的最常见原因; 47 | 堆分析工具可以帮助我们找到泄漏的根源 48 | 49 | ## 减少内存使用 50 | ### 减少对象大小 51 | 1. 减少实例变量的个数 52 | 2. 减少实例变量的大小 53 | 54 | Shallow Size、Deep Size 还是 Retained size 55 | 1. 减小对象大小往往可以改进 GC 效率。 56 | 2. 对象大小未必总能很明显地看出来:对象会被填充到 8 字节的边界,对 57 | 象引用的大小在 32 位和 64 位 JVM 上也有所不同。 58 | 3. 对象内部即使为 null 的实例变量也会占用空间 59 | ### 延迟初始化 60 | 61 | 1. 只有当常用的代码路径不会初始化某个变量时,才去考虑延迟初始化该变量。 62 | 2. 一般不会在线程安全的代码上引入延迟初始化,否则会加重现有的同步成本。 63 | 3. 对于使用了线程安全对象的代码,如果要采用延迟初始化,应该使用双重检查锁。 64 | 65 | ### 不可变对象和标准化对象 66 | ### 字符串的保留 67 | -XX:StringTableSize=N 68 | 1. 如果应用中有大量字符串是一样的,那通过保留实现字符串重用收效很大。 69 | 2. 要保留很多字符串的应用可能需要调整字符串保留表的大小(除非是运行在 Java 7u40 及更新的 64 位服务器 JVM 上) 70 | 71 | ## 对象生命周期管理 72 | ### 对象重用 73 | 1. 线程池 74 | 2. 线程局部变量 75 | 1. 对象重用通常是一种通用操作,我们并不鼓励使用它。但是这种技术可能适合初始化成本高昂,而且数量比较少的一组对象。 76 | 2. 在使用对象池还是使用线程局部变量这两种技术之间,应该有所取舍。一般而言,建设线程和可重用对象直接存在一一对应关系,则线程局部 77 | 变量更容易使用 78 | ### 弱引用、软引用与其他引用 79 | 1. 非确定引用(包括软引用、弱引用、虚引用和最终引用)会改变 Java 对象正常的生命周期,与池或线程局部变量相比,它可以以对 GC 更为友 80 | 好的方式实现对象重用。 81 | 2. 当应用对某个对象感兴趣,而且该对象在应用中的其他地方有强引用时,才应该使用弱引用。 82 | 3. 软引用保存可能长期存在的对象,提供了一个简单的、对 GC 友好的LRU 缓存。 83 | 4. 非确定引用自身会消耗内存,而且会长时间抓住其他对象的内存;应该谨慎使用。 84 | -------------------------------------------------------------------------------- /java/jvm/java-JIT.md: -------------------------------------------------------------------------------- 1 | # Just in Time 即时编译器 2 | 虚拟机的核心 3 | 4 | ## 概览 5 | * 编译型语言 6 | * 解释型语言 7 | 可移植性,翻译重复 8 | 9 | > 热点编译 10 | jvm执行代码不会立即编译代码 1 如果代码只执行一次 那编译就是浪费体力 解释执行java字节码比先编译然后执行的速度快 11 | 2 jvm执行特定方法次数越多 使得jvm可以在编译代码时进行大量优化 12 | 13 | ## 调优入门 选择编译器类型(client、server或者二者同用) 14 | * client 15 | c1 16 | * server 17 | c2 18 | 19 | 两者的区别在于编译代码时机的不同,client编译器开启编译比server编译器要早,意味着在代码执行的开始阶段,client编译器要比server编译器 20 | 要快,因为它的编译代码相比server编译器而言要多 21 | 为什么? 22 | 代码先由client编译,随着代码预热,由server端编译器重新编译 23 | 24 | ### 优化启动 25 | 26 | ### 优化批处理 27 | 分层编译是批处理任务合理的默认选择 28 | ### 优化长时间运行的应用 29 | 应该一直使用server编译器,最好配合分层编译 30 | 31 | ## java和jit编译器的版本 32 | * 32 client -client 33 | * 63 server -server 34 | * 64 server -d64 35 | 36 | ## 编译器中期调优 37 | 当代码缓存的大小超过限制之后,jvm就不能编译更多代码了,问题就会出现应用的大部分代码都是解释运行,这个问题在client以及分层编译实现 38 | 很常见,jvm就会发出警告, CodeCache is full,默认 32m-240m区间。目前没有什么机制能好的算出具体的缓存使用大小,基本都是增加1倍或者3倍 39 | 40 | ### 调优代码缓存 41 | 1. 代码缓存是一种有最大值的资源,它会影响jvm可运行的的编译代码总量 42 | 2. 分层编译很容易达到上限,应该监控代码缓存,必要时增加它的大小 43 | #### 编译阀值 44 | 首先明白一点,编译是基于两种jvm计数器 45 | 1. 方法调用计数器 46 | 2. 方法中的循环回编计数器,可以看作循环完成执行的次数 47 | > 循环完成执行 48 | 包括到达循环的末尾,也包括执行了像continue的分支语句 49 | * 标准编译 50 | * 栈上编译 osr on stack replacement 51 | jvm不等方法调用完成就会编译循环,如何循环的回边计数器超过阀值,那整个循环就可以被编译 52 | 结论: 53 | 1. 当方法和循环执行次数达到某个阀值的时候,就会发生编译 54 | 2. 改变阀值会导致代码提早或推后编译 55 | 3. 由于计数器会随着时机而减少,以至于 温热的方法可能永远都达不到编译的阀值 特别是对于servcer编译器来说 56 | 57 | #### 检测编译过程 58 | 代码编译的状态 attributes 59 | * % 编译为osr 60 | * s 方法是同步的 61 | * !:方法有异常处理器 62 | * b: 阻塞模式时发生的编译 63 | * n: 为封装本地方法所发生的编译 64 | 可以使用jstat检测编译 65 | 66 | ## 高级编译器优化 67 | 68 | ### 编译线程 69 | 70 | ### 内联 71 | 72 | ### 逃逸分析 73 | 74 | ## 逆优化 75 | * mode not entrant 76 | * made zombie 77 | ### 代码被丢弃 78 | ### 逆优化僵尸代码 79 | 结论: 80 | 1. 逆优化会使得编译器回到之前版本的编译代码 81 | 2. 先前的优化不再生效,才会发生逆优化 82 | 3. 代码逆优化时,会对性能产生小而短暂的影响,不过新编译的代码会尽快的热身 83 | 4. 分层编译时,如果之前代码由client编译器编译,而现在由server编译器优化,就会发生逆优化 84 | 85 | ## 分层编译级别 86 | 1. 0: 解释代码 87 | 2. 1:简单c1编译代码 88 | 3. 2:受限的c1编译代码 89 | 4. 3:完全c1编译代码 90 | 5. 4:c2编译代码 91 | 多数方法第一次编译级别是3 92 | 结论: 93 | 1. 分层编译可以在两种编译器和5种级别之间进行 94 | 2. 不建议人为更改级别 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /java/jvm/jvm-optimization.md: -------------------------------------------------------------------------------- 1 | # jvm优化 2 | 3 | ## 调优参数 4 | JVM 主要接受两类标志:布尔标志和附带参数的标志 5 | 布尔标志: 6 | -XX:+FlagName 表示开启, -XX:-FlagName 表示关闭 7 | 附带参数的标志: 8 | -XX:FlagName=something 9 | 10 | ## 性能测试方法 11 | ### 原则1 测试真实应用 12 | #### 微基准测试 13 | 用来测量微小代码单元的性能 14 | 1. 调用同步方法的用时与调用异步方法的用时比较 15 | 2. 创建线程的代价与使用线程池的代价 16 | 3. 执行某种算法的耗时与替代实现的耗时 17 | 主意事项: 18 | * 必须使用被测的结果 19 | * 不要包括无关的操作 20 | * 必须输入合理的参数 21 | #### 宏基准测试 22 | 23 | #### 介基准测试 24 | 25 | ### 原则2 理解批处理流逝时间、吞吐量和响应时间 26 | 27 | #### 批处理流逝时间 28 | 29 | 热身 30 | 31 | #### 吞吐量测试 32 | * TPS 每秒实务数 33 | * RPS 每秒请求数 34 | * OPS 每秒处理数 35 | 36 | #### 响应时间测试 37 | 38 | ### 原则3 用统计方法应对性能的变化 39 | 40 | ### 原则4 尽早频繁测试 41 | 42 | ## java 性能调优工具箱 43 | 44 | ### 操作系统的工具和分析 45 | 46 | #### cpu 使用率 47 | * 用户态时间 48 | * 系统态时间 49 | 目的: 50 | 尽可能的让cpu使用率高 51 | 注意cpu空闲的原因: 52 | 1. 应用被原语阻塞,直到锁释放才能继续执行 53 | 2. 应用在等待某些东西,例如数据库调用的响应 54 | 3. 应用的确无所事事 55 | #### java与单cpu的使用率 56 | * 应用类型(批处理) 57 | * 接收请求 58 | #### java与单cpu的使用率 59 | 通过不阻塞线程来提高cpu使用率 60 | 61 | #### cpu 运行队列 62 | 运行队列反应的是机器上所有东西的运行情况 63 | 64 | #### 磁盘使用率 65 | 66 | #### 网络使用率 67 | 68 | 69 | ### java监控工具 70 | * jcmd 71 | 它用来打印 Java 进程所涉及的基本类线程和VM信息 72 | jcmd process_id command optional_arguments 73 | * jconsole 74 | 提供jvm活动的图形化视图,包括线程的使用、类是使用和GC活动 75 | * jhat 76 | 读取内存堆转储,有助于分析,事后使用的工具 77 | * jmap 78 | 堆转储和其他jvm内存使用的信息 79 | * jinfo 80 | jvm的系统属性 81 | * jstack 82 | 转储java进程的栈信息 83 | * jstat 84 | GC和类装载的活动信息 85 | * jvisualvm 86 | #### 基本VM的信息 87 | * 运行时间 88 | * 系统属性 89 | * jvm版本 90 | * jvm命令行 91 | * jvm调优标志 92 | 93 | #### 线程信息 94 | * jstack 95 | * jcmd process_id thread.print 96 | 97 | #### 类信息 98 | * jstat 99 | * jconsole 100 | #### 实时GC分析 101 | #### 时候堆转储 102 | 103 | ### 性能分析工具 104 | 两种模式: 数据采样和数据探查 105 | #### 采样分析器 106 | #### 探查分析器 107 | 侵入性强、影响性能     108 | 限制:   109 | 小代码区域中的一些类和包 110 | #### 阻塞方法和线程时间线 111 | #### 本地分析器 112 | 113 | ### java 任务控制 jmc 114 | 115 | #### java飞行记录器 jfr 116 | 117 | #### jfr事件概览 118 | * classloading 119 | 1. 装载和卸载的类的数量 120 | 2. 哪个类装载器装载的类,装载单个类需要的时间 121 | * thread statistics 122 | 1. 创建和销毁的线程数 123 | 2. 被锁阻塞的线程(以及阻塞住它们的特定的锁) 124 | * throwables 125 | 1. 应用所用的异常错误类 126 | 2. 有多少异常和错误被抛出了,以及他们生成时的栈跟踪信息 127 | * tlab allocation 128 | 1. 堆分配的数量和本地线程分配缓冲的大小 129 | 2. 堆中分配的对象和分配它们的栈跟踪信息 130 | * file and socket I/O 131 | 1. 执行io所用的时间 132 | 2. 每次读/写调用所调用的时间,读或写很长时间的特定文件或socket 133 | * Monitor blocked 134 | 1. 等待管程的线程 135 | 2. 在特定管程上阻塞的线程以及它们阻塞的时间 136 | * Code cache 137 | 1. 代码缓存的大小以及包含多少量 138 | 2. 从代码缓存中移走的java方法,代码缓存配置 139 | * Code compilation 140 | 1. 哪个方法被编译,osr编译和编译的时长 141 | 2. 除了jfr其他工具也包括的信息,但这是从多个源头获取的统一信息 142 | * Garbage collection 143 | 1. GC的时间 包括单个阶段,代的大小 144 | 2. 除了jfr其他工具也包括的信息,但这是从多个工具获取的统一信息 145 | * Profiling 146 | 1. 探查和采样分析器 147 | 2. 不像真的性能分析器那样有很多信息,但jfr分析器提供了很好的更高层次的概要信息 148 | 149 | #### 开启jfr 150 | -XX:+UnlockCommercialFeatures -XX:+flightRecorder  或jmc 两种方式 151 | 1. 固定持续时间 152 |  适用于响应性分析 153 | 2. 持续进行 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /java/jvm/jvm.md: -------------------------------------------------------------------------------- 1 | # JAVA虚拟机 2 | 3 | ## 类加载器 4 | ### 加载方式 5 | * 隐式:运行过程中,碰到new方式生成对象时,隐式调用classLoader到JVM 6 | * 显式:通过class.forname()动态加载 7 | ### 加载模型 8 | * 双亲委托机制 9 | 10 | ### OSGI 11 | 12 | 13 | ## 执行引擎 execution engine 14 | 执行字节码,或者执行本地方法 15 | 16 | ## 运行时数据区域 runtime data area 17 | 1. PC程序计数器:一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器, NAMELY存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。Java 的多线程机制离不开程序计数器,每个线程都有一个自己的PC,以便完成不同线程上下文环境的切换。 18 | 19 | 2. java虚拟机栈:与 PC 一样,java 虚拟机栈也是线程私有的。每一个 JVM 线程都有自己的 java 虚拟机栈,这个栈与线程同时创建,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 20 | 21 | 3. 本地方法栈:与虚拟机栈的作用相似,虚拟机栈为虚拟机执行执行java方法服务,而本地方法栈则为虚拟机使用到的本地方法服务。 22 | 23 | 4. Java堆:被所有线程共享的一块存储区域,在虚拟机启动时创建,它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配。 24 | Java堆在JVM启动的时候就被创建,堆中储存了各种对象,这些对象被自动管理内存系统(Automatic Storage Management System,也即是常说的 Garbage Collector(垃圾回收器)所管理。这些对象无需、也无法显示地被销毁。 25 | JVM将Heap分为两块:新生代New Generation和旧生代Old Generation。 26 | Note:     27 | 堆在JVM是所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也是new开销比较大的原因。 28 | 鉴于上面的原因,Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间,这块空间又称为TLAB 29 | TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效 30 | 31 | 5. 方法区 32 | 方法区和堆区域一样,是各个线程共享的内存区域,它用于存储每一个类的结构信息,例如运行时常量池,成员变量和方法数据,构造函数和普通函数的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。当开发人员在程序中通过Class对象中的getName、isInstance等方法获取信息时,这些数据都来自方法区。 33 | 方法区也是全局共享的,在虚拟机启动时候创建。在一定条件下它也会被GC。这块区域对应Permanent Generation 持久代。 XX:PermSize指定大小。 34 | 35 | 6. 运行时常量池 36 | 其空间从方法区中分配,存放的为类中固定的常量信息、方法和域的引用信息。 37 | 38 | 39 | ## GC (Garbage Collection)垃圾回收 40 | ### 回收算法 41 | * 标记-清除 42 | * 复制 43 | * 压缩-标记-清除 44 | * 引用计数法 45 | ### 垃圾收集器 46 | 47 | ## 内存模型 48 | ## java编译器 49 | 50 | 51 | -------------------------------------------------------------------------------- /java/jvm/thread&synchronize.md: -------------------------------------------------------------------------------- 1 | # 线程和同步的性能 2 | 3 | ## 线程池与 ThreadPoolExecutor 4 | ### 设置最大线程数 5 | ### 设置最小线程数 6 | ### 线程池任务大小 7 | ### 设置 ThreadPoolExecutor 的大小 8 | * SynchronousQueue 9 | * LinkedBlockedingQueue 10 | * ArrayBlockingQueue 11 | 12 | 1. 有时对象池也是不错的选择,线程池就是情形之一:线程初始化的成本很高,线程池使得系统上的线程数容易控制。 13 | 2. 线程池必须仔细调优。盲目向池中添加新线程,在某些情况下对性能会有不利影响。 14 | 3. 在使用 ThreadPoolExecutor 时,选择更简单的选项通常会带来最好的、最能预见的性能。 15 | 16 | ## ForkJoinPool 17 | 分治算法 18 | ### 自动并行化 19 | 1. ForkJoinPool 类应该用于递归、分治算法。 20 | 2. 应该花些心思来确定,算法中的递归任务何时结束最为合适。创建太多任务会降低性能,但如果任务太少,而任务所需的执行时间又长短不一, 21 | 也会降低性能。 22 | 3. Java 8 中使用了自动并行化的特性会用到一个公共的 ForkJoinPool 实例。我们可能需要根据实际情况调整这个实例的默认大小。 23 | 24 | ## 线程同步 25 | ### 同步的代价 26 | * 同步与可伸缩性 27 | * 锁定对象的开销 28 | 29 | 1. 线程同步有两个性能方面的代价:限制了应用的可伸缩性,以及获取锁 30 | 是有开销的。 31 | 2. 同步的内存语义、基于 CAS 的设施和 volatile 关键字对性能可能会有 32 | 很大的影响,特别是在有很多寄存器的大型机上 33 | ### 避免同步 34 | * 如果访问的是不存在竞争的资源,那么基于 CAS 的保护要稍快于传统的同步(虽然完 35 | 全不使用保护会更快)。 36 | * 如果访问的资源存在轻度或适度的竞争,那么基于 CAS 的保护要快于传统的同步(而 37 | 且往往是快得多)。 38 | * 随着所访问资源的竞争越来越剧烈,在某一时刻,传统的同步就会成为更高效的选择。 39 | 在实践中,这只会出现在运行着大量线程的非常大型的机器上。 40 | * 当被保护的值有多个读取,但不会被写入时,基于 CAS 的保护不会受竞争的影响。 41 | 42 | 1. 避免对同步对象的竞争,是缓解同步对性能影响的有效方式之一。 43 | 2. 线程局部变量不会受竞争之苦;对于保存实际不需要在多个线程间共享的同步对象,它们非常理想。 44 | 3. 对于确实需要共享的对象,基于 CAS 的工具也是避免传统的同步的方式之一。 45 | 46 | ### 伪共享 47 | 1. 对于会频繁地修改 volatile 变量或退出同步块的代码,伪共享对性能影响很大。 48 | 2. 伪共享很难检测。如果某个循环看上去非常耗时,可以检查该代码,看看是否与伪共享出现时的模式相匹配。 49 | 3. 最好通过将数据移到局部变量中、稍后再保存来避免伪共享。作为一种替代方案,有时可以使用填充将冲突的变量移到不同的缓存行中 50 | 51 | ## JVM线程调优 52 | ### 调节线程栈大小 53 | 1. 在内存比较稀缺的机器上,可以减少线程栈大小。 54 | 2. 在 32 位的 JVM 上,可以减少线程栈大小,以便在 4 GB 进程空间限制的 55 | 条件下,稍稍增加堆可以使用的内存。 56 | ### 偏向锁 57 | -XX:-UseBiasedLocking 58 | 59 | ### 自旋锁 60 | -XX:+UseSpinning java8 noy support 61 | ### 线程优先级 62 | 63 | ## 监控线程与锁 64 | ### 查看线程 65 | jconsole 66 | ### 查看阻塞线程 67 | 1. 被阻塞线程与JFR 68 | 2. 被阻塞线程与 JStack 69 | 70 | 1. 利用系统提供的线程基本信息,可以对正在运行的线程的数目有个大致了解。 71 | 2. 就性能分析而言,当线程阻塞在某个资源或 I/O 上时,能够看到线程的相关细节就显得比较重要。 72 | 3. JFR 使得我们可以很方便地检查引发线程阻塞的事件。 73 | 4 利用 jstack,一定程度上可以检查线程是阻塞在什么资源上 74 | -------------------------------------------------------------------------------- /java/jvm/原生内存.md: -------------------------------------------------------------------------------- 1 | # 原生内存 2 | 在 Java 应用中,堆消耗的内存是最多的。但是除堆之外,JVM 还会分配并使用大量的原 3 | 生内存 4 | 5 | ## 内存占用 6 | 7 | ### 测量内存占用 8 | 提交内存、保留内存 9 | ### 内存占用最小化 10 | * 堆 11 | * 线程栈 12 | * 代码缓存 13 | * 直接字节缓冲区 14 | 15 | ### 原生nio缓冲区 16 | 1. JVM 总的内存占用对性能影响很大,特别是当机器上的物理内存有限时。 17 | 在做性能测试时,内存占用通常应该是要监控的一个方面。 18 | 2. 从调优角度看,要控制 JVM 的内存占用,可以限制用于直接字节缓冲 19 | 区、线程栈和代码缓存的原生内存(以及堆)的使用量 20 | ### 原生内存跟踪 21 | -XX:NativeMemoryTracking=off|summary|detail 22 | 1. 在 Java 8 中,原生内存跟踪(NMT)提供了 JVM 所使用的原生内存的详 23 | 细信息。从操作系统的角度看,其中包含 JVM 堆(对 OS 而言,堆也是 24 | 原生内存的一部分)。 25 | 2. 对大多数分析而言,NMT 的概要模式足够了。它支持我们确定 JVM 提 26 | 交了多少内存(以及这些内存用于干什么了)。 27 | 28 | ## 针对不同系统优化jvm 29 | ### 大页 30 | 1. 使用大页通常可以明显提升应用的速度。 31 | 2. 在大多数操作系统上,必须显式开启大页支持 32 | 33 | ### 压缩的oop (ordinary object pointer 即普通对象指针) 34 | 1. 压缩的 oop 会在最有用的时候默认开启。 35 | 2. 使用了压缩 oop 的 31 GB 的堆,与稍微大一些、但因为堆太大而无法使 36 | 用压缩 oop 的堆相比,性能通常要好一些 37 | -------------------------------------------------------------------------------- /java/official-specification.md: -------------------------------------------------------------------------------- 1 | # java 语言规范系列 2 | * 为什么要看? 3 |   不想只做一个写业务代码的,糊里糊涂 4 | * 要看到什么程度?   5 |    能跟人讲的清楚,内部的大致实现,可以单独深入某个细节 6 | * 具体的针对性要看哪个部分?   7 |    内存模型、线程相关 8 | * 自己目前是在哪个程度? 9 |    小白 10 | 11 | 12 | [Java语言规范](https://docs.oracle.com/javase/specs/) 13 | 14 | [Java7语言规范](https://docs.oracle.com/javase/specs/jls/se7/html/index.html) 15 | 16 | [Java虚拟机规范](https://docs.oracle.com/javase/specs/)     17 | 18 | [r大-新的Java语言规范、Java虚拟机规范](http://rednaxelafx.iteye.com/blog/1081626)   19 | 20 | [从表到里学习JVM实现](https://www.douban.com/doulist/2545443/) 21 | 22 | [Java JVM怎么学习啊?从哪方面入手?](https://www.zhihu.com/question/20097631) 23 | -------------------------------------------------------------------------------- /java/open-project/apache.md: -------------------------------------------------------------------------------- 1 | # apache 的所有开源项目 2 | 分布式,亦或者常用工具 3 | 4 | ## distributed 5 | 6 | ### data 7 | * Kylin 8 | Apache Kylin is an open source Distributed Analytics Engine, contributed by eBay Inc., provides SQL interface and multi-dimensional analysis (OLAP) on Hadoop supporting extremely large datasets. 9 | [https://github.com/apache/kylin](https://github.com/apache/kylin) 10 | 11 | ### calculate 12 | 13 | ## common 14 | 15 | * commons-compress 16 | Apache Commons Compress software defines an API for working with compression and archive formats. These include: bzip2, gzip, pack200, lzma, xz, Snappy, traditional Unix Compress, DEFLATE, DEFLATE64, LZ4, Brotli, Zstandard and ar, cpio, jar, tar, zip, dump, 7z, arj. 17 | [https://github.com/apache/commons-compress](https://github.com/apache/commons-compress) 18 | * Camel 19 | Apache Camel is a powerful open source integration framework based on known Enterprise Integration Patterns with powerful bean integration. 20 | [https://github.com/apache/camel](https://github.com/apache/camel) 21 | 22 | ## Framework 23 | * systemml 24 | SystemML is a flexible, scalable machine learning system. SystemML's distinguishing characteristics 25 | [https://github.com/apache/systemml](https://github.com/apache/systemml) 26 | ## server 27 | 28 | ## test 29 | * jmeter 30 | Apache JMeter may be used to test performance both on static and dynamic resources, Web dynamic applications. It can be used to simulate a heavy load on a server, group of servers, network or object to test its strength or to analyze overall performance under different load types. 31 | [https://github.com/apache/jmeter](https://github.com/apache/jmeter) 32 | 33 | 34 | ## other 35 | [https://github.com/apache/sling-org-apache-sling-karaf-integration-tests](https://github.com/apache/sling-org-apache-sling-karaf-integration-tests) 36 | [https://github.com/apache/sling-org-apache-sling-discovery-oak](https://github.com/apache/sling-org-apache-sling-discovery-oak) 37 | [https://github.com/apache/sling-org-apache-sling-discovery-impl](https://github.com/apache/sling-org-apache-sling-discovery-impl) 38 | [https://github.com/apache/archiva-redback-core](https://github.com/apache/archiva-redback-core) 39 | [https://github.com/apache/ofbiz-framework](https://github.com/apache/ofbiz-framework) 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /java/pattern/Abstract-Factory.md: -------------------------------------------------------------------------------- 1 | # 抽象工厂模式(Abstract Factory) 2 | ## 模式动机 3 | ## 模式定义 4 | ## 模式结构 5 | * AbstractFactory:抽象工厂 6 | * ConcreteFactory:具体工厂 7 | * AbstractProduct:抽象产品 8 | * Product:具体产品 9 | ## 时序图 10 | ## 代码分析 11 | ## 模式分析 12 | ## 实例 13 | ## 优点 14 | ## 缺点 15 | ## 适用环境 16 | ## 模式应用 17 | ## 模式扩展 18 | ## “开闭原则”的倾斜性 19 | ## 工厂模式的退化 20 | ## 总结 21 | -------------------------------------------------------------------------------- /java/pattern/Factory-Method-Pattern.md: -------------------------------------------------------------------------------- 1 | # 工厂方法模式 2 | ## 模式动机 3 | ## 模式定义 4 | ## 模式结构 5 | * Product:抽象产品 6 | * ConcreteProduct:具体产品 7 | * Factory:抽象工厂 8 | * ConcreteFactory:具体工厂 9 | ## 时序图 10 | ## 代码分析 11 | ## 模式分析 12 | ## 实例 13 | ## 工厂方法模式的优点 14 | ## 工厂方法模式的缺点 15 | ## 适用环境 16 | ## 模式应用 17 | jdbc 18 | ``` 19 | Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=sa;password="); 20 | Statement statement=conn.createStatement(); 21 | ResultSet rs=statement.executeQuery("select * from UserInfo"); 22 | ``` 23 | ## 模式扩展 24 | 25 | ## 总结 26 | -------------------------------------------------------------------------------- /java/pattern/Simple-Factory-Pattern.md: -------------------------------------------------------------------------------- 1 | # 简单工厂模式 2 | 3 | ## 模式动机 4 | ## 模式定义 5 | 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。 6 | 在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 7 | ## 模式结构 8 | * Factory:工厂角色 9 | 工厂角色负责实现创建所有实例的内部逻辑 10 | * Product:抽象产品角色 11 | 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口 12 | * ConcreteProduct:具体产品角色 13 | 具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。 14 | ## 时序图 15 | ## 代码分析 16 | ``` 17 | #include "Factory.h" 18 | #include "ConcreteProductA.h" 19 | #include "ConcreteProductB.h" 20 | Product* Factory::createProduct(string proname){ 21 | if ( "A" == proname ) 22 | { 23 | return new ConcreteProductA(); 24 | } 25 | else if("B" == proname) 26 | { 27 | return new ConcreteProductB(); 28 | } 29 | return NULL; 30 | } 31 | ``` 32 | ## 模式分析 33 | * 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。 34 | * 在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何源代码。 35 | * 简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。 36 | * 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。 37 | ## 实例 38 | ## 优点 39 | * 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。 40 | * 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。 41 | * 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。 42 | ## 缺点 43 | * 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。 44 | * 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。 45 | * 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。 46 | * 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构 47 | ## 实用环境 48 | * 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。 49 | * 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。 50 | ## 模式应用 51 | 1. java.text.DateFormat 52 | ``` 53 | public final static DateFormat getDateInstance(); 54 | public final static DateFormat getDateInstance(int style); 55 | public final static DateFormat getDateInstance(int style,Localelocale); 56 | ``` 57 | 2. java加密 58 | KeyGenerator keyGen=KeyGenerator.getInstance("DESede"); 59 | -------------------------------------------------------------------------------- /java/spring.md: -------------------------------------------------------------------------------- 1 | # Spring 2 | 3 | ## IOC 4 | 5 | ## BeanFactory 6 | ``` 7 | org.springframework.context.support.ClassPathXmlApplicationContext.ClassPathXmlApplicationContext(String[], boolean, ApplicationContext) 8 | 9 | org.springframework.context.support.AbstractApplicationContext.refresh() 10 | 11 | org.springframework.context.support.AbstractApplicationContext.prepareRefresh() 12 | 13 | org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory() 14 | 15 | org.springframework.context.support.AbstractApplicationContext.refreshBeanFactory() 16 | 17 | org.springframework.context.support.AbstractRefreshableApplicationContext.customizeBeanFactory(DefaultListableBeanFactory) 18 | 19 | org.springframework.context.support.AbstractRefreshableApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory) 20 | 21 | org.springframework.beans.factory.config.ConfigurableListableBeanFactory 22 | 23 | org.springframework.beans.factory.support.DefaultListableBeanFactory 24 | 25 | org.springframework.beans.factory.config.BeanDefinition 26 | 27 | org.springframework.context.support.AbstractRefreshableApplicationContext.customizeBeanFactory(DefaultListableBeanFactory) 28 | 29 | org.springframework.context.support.AbstractRefreshableApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory) 30 | 31 | org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory) 32 | 33 | org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(Element, BeanDefinitionParserDelegate) 34 | 35 | org.springframework.beans.factory.support.BeanDefinitionReaderUtils.registerBeanDefinition(BeanDefinitionHolder, BeanDefinitionRegistry) 36 | 37 | 38 | 39 | ``` 40 | ## AOP 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /java/test/TestPerformance.java: -------------------------------------------------------------------------------- 1 | 2 | import org.junit.Test; 3 | 4 | /** 5 | * 6 | * @author micolore 7 | * 8 | */ 9 | public class TestPerformance { 10 | 11 | final static String staticFinalString = ""; 12 | 13 | @Test 14 | public void testString() { 15 | 16 | StringBuffer stringBuffer = new StringBuffer();// 线程安全的缓冲区 没必要 17 | String nullStr = ""; 18 | System.out.println(stringBuffer.length()); 19 | System.out.println(nullStr.length()); 20 | System.out.println(staticFinalString.length()); 21 | 22 | int max = 12; 23 | String numberString = max + ""; 24 | String valueOfString = String.valueOf(max); 25 | System.out.println(valueOfString); 26 | System.out.println(numberString); 27 | 28 | } 29 | 30 | /** 31 | * 以x为处理对象 32 | * firstEnd-firstStart 直接拼接"" 33 | * 6283 34 | * twoEnd-twoStart 35 | * 3345 36 | * 37 | * 固定处理对象 38 | * firstEnd-firstStart 使用String.valueOf(),内部使用toString() 39 | * 2 40 | * twoEnd-twoStart 41 | * 1481 42 | * 43 | * 结论: 44 | * 处理同一个对象转换字符串,直接拼""效率比较快 45 | * 如果是处理的动态的变量,还是优先使用String.valueOf(); 46 | * 47 | */ 48 | @Test 49 | public void manyString() { 50 | long firstStart = getCurrentTime(); 51 | for (Integer x = 0; x < 100000000; x++) { 52 | String numberString = x + "";//调用toString() 53 | } 54 | long firstEnd = getCurrentTime(); 55 | System.out.println("firstEnd-firstStart"+(firstEnd - firstStart)); 56 | 57 | long twoStart = getCurrentTime(); 58 | for (Integer x = 0; x < 100000000; x++) { 59 | String valueOfString = String.valueOf(x);//1.转换成object 2.调用toString() 60 | } 61 | long twoEnd = getCurrentTime(); 62 | System.out.println("twoEnd-twoStart"+(twoEnd - twoStart)); 63 | 64 | long secondStart = getCurrentTime(); 65 | for (Integer x = 0; x < 100000000; x++) { 66 | String valueOfString = x.toString(); 67 | } 68 | long secondEnd = getCurrentTime(); 69 | System.out.println("secondEnd-secondStart"+(secondEnd - secondStart)); 70 | 71 | } 72 | /** 73 | * 应该考量的点是什么 74 | * 75 | * 1. 初始化的速度 76 | * 并不是变量处理完之后就不去管后面的操作是不是还有用这个变量 77 | * 2. 调用的速度 78 | * 3. 销毁的速度 79 | * 80 | * 环境是不是多线程 81 | * 82 | */ 83 | 84 | @Test 85 | public void testBuffef(){ 86 | long currentTimeStart = getCurrentTime(); 87 | for(int x=0;x<10000000;x++){ 88 | StringBuffer stringBuffer = new StringBuffer();// 线程安全的缓冲区 没必要 89 | } 90 | long currentTimeEnd = getCurrentTime(); 91 | System.out.println("stringBuffer:"+(currentTimeEnd-currentTimeStart)); 92 | 93 | long currentTimeStartTwo = getCurrentTime(); 94 | for(int x=0;x<10000000;x++){ 95 | StringBuilder stringBuilder = new StringBuilder();// 线程安全的缓冲区 没必要 96 | } 97 | long currentTimeEndTwo = getCurrentTime(); 98 | System.out.println("stringBuilder:"+(currentTimeEndTwo-currentTimeStartTwo)); 99 | } 100 | 101 | public static long getCurrentTime(){ 102 | 103 | return System.currentTimeMillis(); 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /java/threadpool.md: -------------------------------------------------------------------------------- 1 | # threadpool 2 | 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处: 3 | 1. 降低资源消耗; 4 | 2. 提高响应速度; 5 | 3. 提高线程的可管理性。 6 | 7 | ## ThreadPoolExecutor 8 | * corePoolSize 9 | * maximumPoolSize 10 | * keepAliveTime 11 | * unit 12 | * workQueue 13 | 1. ArrayBlockingQueue 基于数组结构的有界阻塞队列 14 | 2. LinkedBlockingQuene 基于链表结构的阻塞队列 15 | 3. SynchronousQuene 一个不存储元素的阻塞队列 16 | 4. priorityBlockingQuene 具有优先级的无界阻塞队列 17 | * threadFactory 18 | * handler 19 | 线程池的饱和策略,当阻塞队列满了,且没有空闲的工作线程,如果继续提交任务,必须采取一种策略处理该任务,线程池提供了4种策略 20 | 1. AbortPolicy:直接抛出异常,默认策略; 21 | 2. CallerRunsPolicy:用调用者所在的线程来执行任务; 22 | 3. DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务; 23 | 4. DiscardPolicy:直接丢弃任务; 24 | 25 | ## Exectors 26 | Exectors工厂类提供了线程池的初始化接口 27 | * newFixedThreadPool 28 | * newCachedThreadPool 29 | * newSingleThreadExecutor 30 | * newScheduledThreadPool 31 | 32 | ## sumbit task 33 | 34 | * Executor.execute() 35 | 通过Executor.execute()方法提交的任务,必须实现Runnable接口,该方式提交的任务不能获取返回值,因此无法判断任务是否执行成功 36 | 37 | * ExecutorService.submit() 38 | 通过ExecutorService.submit()方法提交的任务,可以获取任务执行完的返回值 39 | 40 | ## execute task 41 | 具体的执行流程如下: 42 | 1. workerCountOf方法根据ctl的低29位,得到线程池的当前线程数,如果线程数小于corePoolSize,则执行addWorker方法创建新的线程执行任务;否则执行步骤(2); 43 | 2. 如果线程池处于RUNNING状态,且把提交的任务成功放入阻塞队列中,则执行步骤(3),否则执行步骤(4); 44 | 3. 再次检查线程池的状态,如果线程池没有RUNNING,且成功从阻塞队列中删除任务,则执行reject方法处理任务; 45 | 4. 执行addWorker方法创建新的线程执行任务,如果addWoker执行失败,则执行reject方法处理任务 46 | 47 | 参考链接: 48 | [threadpool 实现原理](https://www.jianshu.com/p/87bff5cc8d8c) 49 | [线程池的介绍及简单实现](https://www.ibm.com/developerworks/cn/java/l-threadPool/) 50 | [Java并发编程:线程池的使用](https://www.cnblogs.com/dolphin0520/p/3932921.html) 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /java/tomcat.md: -------------------------------------------------------------------------------- 1 | # tomcat 2 | 连接与请求的关系:连接是TCP层面的(传输层),对应socket;请求是HTTP层面的(应用层),必须依赖于TCP的连接实现;一个TCP连接中可能传输多个HTTP请求。 3 | -------------------------------------------------------------------------------- /java/tools/eclipse-mat.md: -------------------------------------------------------------------------------- 1 | # Eclipse MAT 2 | 3 | ## 什么是堆Dump 4 | 堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。 5 | 6 | 先使用jmap打印出来 7 | jmap -dump:live,format=b,file=data.hprof pid   8 | jmap -dump,format=b,file=data.hprof pid  跟上面的区别在于live 9 | 如果使用jhat查看,需要设置足够内存防止内存不够   10 | 11 | ## download 12 | [down-load-mat](http://www.eclipse.org/mat/downloads.php) 13 | 14 | ## 使用mat 直接打开第一步生成的文件 15 | 16 | ### 分析报告 17 | 分析三步曲 18 | 通常我们都会采用下面的“三步曲”来分析内存泄露问题: 19 | 首先,对问题发生时刻的系统内存状态获取一个整体印象。 20 | 第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象 21 | 接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。 22 | 下面将用一个基本的例子来展示如何采用“三步曲”来查看生产的分析报告。 23 | 24 | #### tools 25 | * Shortest Paths To the Accumulation Point 从根元素到内存消耗聚集点的最短路径 26 | * Accumulated Objects in Dominator Tree 27 | * Accumulated Objects by Class in Dominator Tree 28 | * All Accumulated Objects by Class 29 | * shallow 浅 就是对象本身占用内存的大小,不包含其引用的对象 30 | * retained 保留 它表示如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括被递归释放的)所占用的heap大小。于是,如果一个对象的某个成员new了一大块int数组,那这个int数组也可以计算到这个对象中。相对于shallow heap,Retained heap可以更精确的反映一个对象实际占用的大小(因为如果该对象释放,retained heap都可以被释放)。 31 | * list number of instances per class 32 | * outgoing references :表示该对象的出节点(被该对象引用的对象)。 33 | * incoming references :表示该对象的入节点(引用到该对象的对象)。 34 | action 35 | * histogram 直方图 36 | * dominator tree 37 | * top consumer 38 | Top Consumers query lists the largest objects grouped by class, class loader, and package. To run the query select Top Consumers in the Leak Identification category 39 | * duplicate class 重复的类 40 | report 41 | * top components 42 | * Finding Responsible Objects 寻找责任对象 43 | * Querying Heap Objects (OQL)   44 | * Analyze Class Loader 45 | * Analyzing Finalizer 分析终结者 46 | * Comparing Objects 47 | 48 | ## OOM 49 | 50 | ### jvm调试信息 51 | -XX:ErrorFile=./hs_err_pid.log:如果JVM crashed,将错误日志输出到指定文件路径。         52 | -XX:HeapDumpPath=./java_pid.hprof:堆内存快照的存储文件路径。 53 | -XX:-HeapDumpOnOutOfMemoryError:在OOM时,输出一个dump.core文件,记录当时的堆内存快照 54 | -XX:-TraceClassLoading:打印class装载信息到stdout。记Loaded状态。 55 | -XX:-TraceClassUnloading:打印class的卸载信息到stdout。记Unloaded状态。 56 | -XX:+PrintGC:输出形式: 57 | [GC 118250K->113543K(130112K), 0.0094143 secs] 58 | [Full GC 121376K->10414K(130112K), 0.0650971 secs] 59 | 60 | -XX:+PrintGCDetails:输出形式: 61 | [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] 62 | [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K- >10414K(130112K), 0.0436268 secs] 63 | 64 | -XX:+PrintGCTimeStamps:打印GC停顿耗时 65 | -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间. 66 | -XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息 67 | -Xloggc:filename:把相关日志信息记录到文件以便分析. 68 | 69 | -XX:+HeapDumpOnOutOfMemoryError 发生内存泄露时抓拍下当时的内存状态 70 | -XX:+HeapDumpOnCtrlBreak 不想等到发生崩溃性的错误时才获得堆转储文件 71 | 72 | ### oom错误类型 73 | outOfMemoryError 年老代内存不足。 74 | outOfMemoryError:PermGen Space 永久代内存不足。 75 | outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。 76 | outOfMemoryError:Metaspace 77 | 78 | ### 常见问题 79 | 1. 如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。 80 | 2. 要制作堆Dump可以直接使用jvm自带的jmap命令 81 | 3. 可以先使用jmap -heap命令查看堆的使用情况,看一下各个堆空间的占用情况。 82 | 4. 使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。 83 | 5. 也可以使用 jmap -dump:format=b,file=命令将堆信息保存到一个文件中,再借助jhat命令或者mat查看详细内容 84 | 6. 在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。 85 | 86 | ### 参考链接 87 | [gc性能优化](https://blog.csdn.net/column/details/14851.html) 88 | [官方mat](http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html) 89 | 90 | -------------------------------------------------------------------------------- /java/tools/jca457.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/java/tools/jca457.jar -------------------------------------------------------------------------------- /java/tools/jdk&jre-bin-tools.md: -------------------------------------------------------------------------------- 1 | # JDK&JRE Bin tools 2 | >以下这些工具,用以排查问题,解决故障,根据目标阀值来判断数据是否为异常状态。工具-数据-状态-问题-解决 3 | >作为一个写代码的,必须要对自己写的程序有100%的了解 4 |  消耗了多少内存,瓶颈在什么地方,这些都需要清楚 5 | ## 基本工具 6 | * javac.exe Java语言编译器 7 | * java.exe Java应用程序启动器 8 | * javaw.exe Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。 9 | * javadoc.exe Java API文档生成器 10 | * apt.exe java 注释处理器 11 | * appletviewer.exe java applet小程序查看器 12 | * jar.exe java文件压缩打包工具 13 | * jdb.exe Java调试器 14 | * javah.exe C头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件 15 | * javap.exe class文件反编译工具 16 | * extcheck.exe 用于检测jar包中的问题 17 | * jcmd.exe Java命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。 18 | 19 | ## 安全工具 20 | * keytool.exe 管理密钥库和证书 21 | * jarsigner.exe 生产和校验JAR签名 22 | * policytool.exe 有用户界面的规则管理工具 23 | * kinit.exe 用于获得和缓存网络认证协议Kerberos 票证的授予票证 24 | * klist.exe 凭据高速缓存和密钥表中的 Kerberos 显示条目 25 | * ktab.exe 密钥和证书管理工具 26 | 27 | ## 国际化工具 28 | * native2ascii.exe 29 | 30 | ## 远程方法调用 31 | * rmic.exe 生成远程对象的stubs and skeletons(存根和框架) 32 | * rmid.exe Java远程方法调用(RMI:Remote Method Invocation)活化系统守护进程 33 | * rmiregistry.exe Java远程对象注册表 34 | * serialver.exe 返回类的 serialVersionUID 35 | * java-rmi.exe Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象 36 | 37 | ## Java IDL and RMI-IIOP 工具 38 | * tnameserv.exe Java IDL瞬时命名服 39 | * idlj.exe 生产映射到OMG IDL接口可以使Java应用程序使用CORBA的.java文件 40 | * orbd.exe 为客户可以在CORBA环境下透明的定位和调用服务器的稳定的对象提供支持 41 | * servertool.exe 为应用程序提供易于使用的接口用于注册,注销,启动,关闭服务器 42 | 43 | ## java部署工具 44 | * pack200.exe 使用java gzip压缩工具将JAR文件转换为压缩的pack200文件,生产打包文件是高度压缩的JAR包,可以直接部署,减少下载时间 45 | * unpack200.exe 解包pack200文件为JARs 46 | 47 | ## Java web工具 48 | * javaws.exe Java web 启动命令行工具 49 | * schemagen.exe Java构架的XML Schema生成器 50 | * wsgen.exe 生成 JAX-WS 51 | * wsimport.exe 生成 JAX-WS 52 | * xjc.exe 绑定编译器 53 | 54 | ## Java故障检修,程序概要分析,监视和管理工具 55 | * jvisualvm.exe 一个图形化的Java虚拟机 56 | * jconsole.exe java监视台和管理控制台 57 | * jps.exe JVM Process Status进程状态工具。列出目标系统的HotSpot JJVM 58 | * jstat.exe 按照命令行的具体要求记录和收集一个JVM的性能数据 59 | * jstatd.exe JVM jstat 的守护进程 60 | * jmc.exe Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。 61 | 62 | ## 故障检测和修理工具 63 | * jinfo.exe 配置或打印某个Java进程VM flag 64 | * jhat.exe 堆储存查看器 65 | * jmap.exe Java内存图 66 |   查看某个pid的java服务占用内存排名前20的类,jmap -histo pid | head -20 67 | jmap还有一个指令可以把整个内存情况转成文件形式保存下来:jmap -dump:format=b,file=filename.bin 68 | 从远程用sz filename.bin命令将文件下载到本地来,在用Eclipse插件MAT(Memory Analyse Tool)分析整个文件, 69 | MAT插件需要下载安装,方法Google可以找到。 70 | 71 | * jsadebugd.exe Java的 Serviceability Agent Debug的守护进程 72 | * jstack.exe Java堆栈跟踪 73 | 74 | ## Java 脚本工具 75 | * jrunscript.exe 运行脚本 76 | 77 | ## other 78 | * jabswitch.exe Java Access Bridge Switch的简称,用于控制Java访问桥的开/关。Java访问桥是一种技术,让Java应用程序实现Accessibility API,以供Microsoft Windows系统的辅助技术访问。 79 | * javafxpackager.exe JavaFX打包工具 80 | 81 | 82 | [参考链接](http://www.codingwhy.com/view/858.html 'jdk bin目录下工具介绍') 83 | -------------------------------------------------------------------------------- /java/tools/jmc.md: -------------------------------------------------------------------------------- 1 | # Java Mission Control 2 | 3 | ## source 4 | 5 | * default jdk 6 | * eclipse 7 | 8 | ## JFR 9 | 10 | Java Flight Recorder (JFR)顾名思义,就是java运行情况的黑匣子. 先启动Java进程,然后使用JFR记录程序运行情况. 11 | 12 | 13 | 参考连接: 14 | [Java Platform, Standard Edition Java Flight Recorder Runtime Guide](https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/toc.htm) 15 | 16 | [具体的启动方式](https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/run.htm#JFRUH176) 17 | -------------------------------------------------------------------------------- /java/tools/jstack-find-top-cpu.md: -------------------------------------------------------------------------------- 1 | # 查询占用内存最多的cpu 2 | 3 | 1. 使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如123 4 | 2. 按H,获取每个线程的内存情况 5 | 3. 找到内存和cpu占用最高的线程pid,比如15248 6 | 4. 执行 printf 0x%x 15248 得到 0x3b90 ,此为线程id的十六进制 7 | 5. 执行 jstack 123|grep -A 10 3b90,得到线程堆栈信息中3b90这个线程所在行的后面10行 8 | 6. 查看对应的堆栈信息找出可能存在问题的代码 9 | 10 | 11 | ## jca 12 | [IBM Thread and Monitor Dump Analyze for Java](https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=2245aa39-fa5c-4475-b891-14c205f7333c) 13 | ## Spotify提供的Web版在线分析工具,可以将锁或条件相关联的线程聚合到一起。 14 | [thread check](http://spotify.github.io/threaddump-analyzer/) 15 | -------------------------------------------------------------------------------- /java/zooKeeper.md: -------------------------------------------------------------------------------- 1 | # ZooKeeper 2 | > 数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列 3 | ## 一致性 4 | * 顺序一致性 5 | * 原子性 6 | * 单一视图 7 | * 可靠性 8 | * 实时性 9 | ## 角色 10 | * Leader 11 | * Follower 12 | * Observer 13 | > ZooKeeper集群的所有机器通过一个Leader选举过程来选定一台被称为『Leader』的机器,Leader服务器为客户端提供读和写服务。 14 | Follower和Observer都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer机器不参与Leader选举过程, 15 | 也不参与写操作的『过半写成功』策略,因此Observer可以在不影响写性能的情况下提升集群的读性能 16 | 17 | ## 会话 18 | >Session是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在ZooKeeper中, 19 | 一个客户端连接是指客户端和ZooKeeper服务器之间的TCP长连接。ZooKeeper对外的服务端口默认是2181,客户端启动时, 20 | 首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接, 21 | 客户端能够通过心跳检测和服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应, 22 | 同时还能通过该连接接收来自服务器的Watch事件通知。Session的SessionTimeout值用来设置一个客户端会话的超时时间。 23 | 当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时, 24 | 只要在SessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。 25 | 26 | ## 数据节点 27 | > 在谈到分布式的时候,一般『节点』指的是组成集群的每一台机器。而ZooKeeper中的数据节点是指数据模型中的数据单元, 28 | 称为ZNode。ZooKeeper将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径, 29 | 就是一个ZNode,如/hbase/master,其中hbase和master都是ZNode。 30 | 每个ZNode上都会保存自己的数据内容,同时会保存一系列属性信息。 31 | * 持久节点 32 | >所谓持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNode将一直保存在ZooKeeper上。 33 | * 临时节点 34 | >临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。 35 | 36 | ## 版本 37 | > ZooKeeper的每个ZNode上都会存储数据,对应于每个ZNode,ZooKeeper都会为其维护一个叫作Stat的数据结构, 38 | Stat中记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本) 39 | 和aversion(当前ZNode的ACL版本)。 40 | 41 | ## 状态信息 42 | > 每个ZNode除了存储数据内容之外,还存储了ZNode本身的一些状态信息。 43 | 44 | ## 事务操作 45 | >在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、 46 | 数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID, 47 | 用ZXID表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些事务操作请求的全局顺序 48 | 49 | ## Watcher 50 | > Watcher(事件监听器),是ZooKeeper中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些Watcher, 51 | 并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。该机制是ZooKeeper实现分布式协调服务的重要特性。 52 | 53 | ## ACL 54 | * CREATE: 创建子节点的权限。 55 | * READ: 获取节点数据和子节点列表的权限。 56 | * WRITE:更新节点数据的权限。 57 | * DELETE: 删除子节点的权限。 58 | * ADMIN: 设置节点ACL的权限。 59 | 60 | # ZAB协议 61 | >ZooKeeper是Chubby的开源实现,而Chubby是Paxos的工程实现,所以很多人以为ZooKeeper也是Paxos算法的工程实现。 62 | 事实上,ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,ZooKeeper原子广播协议) 63 | 的协议作为其数据一致性的核心算法。 64 | >ZAB协议并不像Paxos算法和Raft协议一样,是通用的分布式一致性算法,它是一种特别为ZooKeeper设计的崩溃可恢复的原子广播算法。 65 | 66 | ## 核心 67 | > 所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而剩下的其他服务器则成为Follower服务器。 68 | Leader服务器负责将一个客户端事务请求转换成一个事务Proposal(提案)并将该Proposal分发给集群中所有的Follower服务器。 69 | 之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确的反馈后, 70 | Leader就会再次向所有的Follower服务器分发Commit消息,要求对刚才的Proposal进行提交。 71 | ## 协议 72 | ZAB协议包括两种基本的模式,分别是崩溃恢复和消息广播。在整个ZooKeeper集群启动过程中,或是当Leader服务器出现网络中断、 73 | 崩溃退出与重启等异常情况时,ZAB协议就会进入恢复模式并选举产生新的Leader服务器。当选举产生了新的Leader服务器, 74 | 同时集群中有过半的机器与该Leader服务器完成了状态同步之后,ZAB协议就会退出恢复模式。其中,状态同步是指数据同步, 75 | 用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致。 76 | 崩溃恢复模式包括两个阶段:Leader选举和数据同步 77 | 78 | ## 应用场景 79 | * 数据发布与订阅(配置中心) 80 | * 命名服务(Naming Service) 81 | * 分布式协调/通知 82 | * 分布式锁 83 | * 排他锁 84 | * 共享锁 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /life/20181013-dgjj.md: -------------------------------------------------------------------------------- 1 | # 销售培训 2 | 针对傲途平台的销售培训 3 | 4 | ## 大纲 5 | ### 了解客户 6 | 7 | 1. 第一个练习揭开了此次培训的面纱,怎么寻找客户? 8 | 大家都积极讨论了以什么渠道去寻找客户,很热烈 9 | 地推扫楼 、跟合作者发传单、网络、搜索引擎、广告、私人关系寻找... 10 | 11 | * 穿插一个知识点 关于客户关系的 12 | 我认为我的理解还是比较全面的, 关于公司的目标、发展计划、发展趋势,知己知彼,了解更多的信息才有可能 13 | 拿下客户 14 | 15 | ### 客户关系管理 16 | 1. 可信度、可靠度、亲近感 17 | 2. EB最终决策者 UB 应用选型者 UB技术选型者 18 | 19 | * 不同程度的公司规模 具体的参与程度 影响力是不一样的 20 | 21 | ### 发展教练 22 | 这个没有听太懂 23 | 24 | ### 识别客户需求 25 | 1. 练习 26 | 问: 老陈办公室在哪? 27 | 答: 东边 28 | 了解客户真实需求,表面需求需要你亲自给客户揭开(注意分寸) 29 | 2. EOAC 30 | 探索、提议、行动、确认 31 | 32 | 3. SPIN 33 | 关于客户的 现状、问题、影响、需求与汇报提问? 34 | 4. 练习: 噪音低与简单操作的机器 推销 35 | 36 | ### 竞争态势分析 37 | 具体项目 具体分析该阶段所面临的竞争对手情况 38 | 39 | ### 差异化营销方案制定 40 | 1. 30秒时间如何介绍? 41 | 25分钟? 45分钟? 42 | 2. FAB 43 | 特征、优点、利益 44 | 45 | ### 影响供应商选型 46 | 1. 练习 招标 47 | 2. 企业对服务商的三种价值诉求 48 | 49 | 50 | 51 | ### 呈现价值 52 | 53 | ### 项目运作 54 | -------------------------------------------------------------------------------- /life/Go.md: -------------------------------------------------------------------------------- 1 | # Go 围棋 2 | 3 | ## 4 | * 19*19 9*9 5 | *  黑子181 白子180 6 | * 黑先白后 7 | 8 | ## 术语 9 | 10 | * liberty 气 11 | * 提子 12 | 13 | 14 | -------------------------------------------------------------------------------- /life/Reflection.md: -------------------------------------------------------------------------------- 1 | # 吾日三省吾身 2 | 3 | * 输入输出理论 4 | 5 | * 记忆规则 6 | 7 | 1 3 5 7 8 | 9 | * 取长补短与扬长避短的策略 10 | 发挥自己的长处,还是补足自己的短处。怎样才能走的更远,更高。   11 | 不停的学习,终身学习是唯一基础。 12 | 13 | * 写代码是改变不了命运的,即使能改变,也只能改变你自己 14 | 扩展自己的圈子,认识更多的优秀人士,不局限在某个圈子里面。 15 | 16 | * 你能看到什么,那么你就会成为什么样的人 17 | -------------------------------------------------------------------------------- /life/img/20ee9836356ed93476f504feb962e72a_r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/life/img/20ee9836356ed93476f504feb962e72a_r.jpg -------------------------------------------------------------------------------- /life/img/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/life/img/30.jpg -------------------------------------------------------------------------------- /life/img/readme.md: -------------------------------------------------------------------------------- 1 | # life 2 | -------------------------------------------------------------------------------- /life/in_out.md: -------------------------------------------------------------------------------- 1 | # 输入输出规律 2 | 3 | ## 再谈取舍 4 | 我认为要舍掉95%以上的不应该有的想法或者欲望,大脑里面应该保留的是哪些具体的有意义以及有价值的想法。沉浸在自己的幻想里面,早晚都会触碰到现实,断舍离还是要早早的就做好,避免以后后悔当初的碌碌无为,心态也要放宽,尽量不去强求,凡事忍三分钟。 5 | 6 | 7 | ## 致20-30的自己 8 | * 家人不能选择,但是朋友是可以选择的。 9 | * 利用你的不那么直接的关系(软连接),获得一些身份资本 10 | * 你需要一个计划和很少的时间 11 | * 二十岁的年龄就像抢椅子,等你三十岁的时候,是不是只能选择你最近的椅子? 12 | ## 保持明确的目标 13 | * 尽量把你的时间全部都投资进去,至于收获多少全看你自己的努力程度 14 | -------------------------------------------------------------------------------- /life/lis.md: -------------------------------------------------------------------------------- 1 | # 900 month 2 | 3 | ![900格子之30岁](https://github.com/micolore/note/blob/master/life/img/30.jpg) 4 | 5 | ## 你要成为一个什么样的人 6 | 7 | ### 目标or志向 8 | 同样的时间,你做了这件事,别人做了那件事,最后的结果可能一样,也可能不一样。但大多数情况下是不一样的,因为付出还是会有收获的。 9 | #### 人生目标 10 | * 英语 11 | * 电影 12 | * 读书 13 | 历史 14 | * 旅行 15 | * 美食 16 | * 音乐 17 |  摇滚 18 | #### 职业目标 19 | 刻意练习可以概括为六个字:专注、反馈、修正。 20 | 21 | * 基础理论 22 | 1. c 23 | 2. 数据结构与算法 24 |   必须了解相关的代码实现,至少看过一遍,最好实现代码过一遍,看一遍,最后写出来。 25 | 3. 通信协议 26 |   http、tcp、ip、rfc 27 | 28 | 29 | 30 | #### 家庭目标 31 | 32 | 三者最好是能在同一条路线上面 33 | 34 | ## 一些观念 35 | 36 | * 高估天赋的作用,是一件很危险的事 37 | * 比意志力不足更可怕的是,动机不足 38 | * 所以靠所谓的意志力苦撑,不如强化动机。 39 | * 学会自我调整,没必要和自己对着干,给自己心理带来不必要的痛苦 40 | * 注重身体保养,把身体当成朋友一样相处 41 | * 对自己停止成长的那个节点,保持警惕 42 | * 无差别重复一万个小时,一样不会变高手 43 | * 人生重要的天分是快乐 44 | * 痛苦,是比快乐更重要的天分 45 | * 一个人的精神资源和精神结构决定了这个人一生的走向 46 | 47 | ##  个人感触 48 | * 什么事情能让你安静下来,那个事情就是你喜欢的,你感兴趣的。 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /life/movie.md: -------------------------------------------------------------------------------- 1 | # movie 2 | 3 | # 导演 4 | 5 | 史蒂芬.斯皮尔伯格 外星人E.T 6 | 马丁.西科塞斯 出租车司机 7 | 阿尔弗雷德.希区柯克 西北偏北 8 | 蒂姆.波顿 剪刀手爱德华 9 | 斯坦利.库布里克 奇爱博士 10 | 莱德利.斯科特 银翼杀手 11 | 大卫.芬奇 搏击俱乐部 12 | 乔治.卢卡斯 星球大战 13 | 詹姆斯.卡梅隆 异形2 14 | 乔尔.科恩 米勒的十字花 15 | 昆丁.塔伦蒂诺 落水狗 16 | 奥利佛.斯通 刺杀肯尼迪 17 | 比利.怀德 热情似火 18 | 弗朗西斯.福特.科波拉 教父2 19 | 吴宇森 喋血街头 20 | 李安 卧虎藏龙 21 | 霍华德.霍克斯 沉睡 22 | 史蒂文.索德伯格 战略高手 23 | 凯文.史密斯 无事生非 24 | 迈克尔.曼 盗火线 25 | 大卫.里恩 阿拉伯的劳伦斯 26 | 伍迪.艾伦 沉睡者 27 | 彼得.杰克森 神圣的生物 28 | 保罗.托马斯.安德森 木兰花 29 | 大卫.林奇 蓝色天鹅绒 30 | 吕克.贝松 第五元素 31 | 罗伯特.赞米基斯 回到未来 32 | 布瑞恩.辛格 普通嫌疑犯 33 | 黑泽明 七武士 34 | 约翰.福特 搜索者 35 | 奥森.威尔斯 公民凯恩 36 | 特里.吉列姆 12猴子 37 | 弗兰克.达拉邦特 肖申克的救赎 38 | 赛尔乔.莱昂 美国往事 39 | 彼得.威尔 美好生活 40 | 弗兰克.卡普拉 美好生活 41 | 约翰.卡朋特 第三类异物 42 | 普莱斯顿.斯特奇斯 苏万里的旅行 43 | 约翰.休斯顿 马耳他之鹰 44 | 萨姆.雷米 鬼玩人2 45 | 布莱恩.德帕尔马 魔女嘉莉 46 | 罗伯.雷纳 腰椎穿刺 47 | 郎.霍华德 阿波罗13 48 | M.奈特.沙马兰 第六感 49 | 卡梅隆.克牢 甜心先生 50 | 罗伯特.阿尔特曼 纳什维勒 51 | 弗朗索瓦.特吕弗 白昼之夜 52 | 约翰.迈克迪南 虎胆龙威 53 | 迈克尔.贝 勇闯夺命岛 54 | 盖.里奇 两杆老烟枪 55 | 56 | 小津安二郎 57 | 沟口健二 58 | 杨德昌   一一 59 | 60 | -------------------------------------------------------------------------------- /life/photography.md: -------------------------------------------------------------------------------- 1 | # 摄影 2 | -------------------------------------------------------------------------------- /life/readme.md: -------------------------------------------------------------------------------- 1 | # my life it's mean everything 2 | -------------------------------------------------------------------------------- /life/rock.md: -------------------------------------------------------------------------------- 1 | # Rock 2 | 3 | ## 萌芽(1964年前) 4 | * 小理查德(Little Richard) 5 | * 查克 贝里(Chuck Berry) 6 | * Buddy Holly 7 | * 猫王 8 | * Roy Orbison 9 | 10 | * Joe Meek 11 | * 披头士(The Beatles)乐队 12 | 13 | ## 迷幻摇滚”(Psychedelic Rock) 14 | * The Doors(大门乐队) 15 | * Cream(奶油)乐队 16 | * The Kinks乐队 17 | 18 | ### 硬摇滚和重金属Hard Rock/Heavy Metal 19 | 20 | * Led Zeppelin(齐柏林飞艇)乐队 21 | * lack Sabbath(黑色安息日)乐队 22 | * Deep Purple(深紫乐队) 23 | 24 | * Judas Priest(犹大牧师) 25 | * Diamond Head(钻石头) 26 | * Iron Maiden(铁娘子) 27 | 极端金属 28 | * Slayer(杀手) 29 | * Dark Angel(黑天使) 30 | * Suffocation (窒息) 31 | 32 | ### 前卫摇滚/艺术摇滚(Progressive Rock/Art Rock) 33 | * Pink Floyd(平克 弗洛伊德) 34 | * King Crimson(克里姆森国王) 35 | * Yes(”是“乐队) 36 | * Genesis(创世纪)乐队 37 | 38 | ## 朋克(Punk) 39 | 朋克音乐一般而言整齐简约、层次分明、简单直接、短小精悍 40 | 41 | ### 原始朋克 42 | * The Velvet Underground(地下丝绒) 43 | * the Stooges(傀儡乐队) 44 | * The Monks(僧侣) 45 | * New York Dolls(纽约妞) 46 | * The Ramones(雷蒙斯) 47 | * Patti Smith(朋克女诗人) 48 | * Television(电视乐队) 49 | * The Sex Pistols(性手枪) 50 | * The Clash(冲撞) 51 | 52 | ### 后朋克(Post Punk) 53 | * Joy Division(快乐小分队) 54 | * Bauhaus (包豪斯乐队) 55 | * The Birthday Party(生日聚会乐队) 56 | * Suicide(”自杀“乐队) 57 | * Gang of Four(四人帮乐队) 58 | * The Sex Pistols(性手枪) 59 | * Meat Puppets(肉偶)乐队 60 | * Minutemen(后备兵)乐队 61 | * Black Flag(黑旗) 62 | * The Misfits(错配乐队) 63 | 64 | ### Grunge 65 | * 涅槃(Nirvana)乐队 66 | 67 | ## Brit-Pop 68 | 69 | * The Stones Roses(石玫瑰) 70 | * The Smiths 71 | * Coldplay(酷玩)乐队 72 | * 血腥情人节(My Bloody Valentine) 73 | * 驾驭(Ride) 74 | 75 | ![The School of Rock](https://github.com/micolore/note/blob/master/life/img/20ee9836356ed93476f504feb962e72a_r.jpg) 76 | 77 | -------------------------------------------------------------------------------- /life/symphony.md: -------------------------------------------------------------------------------- 1 | # symphony 交响乐 2 | 3 | -------------------------------------------------------------------------------- /life/travel.md: -------------------------------------------------------------------------------- 1 | # 旅行 2 | 3 | ### 南京 2016 清明节 4 | 5 | ### 峨眉山 2017元旦 6 | 7 | ### 鼓浪屿 2017 9月 8 | 9 | ### 三清山 2017 国庆节 10 | 11 | ### 南浔古镇 2018元旦 12 | 13 | ### 苏州 2018 清明 14 | 15 | ### 嵊泗 未去 16 | 17 | 滴水湖到小洋山,乘公交车经东海大桥到达小洋山岛 18 | 19 | ### 武功山 2018 端午 20 | * 2018-06.17 - 2018-06.18 21 | 22 | [武功山徒步路线](http://www.mafengwo.cn/gonglve/ziyouxing/37561.html) 23 | -------------------------------------------------------------------------------- /life/如何建立自己的知识体系.md: -------------------------------------------------------------------------------- 1 | 如何建立自己的知识体系 2 | -------------------------------------------------------------------------------- /life/百年宪政.md: -------------------------------------------------------------------------------- 1 | # 百年宪政的那些人,那些事 2 | 3 | ## 人 4 | * 保守派 5 |     慈禧、载沣、荣禄、刚毅、崇礼、奕、杨崇伊、世铎、铁良、升允、张之洞、张人骏 6 | * 改革派       7 |    光绪、李鸿章、康有为、梁启超、陈宝箴、张荫桓、翁同龢、李鸿藻、刘坤一、孙家鼐     8 |    杨深秀、徐致靖、宋伯鲁、王照、杨锐、林旭、刘光第、谭嗣同、康广仁、唐才常、盛宣怀 9 | * 立宪派 10 |    汤化龙 张蹇、瞿鸿机、端方、岑春煊、熊希龄、戴鸿慈、载泽、 奕匡、徐世昌、郑孝胥、 11 |    汤寿潜、马相伯、雷奋、范源濂、陈景仁、梁善济、孙哄伊、陈昭常 12 |    锡良、松寿、赵尔巽、吴景濂、易宗夔、蒲殿俊、赵尔丰 13 | * 北洋派 14 |  直、奉、皖、晋、冯 15 |  袁世凯、冯国璋、曹锟、齐燮元、孙传芳、 张作霖、张学良、张宗昌、吴佩孚、段祺瑞、冯玉祥、阎锡山、徐树铮、卢永祥 16 |   17 | ## 团体 18 | 19 | 立宪派、革命党、清政府、华侨、民族资本家 20 | 21 | ## 派系 22 | 后党 康党 23 | 24 | ## 部门 25 | 咨询机构 26 | 资政院、懋勤殿、军机四章京、谘议局 27 | 28 | ## 年份 29 | 30 | 1907 31 | 32 | ## 新组织 33 | 强学会、预备立宪协会、宪政研究会 34 | ## 外籍人士 35 | 伊藤博文、李提摩太、 36 | ## 事件 37 | 马关条约、公车上书 38 | 保路运动、武昌起义 39 | 40 | ## 41 | <<十九信条>>、《宪法大纲》、《国民公报》 42 | -------------------------------------------------------------------------------- /links/cache: -------------------------------------------------------------------------------- 1 | 2 | 分布式缓存设计相关 3 | 4 | http://www.cnblogs.com/lengyuhong/archive/2012/05/26/2507498.html 5 | 6 | https://weibo.com/ialeafs?is_hot=1 7 | http://i.aleafs.com/ 8 | -------------------------------------------------------------------------------- /links/spider-for-java: -------------------------------------------------------------------------------- 1 | Jsoup 2 | https://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/index.html 3 | https://www.kancloud.cn/johnnylee/crawler/119159 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /linux/#redis-store.emacs#: -------------------------------------------------------------------------------- 1 | hello redis store 2 | 3 | ; info memory 4 | ; used_memory:199439664 5 | ; used_memory_human:190.20M 友好显示 6 | ; used_memory_rss:151347200 redis 进程占据操作系统的内存 7 | ; used_memory_rss_human:144.34M 8 | ; used_memory_peak:458454464 9 | ; used_memory_peak_human:437.22M 10 | ; total_system_memory:33450979328 11 | ; total_system_memory_human:31.15G 12 | ; used_memory_lua:37888 13 | ; used_memory_lua_human:37.00K 14 | ; maxmemory:1000000000 15 | ; maxmemory_human:953.67M 16 | ; maxmemory_policy:allkeys-lru 17 | ; mem_fragmentation_ratio:0.76 内存碎片化比率 18 | ; mem_allocator:jemalloc-4.0.3 内存分布器 19 | 20 | 内存占用分下面几个部分 21 | 1. 数据 22 | 2. 进程本身运行需要的内存 23 | 3. 缓冲内存 24 | 4. 内存碎片 25 | 26 | 27 | 数据类型 28 | 编码方式 29 | raw 30 | int 31 | ht 32 | zipmap l 33 | inkedlist ziplist intset 34 | 数据指针 35 | 虚拟内存 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /linux/db.SQL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/linux/db.SQL -------------------------------------------------------------------------------- /linux/field.md: -------------------------------------------------------------------------------- 1 | # linux 一些关键字(专有名词) 2 | 3 | * selinux 4 | > Security-Enhanced Linux 5 | 安全增强式Linux是一组给Linux核心的补丁,并提供一些更强、更安全的强制访问控制架构来和核心的主要子系统共同运作。基于机密及完整性原则,它提供一个架构来强制信息的分离,以对付入侵的威胁或任何企图略过安全架构的应用程序。借此限制恶意或设计不良的程序可能造成的破坏。它包含一组安全性原则配置配置文件的范本以匹配一般的安全性目标 6 | > /usr/sbin/sestatus -v 7 | 8 | * yum 9 | 10 | * rpm 11 | 12 | -------------------------------------------------------------------------------- /linux/imgs/img.md: -------------------------------------------------------------------------------- 1 | # img 2 | -------------------------------------------------------------------------------- /linux/imgs/l1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/linux/imgs/l1.jpg -------------------------------------------------------------------------------- /linux/imgs/l2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/linux/imgs/l2.jpg -------------------------------------------------------------------------------- /linux/imgs/l3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/linux/imgs/l3.jpg -------------------------------------------------------------------------------- /linux/imgs/l4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/linux/imgs/l4.jpg -------------------------------------------------------------------------------- /linux/install-mysql-error.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | * Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root 4 | 不建议用root直接启动mysql 5 | 6 | * 权限问题 7 | 8 | * 备份问题 9 | 10 | 11 | [详解CentOS 6.5中安装mysql 5.7.16 linux glibc2.5 x86 64(推荐)](http://www.jb51.net/article/98915.htm) 12 | -------------------------------------------------------------------------------- /linux/io.md: -------------------------------------------------------------------------------- 1 | # I/O 2 | 3 | ## 概念 4 | * 用户空间和内核空间 5 | > 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 6 | 7 | * 进程切换 8 | > 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的 9 | 1. 保存处理机上下文,包括程序计数器和其他寄存器。 10 | 2. 更新PCB信息。 11 | 3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。 12 | 4. 选择另一个进程执行,并更新其PCB。 13 | 5. 更新内存管理的数据结构。 14 | 6. 恢复处理机上下文 15 | * 进程的阻塞 16 | >正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。 17 | 18 | * 文件描述符 19 | 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。 20 | 21 | 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。 22 | 23 | * 缓存 IO 24 | >缓存 IO 又被称作标准 IO,大多数文件系统的默认 IO 操作都是缓存 IO。在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。 25 | >数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。 26 | 27 | # Linux I/O模型 28 | 网络IO的本质是socket的读取,socket在linux系统被抽象为流,IO可以理解为对流的操作。刚才说了,对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间 29 | ## read 操作 30 | >1. 第一阶段:等待数据准备 (Waiting for the data to be ready)。 31 | >2. 第二阶段:将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。 32 | 对于socket而言 33 | >1. 第一步:通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区。 34 | >2. 第二步:把数据从内核缓冲区复制到应用进程缓冲区。 35 | 36 | ## 网络I/O模型 37 | * 同步模型(synchronous IO) 38 | * 阻塞IO(bloking IO) 39 | ![blocking-IO](www.blocking-IO.png) 40 | * 非阻塞IO(non-blocking IO) 41 | ![nonblocking-IO](nonblocking-IO.png) 42 | * 多路复用IO(multiplexing IO) 43 | select、poll、epoll(轮询) 44 | * 信号驱动式IO(signal-driven IO) 45 | * 异步IO(asynchronous IO) 46 | 常见的IO模型有阻塞、非阻塞、IO多路复用,异步 47 | ### 同步阻塞 48 | * 网络模型 49 | > 同步阻塞 IO 模型是最常用的一个模型,也是最简单的模型。在linux中,默认情况下所有的socket都是blocking。它符合人们最常见的思考逻辑。阻塞就是进程 "被" 休息, CPU处理其它进程去了 50 | ### 非阻塞 51 | ### IO多路复用 52 | ### 异步 53 | ## 同步IO VS 异步IO 54 | 同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用   55 | ## 阻塞IO VS 非阻塞IO 56 | 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。 57 | 调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程 58 | 59 | 参考连接: 60 | [进程切换](http://guojing.me/linux-kernel-architecture/posts/process-switch/) 61 | [聊聊Linux 五种IO模型](https://www.jianshu.com/p/486b0965c296) 62 | -------------------------------------------------------------------------------- /linux/performance-field.md: -------------------------------------------------------------------------------- 1 | # 关键字 2 | ## 系统吞吐量 3 | 一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。 4 | ### QPS(TPS 5 | 每秒钟request/事务 数量 6 | ### 并发数 7 | 系统同时处理的request/事务数 8 | ### 响应时间 9 | 一般取平均响应时间 10 | 11 | > 12 | QPS(TPS)= 并发数/平均响应时间 13 | 14 | ## 关键术语 15 | 16 | ### 响应时间:对请求作出响应所需要的时间 17 | 18 | 网络传输时间:N1+N2+N3+N4 19 | 20 | 应用服务器处理时间:A1+A3 21 | 22 | 数据库服务器处理时间:A2 23 | 24 | 响应时间=N1+N2+N3+N4+A1+A3+A2 25 | 26 | ### 并发用户数的计算公式 27 | 28 | 系统用户数:系统额定的用户数量,如一个OA系统,可能使用该系统的用户总数是5000个,那么这个数量,就是系统用户数。 29 | 30 | 同时在线用户数:在一定的时间范围内,最大的同时在线用户数量。 31 | 同时在线用户数=每秒请求数RPS(吞吐量)+并发连接数+平均用户思考时间 32 | 33 | 平均并发用户数的计算:C=nL / T 34 | 35 | 其中C是平均的并发用户数,n是平均每天访问用户数(login session),L是一天内用户从登录到退出的平均时间(login session的平均时间),T是考察时间长度(一天内多长时间有用户使用系统) 36 | 37 | 并发用户数峰值计算:C^约等于C + 3*根号C 38 | 39 | 其中C^是并发用户峰值,C是平均并发用户数,该公式遵循泊松分布理论。 40 | 41 | ### 吞吐量的计算公式 42 | 43 | 指单位时间内系统处理用户的请求数 44 | 45 | 从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量 46 | 47 | 从网络角度看,吞吐量可以用:字节/秒来衡量 48 | 49 | 对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,他能够说明系统的负载能力 50 | 51 | 以不同方式表达的吞吐量可以说明不同层次的问题,例如,以字节数/秒方式可以表示数要受网络基础设施、服务器架构、应用服务器制约等方面的瓶颈;已请求数/秒的方式表示主要是受应用服务器和应用代码的制约体现出的瓶颈。 52 | 53 | 当没有遇到性能瓶颈的时候,吞吐量与虚拟用户数之间存在一定的联系,可以采用以下公式计算:F=VU * R / 54 | 55 | 其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示性能测试所用的时间 56 | 57 | ### 性能计数器 58 | 59 | 是描述服务器或操作系统性能的一些数据指标,如使用内存数、进程时间,在性能测试中发挥着“监控和分析”的作用,尤其是在分析统统可扩展性、进行新能瓶颈定位时有着非常关键的作用。 60 | 61 | 资源利用率:指系统各种资源的使用情况,如cpu占用率为68%,内存占用率为55%,一般使用“资源实际使用/总的资源可用量”形成资源利用率。 62 | 63 | ### 思考时间的计算公式 64 | 65 | Think Time,从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔,而在做新能测试时,为了模拟这样的时间间隔,引入了思考时间这个概念,来更加真实的模拟用户的操作。 66 | 67 | 在吞吐量这个公式中F=VU * R / T说明吞吐量F是VU数量、每个用户发出的请求数R和时间T的函数,而其中的R又可以用时间T和用户思考时间TS来计算:R = T / TS 68 | 69 | 下面给出一个计算思考时间的一般步骤: 70 | 71 | A、首先计算出系统的并发用户数 72 | 73 | C=nL / T F=R×C 74 | 75 | B、统计出系统平均的吞吐量 76 | 77 | F=VU * R / T R×C = VU * R / T 78 | 79 | C、统计出平均每个用户发出的请求数量 80 | 81 | R=u*C*T/VU 82 | 83 | D、根据公式计算出思考时间 84 | 85 | TS=T/R 86 | -------------------------------------------------------------------------------- /linux/redis-store.emacs: -------------------------------------------------------------------------------- 1 | hello redis store 2 | 3 | ; info memory 4 | ; used_memory:199439664 5 | ; used_memory_human:190.20M 友好显示 6 | ; used_memory_rss:151347200 redis 进程占据操作系统的内存 7 | ; used_memory_rss_human:144.34M 8 | ; used_memory_peak:458454464 9 | ; used_memory_peak_human:437.22M 10 | ; total_system_memory:33450979328 11 | ; total_system_memory_human:31.15G 12 | ; used_memory_lua:37888 13 | ; used_memory_lua_human:37.00K 14 | ; maxmemory:1000000000 15 | ; maxmemory_human:953.67M 16 | ; maxmemory_policy:allkeys-lru 17 | ; mem_fragmentation_ratio:0.76 内存碎片化比率 18 | ; mem_allocator:jemalloc-4.0.3 内存分布器 19 | 20 | 内存占用分下面几个部分 21 | 1. 数据 22 | 2. 进程本身运行需要的内存 23 | 3. 缓冲内存 24 | 4. 内存碎片 25 | 26 | 27 | 数据类型 28 | 编码方式 29 | raw 简单动态字符串 30 | int 整数 31 | ht 字典 32 | zipmap 33 | linkedlist 双端链表 34 | ziplist 压缩列表 35 | intset 整数集合 36 | skplist 跳跃表和字典 37 | 数据指针 38 | 虚拟内存 39 | 40 | 41 | 42 | http://redisdoc.com/server/info.html 43 | 44 | -------------------------------------------------------------------------------- /linux/shell/awk.md: -------------------------------------------------------------------------------- 1 | # AWK 2 | 行处理文件 3 | ## hello work 4 | ``` 5 | //不换行 6 | awk '{printf $1, $4}' 0306.txt 7 | awk '{print $1, $4}' 0306.txt 8 | ``` 9 | ##  语法 10 | ``` 11 | awk [选项参数] 'script' var=value file(s) 12 | awk [选项参数] -f scriptfile var=value file(s) 13 | ``` 14 | ## 添加条件 15 | ``` 16 | //其他条件 !=, >, <, >=, <= 17 | awk '$3==0 && $6=="LISTEN" ' 0306.txt 18 | 19 | //输出 20 | awk ' $3>0 {print $0}' 0306.txt 21 | ``` 22 | 23 | ## 内建变量 24 | 25 | $0 当前记录(这个变量中存放着整个行的内容) 26 | $1~$n 当前记录的第n个字段,字段间由FS分隔 27 | FS 输入字段分隔符 默认是空格或Tab 28 | NF 当前记录中的字段个数,就是有多少列 29 | NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 30 | FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 31 | RS 输入的记录分隔符, 默认为换行符 32 | OFS 输出字段分隔符, 默认也是空格 33 | ORS 输出的记录分隔符,默认为换行符 34 | FILENAME 当前输入文件的名字 35 | ### example 36 | ``` 37 | 38 | awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %s %-20s %-20s %s\n",NR, FNR, $4,$5,$6}' netstat.txt 39 | //指定分隔符 40 | awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd 41 | 42 | awk -F: '{print $1,$3,$6}' /etc/passwd 43 | 44 | awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd 45 | 46 | //先使用空格后用逗号 47 | awk -F '[ ,]' '{print $1,$2,$5}'   log.txt 48 | 49 | //设置变量 修改  输出 50 | awk -va=1 '{print $1,$1+a}' log.txt 51 | 52 | ``` 53 | 54 | 55 | ## 字符串匹配 56 | ``` 57 | awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" 0306.txt 58 | 59 | awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" 0306.txt 60 | 61 | // ~ 表示模式开始。/ /中是模式 62 | 63 | awk '/LISTEN/' 0306.txt 64 | 65 | awk '/&type=1&imsi=410018257763675/' 0306.txt 66 | 67 | awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt 68 | 69 | ``` 70 | 71 | ## 折分文件 72 | 73 | ``` 74 | awk 'NR!=1{print > $6}' netstat.txt 75 | 76 | awk 'NR!=1{print $4,$5 > $6}' netstat.txt 77 | 78 | awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; 79 | else if($6 ~ /LISTEN/) print > "2.txt"; 80 | else print > "3.txt" }' netstat.txt 81 | //脚本解释器 82 | 83 | ``` 84 | 85 | ## 统计 86 | ``` 87 | awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt 88 | 89 | //统计每个用户的进程的占了多少内存 90 | ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' 91 | 92 | ``` 93 | 94 | # awk脚本 95 | 96 | 97 | ##  实用的 98 | ``` 99 | //从file文件中找出长度大于80的行 100 | awk 'length>80' file 101 | 102 | //按连接数查看客户端IP 103 | netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr 104 | 105 | //打印99乘法表 106 | seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 107 | 108 | // 查看nginx 访问日志 ip的数量排序 109 | awk '{print $1}' access.log |sort|uniq -c|sort -n 110 | 111 | // 判断两列的值,如果一样就输出两列的值,并输出到文件里面 112 | awk -F '[ ,]' '$1 == $2 {print $1,$2}' awk-test.txt > ra.txt 113 | ``` 114 | 115 | # 其他命令的区别 116 | grep 更适合单纯的查找或匹配文本 117 | sed 更适合编辑匹配到的文本 118 | awk 更适合格式化文本,对文本进行较复杂格式处理 119 | 120 | # 121 | [awk-ibm](https://www.ibm.com/developerworks/cn/education/aix/au-gawk/) 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /linux/shell/cal.awk: -------------------------------------------------------------------------------- 1 | #!/bin/awk -f 2 | #运行前 3 | BEGIN { 4 | math = 0 5 | english = 0 6 | computer = 0 7 | 8 | printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" 9 | printf "---------------------------------------------\n" 10 | } 11 | #运行中 12 | { 13 | math+=$3 14 | english+=$4 15 | computer+=$5 16 | printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 17 | } 18 | #运行后 19 | END { 20 | printf "---------------------------------------------\n" 21 | printf " TOTAL:%10d %8d %8d \n", math, english, computer 22 | printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR 23 | } 24 | -------------------------------------------------------------------------------- /linux/shell/log.txt: -------------------------------------------------------------------------------- 1 | 2 this is a test 2 | 3 Are you like awk 3 | This's a test 4 | 10 There are orange,apple,mongo 5 | -------------------------------------------------------------------------------- /linux/shell/pets.txt: -------------------------------------------------------------------------------- 1 | This is my cat 2 | my cat's name is betty 3 | This is my dog 4 | my dog's name is frank 5 | This is my fish 6 | my fish's name is george 7 | This is my goat 8 | my goat's name is adam 9 | -------------------------------------------------------------------------------- /linux/shell/readme.md: -------------------------------------------------------------------------------- 1 | # shell 2 | -------------------------------------------------------------------------------- /linux/shell/score.txt: -------------------------------------------------------------------------------- 1 | Marry 2143 78 84 77 2 | Jack 2321 66 78 45 3 | Tom 2122 48 77 71 4 | Mike 2537 87 97 95 5 | Bob 2415 40 57 62 6 | -------------------------------------------------------------------------------- /linux/shell/sed.md: -------------------------------------------------------------------------------- 1 | # sed 2 | sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,相当的hacker啊。 3 | 4 | ## hello world 5 | ``` 6 | sed "s/my/Hao Chen's/g" pets.txt 7 | //输出 8 | sed "s/my/Hao Chen's/g" pets.txt > hao_pets.txt 9 | 10 | //直接修改文件内容 11 | sed -i "s/my/Hao Chen's/g" pets.txt 12 | 13 | //每一行最前面加点东西 14 | sed 's/^/#/g' pets.txt 15 | 16 | //每一行最后面加点东西 17 | sed 's/$/ --- /g' pets.txt 18 | 19 | // 3行6行 20 | sed "3,6s/my/your/g" pets.txt 21 | ``` 22 | 23 | ## common 24 | 25 | ^ 表示一行的开头。如:/^#/ 以#开头的匹配。 26 | $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。 27 | \< 表示词首。 如:\ 表示词尾。 如:abc\> 表示以 abc 結尾的詞。 29 | . 表示任何单个字符。 30 | * 表示某个字符出现了0次或多次。 31 | [ ] 字符集合。 如:[abc] 表示匹配a或b或c,还有 [a-zA-Z] 表示匹配所有的26个字符。如果其中有^表示反,如 [^a] 表示非a的字符 32 | 33 | ## 34 | [SED 简明教程](https://coolshell.cn/articles/9104.html) 35 | -------------------------------------------------------------------------------- /linux/shell/shell.md: -------------------------------------------------------------------------------- 1 | # shell 2 | 3 | ## Shell 环境 4 | hell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。 5 | ## Shell 分类 6 | Bourne Shell(/usr/bin/sh或/bin/sh) 7 | Bourne Again Shell(/bin/bash) *** 重点 8 | C Shell(/usr/bin/csh) 9 | K Shell(/usr/bin/ksh) 10 | Shell for Root(/sbin/sh) 11 | 12 | ## first shell 13 | ``` 14 | #!/bin/bash 15 | echo "Hello World !" 16 | 17 | ``` 18 | ## 运行 Shell 脚本有两种方法 19 | 1 作为可执行程序 20 | ``` 21 | chmod +x ./test.sh #使脚本具有执行权限 22 | ./test.sh #执行脚本 23 | 24 | ``` 25 | 2 作为解释器参数 26 | 27 | ``` 28 | /bin/sh test.sh 29 | /bin/php test.php 30 | ``` 31 | ## Shell 变量 32 | 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: 33 | ``` 34 | your_name="runoob.com" 35 | ``` 36 | 命名规则: 37 | 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 38 | 中间不能有空格,可以使用下划线(_)。 39 | 不能使用标点符号。 40 | 不能使用bash里的关键字(可用help命令查看保留关键字)。 41 | 42 | 有效的如下: 43 | ``` 44 | RUNOOB 45 | LD_LIBRARY_PATH 46 | _var 47 | var2 48 | ``` 49 | 无效的如下: 50 | ``` 51 | ?var=123 52 | user*name=runoob 53 | 54 | ``` 55 | 用语句进行赋值: 56 | ``` 57 | for file in `ls /etc` 58 | ``` 59 | ### 使用变量 60 | 使用一个定义过的变量,只要在变量名前面加美元符号即可,如 61 | your_name="qinjx" 62 | echo $your_name 63 | echo ${your_name} 64 | 65 | ### 只读变量 66 | ``` 67 | #!/bin/bash 68 | myUrl="http://www.w3cschool.cc" 69 | readonly myUrl 70 | myUrl="http://www.runoob.com" 71 | 72 | ``` 73 | ### 删除变量 74 | ``` 75 | unset variable_name 76 | ``` 77 | 78 | ### 变量类型 79 | * 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 80 | * 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 81 | * shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行 82 | 83 | ## Shell 字符串 84 | ### 单引号 85 | ``` 86 | str='this is a string' 87 | ``` 88 | ### 双引号 89 | ``` 90 | your_name='qinjx' 91 | str="Hello, I know your are \"$your_name\"! \n" 92 | ``` 93 | ### 拼接字符串 94 | ``` 95 | your_name="qinjx" 96 | greeting="hello, "$your_name" !" 97 | greeting_1="hello, ${your_name} !" 98 | echo $greeting $greeting_1 99 | 100 | ``` 101 | ### 获取字符串长度 102 | 103 | ``` 104 | string="abcd" 105 | echo ${#string} #输出 4 106 | ``` 107 | ### 提取子字符串 108 | ``` 109 | string="runoob is a great site" 110 | echo ${string:1:4} # 输出 unoo 111 | ``` 112 | ### 查找子字符串 113 | ``` 114 | string="runoob is a great company" 115 | echo `expr index "$string" is` # 输出 8 116 | ``` 117 | ## Shell 数组 118 | 119 | ### 定义数组 120 | ``` 121 | 数组名=(值1 值2 ... 值n) 122 | 123 | array_name=(value0 value1 value2 value3) 124 | 125 | array_name=( 126 | value0 127 | value1 128 | value2 129 | value3 130 | ) 131 | 132 | array_name[0]=value0 133 | array_name[1]=value1 134 | array_name[n]=valuen 135 | 136 | ``` 137 | ### 读取数组 138 | ``` 139 | ${数组名[下标]} 140 | 141 | valuen=${array_name[n]} 142 | 143 | echo ${array_name[@]} 144 | ``` 145 | ### 获取数组的长度 146 | ``` 147 | # 取得数组元素的个数 148 | length=${#array_name[@]} 149 | # 或者 150 | length=${#array_name[*]} 151 | # 取得数组单个元素的长度 152 | lengthn=${#array_name[n]} 153 | 154 | ``` 155 | ## Shell 注释 156 | 157 | ``` 158 | #-------------------------------------------- 159 | # 这是一个注释 160 | # author:菜鸟教程 161 | # site:www.runoob.com 162 | # slogan:学的不仅是技术,更是梦想! 163 | #-------------------------------------------- 164 | ##### 用户配置区 开始 ##### 165 | # 166 | # 167 | # 这里可以添加脚本描述信息 168 | # 169 | # 170 | ##### 用户配置区 结束 ##### 171 | 172 | ``` 173 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /linux/shell/webkit_single_backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | function BACKUP(){ 3 | read -p "Do you want to backup the tablename:" table 4 | #备份数据库 5 | mysqldump -uroot -p!QAZ2wsx webkit $table > /data/mysqlback/$DATE/"$table"_"$DATE".sql 6 | } 7 | DATE=`date +%Y%m%d` 8 | if [ -f /$DATE ];then 9 | echo "continue" 10 | BACKUP 11 | else 12 | echo "not" 13 | mkdir /data/mysqlback/$DATE 14 | BACKUP 15 | fi 16 | 17 | -------------------------------------------------------------------------------- /linux/some_commands.md: -------------------------------------------------------------------------------- 1 | ## 性能之巅 2 | 3 | ## thread 4 | 5 | ### top 6 | top -> H 查看所有的子线程 7 | 8 | * pid 指进程id LWPID 9 | * nid 16进制 3368 0xd28 10 | 11 | ### kill -3 12 | “kill -3 pid”来打印System_Server进程各个线程的Java调用栈 13 | 14 | ### pstack 15 | pstack `` 16 | 17 | 18 | ## tools 19 | * Xrunprof 20 | * JProfiler 21 | * OptimizeIt 22 | -------------------------------------------------------------------------------- /linux/sqlite-redis-rdb.emacs: -------------------------------------------------------------------------------- 1 | hello sqlite 2 | 3 | $ sqlite3 database_name.db 4 | $ .databases 5 | $ select.....; 6 | $ update.....; 7 | 8 | ; export csv to db 9 | ; .mode csv memory 10 | ; create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128)); 11 | ; .import memory.csv memory 12 | 13 | ; redis rdb 14 | ; rdb -c memory dump.rdb > memory.csv; 15 | ; redis-rdb-tools是一个python的解析rdb文件工具, 主要有一下三个功能: 16 | ; 生成内存快照 17 | ; 转储成json格式 18 | ; 使用标准的diff工具比较两个dump文件 19 | ; https://yq.aliyun.com/articles/62899 20 | 21 | --select count(*) from memory; 22 | --select * from memory order by size_in_bytes desc limit 15; 23 | --select sum(size_in_bytes) from memory; 24 | --select * from memory where type='hash' and num_elements > 10000 ; 25 | -------------------------------------------------------------------------------- /linux/tools-performance.md: -------------------------------------------------------------------------------- 1 | ## 2 | ![l1](https://github.com/micolore/note/blob/master/linux/imgs/l1.jpg) 3 | ## 4 | ![l1](https://github.com/micolore/note/blob/master/linux/imgs/l2.jpg) 5 | ## 6 | ![l1](https://github.com/micolore/note/blob/master/linux/imgs/l3.jpg) 7 | ## 8 | ![l1](https://github.com/micolore/note/blob/master/linux/imgs/l4.jpg) 9 | -------------------------------------------------------------------------------- /linux/traces.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ERROR: No valid input provided to flamegraph.pl. 7 | 8 | -------------------------------------------------------------------------------- /pr/little-plan.md: -------------------------------------------------------------------------------- 1 | # plan 2 | 3 | ## website 4 | 1. everyday only write one note 5 | 2. 写过的东西,必须要等过了指定时间才可以看 6 | -------------------------------------------------------------------------------- /project/task-design.md: -------------------------------------------------------------------------------- 1 | # task wow 2 | 3 | ## 任务系统的基本规则 4 | 触发任务——执行过程——完成任务 5 | ### 触发 6 | * 条件触发形式 当满足一定条件的情况下,自动产生或固定NPC领取任务 7 | * 固定领取形式 最常规的任务获得模式,通常情况下受一定范围条件的限制。 8 | * 随机触发形式 在任何场景任何等级段随机获得任务。 9 | * 连锁任务形式 由一部份人触发,完成后引发另一部分获得任务 10 | #### 触发类型区分 11 | * 物品触发。拾取或者使用特殊物品时触发任务。 12 | * NPC触发。指玩家从某个NPC处得到该任务。 13 | * 区域触发。指玩家进入某个区域后即触发该任务。 14 | * 时间触发。指玩家经过一段游戏时间后可以得到该任务 15 | * 随机触发。世界任务 16 | ### 任务完成过程 17 | * 战斗 18 | * 收集物品 19 | * 护送 20 | * 探索 21 | * 对话 22 | * 捕捉 23 | * 摧毁 24 | * 送物品 25 | 26 | ### 任务完成 奖励 27 | 28 | #### 奖励内容 29 | * 物品 30 | * 金钱 31 | * 称号 32 | * 积分 33 | * 经验 34 | #### 奖励形式 35 | * 随机 36 | * 固定or指定 37 | * 可选 38 | #### 任务难度 39 | 40 | ## 任务的互动模式 41 | * 合作 42 | * 竞争 43 | 44 | ## 任务是否可重复做 45 | * 日常任务 46 | 47 | ## 任务检测机制 48 | 是否合法、是否利用漏洞 49 | 50 | ## 总结并整体的抽象一下 51 | 根据当前的情况,总结一下我们目前项目的整体的任务流程,首先每个人都默认都会有任务(日常、新手),用户已知的情况下,然后做任务,完成奖励, 52 | 这是一个流程。 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /project/task.md: -------------------------------------------------------------------------------- 1 | ## 多层级分销版本 2 | 3 | ### 邀请收徒 4 | 5 | * 活动说明:邀请下线成功,邀请码被填写一次性得到500金币奖励。等级越高,邀请下线得到的金币越多。一级时邀请一个下线可得到500金币,二级时邀请一个下线可得到550金币,以此类推,十级时邀请一个下线可得到950金币。每天邀请下线的数量无上限(服务器目前有上限) 6 | 7 | * 首次收2位徒弟可以赚100卢比,当天即可提现 8 | * 活动说明,首次收2位徒弟,各奖励50卢比; 9 | * 徒弟每天有效阅读3篇文章,就可以拿到当天相应的奖励,第一天提现20卢比;第二天提现10卢比;第三天提现20卢比(???这属于什么规则) 10 | * 被邀请人也可以获得10卢比现金奖励 11 | * 注册就可领取10卢比现金,可以银行号立即提现(这个就不算是收徒范围内的了吧,什么时候不能提现?) 12 | * 短信通知? 13 | * 新徒弟需要在新设备上注册(之前未登录LopScoop账号的手机) + 有效阅读3篇文章,才可以获得奖励。 (哪个奖励 师傅的还是徒弟的还是一起的) 14 | 15 | * 把链接给好友,好友打开链接下载安装,好友登录阅读,分享者将会获得红包(这个规则太模糊了) 16 | 17 | * 分享赚钱(具体的细节呢?) 18 | 19 | * 徒弟列表 20 | 21 | * 唤醒徒弟:成功唤醒后师傅得到1000金币,徒弟得到300金币,唤醒的徒弟越多,奖励就越多 22 | 判定成功唤醒的标准:师傅点击“Wake up”按钮,并通过WhatsApp/Message群,FaceBook timeline/Facebook/group/Facebook page等发送链接给徒弟; 23 | 徒弟需要点击师傅的链接并且登录LopScoop; 24 | 徒弟需要有效阅读3篇内容; 25 | 师傅点击“Wake up”按钮后,分享的链接3天内都有效; 26 | 若徒弟还未回来,3天后需要重新唤醒 27 | * 徒弟成功注册后收益的10%给师傅(不扣徒弟的收益,额外给) 28 | * 个人中心插屏(点击查看详情跳转到邀请收徒页面) 29 | 30 | ### 福利模块 31 | 32 | * 开宝箱:在签到和邀请收徒页面悬浮开宝箱,每4个小时更新一次,金币都是随机发放的,收到的徒弟越多,宝箱开出的金币也越多,签到栏的下方会显示开宝箱的时间。 33 | * 分享宝箱收益,得到30积分奖励;需要分享到WhatsApp/Message群、Facebook timeline/Facebook group/Facebook page 34 | 配置描述(下载链接和图片) 35 | * 分时段奖励:每小时打开LopScoop进入首页,均可获得10金币时段奖励!首页右上角放置一个倒计时的按钮,每隔40分钟用户可以领取一次金币 36 | 37 | ### 日常任务 38 | * 有效阅读内容,没有上限,每阅读一篇可得到对应金币奖励。在内容详情页面,增加一个关于获得金币时间的进度条,提醒用户还需要阅读多少时间以及多少内容之后就能够获得金币,一直停留不看,即使时间在过去,但是金币进度条依然不会动,金币进度是可以累积的,比如一篇内容没有读完,返回去阅读别的内容,这个进度条还是保留之前的状态,在新的内容里面继续 39 | * 新手任务去掉邀请收徒 40 | * 晒收入功能,每次首次分享奖励30金币,需分享到WhatsApp群组、Facebook Page等,当朋友们看到之后才能拿到奖励,因此金币到账会有延迟,分享出去的直接就是一张已经生成的图片 41 | * 邀请收徒 42 | * 推送阅读也会获得金币奖励,打开手机通知栏获得更多资讯,从手机通知栏中阅读推送的文章,可以获得额外奖励,但是如果阅读不认真、同一时间阅读的太快、网络不稳定等因素,都有可能导致无法获得金币奖励。 43 | 44 | ### 其他 45 | 46 | #### app 47 | * 每次金币到账,都有一个金币币落袋的音效 48 | * Newbie Task新手任务:绑定手机,对接Infobip 49 | * 支付预警(支持paytm支付,做账号check,在提现的时候,先提出1卢比确认账号是否正确,然后再提出剩余金额) 50 | * 阅读每日推推荐的内容,会有额外固定的更多的积分奖励(导航推荐) 51 | * 免邀请码(徒弟通过链接下载安装lopscoop并注册,不输入邀请码可以判断出师傅是谁) 52 | #### 服务端 53 | * 优质评论: 54 | 当用户针对资讯做出一针见血或神补刀的评论时,额外奖励用户1~5积分(运营相关人员手动操作) 55 | * 积分统一改成金币 56 | * Share Record 分享记录: 57 | 记录该账户分享过的内容,列表按照分享先后排列,包含内容标题,分享途径和分享时间,点击数量。分享记录只保留最近两天 58 | 59 | 60 | 61 | 62 | ## 梳理之后 63 | 64 | ### 邀请徒弟 65 | * 邀请途径 66 | * 邀请之后奖励 67 | 1 邀请人 68 | 2 被邀请人 69 | * 唤醒徒弟 70 | 71 | ### 分享 72 | * 分享下载链接 73 | * 分享收入说明 74 | * 分享宝箱收益 75 | 76 | ### 任务 77 | * 阅读 78 | 有效阅读几篇,且次数没有上限 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /project/temp-idea.md: -------------------------------------------------------------------------------- 1 | # temp idea for project 2 | 3 | 4 | ## 系统缓存使用管理 5 | * 缓存key管理,后台动态维护   6 | 更新、删除 7 | 8 | * 缓存的监控   9 | cache-key的数量、cache-value在内存中占比多少 10 | 以及cache-key的访问数量统计(程序异步写到消息队列里面即可,入库统计)、定时clean不常用的key 11 | 以及请求缓存失败次数,大key的统计 12 | 13 | * 缓存的实时预警   14 | 缓存内存的监控 15 | * 使用新的缓存就需要实时注册到cache-key-list,用一个map或者一个list维护即可,不需要存到数据库 16 | 17 | ### 具体设计:     18 | 1 统计结果写入数据库   19 |         cache-key、is_success   20 | 2 代码异步写入消息队列 21 | 3 后台展示数据统计 22 | -------------------------------------------------------------------------------- /protocol/git.md: -------------------------------------------------------------------------------- 1 | # 0-100 GIT 2 | what? why? how? 3 | 4 | # 概念 5 | ## 存储代码的地方(repository) 6 | ### 工作区 7 | 本地的目录,也叫工作树 8 | ### 暂存区 9 | stage、index,也叫索引。 10 | ### 本地仓库 11 | ### 远程仓库(公共仓库) 12 | 13 | * 创建数据库的方式,1 全新的 2 复制远程数据库 14 | 15 | ## 行为 16 | ### pull 17 | ### branch 18 | * git branch -D br 19 | * git branch [-r] [-a] #列出分支,-r远端 ,-a全部 20 | * git branch <分支名> #新建分支 21 | * git branch -b <分支名> #新建并切换分支 22 | * git branch -d <分支名> #删除分支 23 | 24 | ### push 25 | 1. git push origin :0507-b 删除远程分支 26 | ### commit 27 | ### add 28 | ### diff 29 | 比较版本之间的不同之处 30 | * git diff # 显示所有未添加至index的变更 31 | * git diff --cached # 显示所有已添加index但还未commit的变更 32 | * git diff HEAD^ # 比较与上一个版本的差异 33 | * git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 34 | * git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 35 | * git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容 36 | ### fetch 37 | * git fetch 38 | * git fetch remote_repo 39 | * git fetch remote_repo remote_branch_name 40 | * git fetch remote_repo remote_branch_name:local_branch_name 41 | 42 | ### remote 43 | * git remote add <别名> #设置远端别名 44 | * git remote [-v] #列出远端,-v为详细信息 45 | * git remote show <远端别名> #查看远端信息 46 | * git remote rename <远端别名> <新远端别名> #重命名远端 47 | * git remote rm <远端别名> #删除远端 48 | * git remote update [<远端别名>] #更新分支列表 49 | 50 | ### rebase 衍合 51 | 可以对某一段线性提交历史进行编辑、删除、复制、粘贴,目标commit历史简洁、干净 52 | example: 53 | 1. 合并多个commit为一个完整commit 54 | 2. 将某一段commit粘贴到另一个分支上 55 | 3. http://www.ruanyifeng.com/blog/2015/08/git-use-process.html 56 | ### merge 57 | 1. git merge <分支名> #合并某分支到当前分支 58 | 59 | ### fetch_head 60 | 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。 61 | 62 | * $ git log --graph --pretty=oneline --abbrev-commit 合并情况 63 | ### checkout 64 | 切换(分支) 65 | * git checkout -b mybranch 创建并切换 66 | * git checkout <分支名> #切换到分支 67 | * git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支 68 | ### reset 69 | * git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 70 | * git reset --hard HEAD~3:将最近3次的提交回滚 71 | ## 其他 72 | ### revision 73 | 执行提交后,数据库中会生成上次提交的状态与当前状态的差异记录 74 | ### 工作树 75 | 在Git管理下,大家实际操作的目录被称为工作树。 76 | ### 索引 77 | 在数据库和工作树之间有索引,索引是为了向数据库提交作准备的区域。 78 | * Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库。因此,要提交文件,首先需要把文件加入到索引区域中。 79 | ### commit-id 80 | 81 | ### head 游标 82 | 83 | 84 | 85 | ## tips 86 | 1. 不同类别的修改 (如:Bug修复和功能添加) 要尽量分开提交,以方便以后从历史记录里查找特定的修改内容。 87 | 2. 查看其他人提交的修改内容或自己的历史记录的时候,提交信息是需要用到的重要资料。所以请用心填写修改内容的提交信息,以方便别人理解。 88 | 第1行:提交修改内容的摘要 89 | 第2行:空行 90 | 第3行以后:修改的理由 91 | ## 资料参考 92 | [https://segmentfault.com/a/1190000004992316](git 教程) 93 | 94 | 95 | 3. 不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外) 96 | -------------------------------------------------------------------------------- /protocol/https.md: -------------------------------------------------------------------------------- 1 | # https 2 | HyperText Transfer Protocol Secure 3 | 4 | 客户端和服务器本身都会自带一些加密的算法,用于双方协商加密的选择项。 5 | 1、客户端首先会将自己支持的加密算法,打个包告诉服务器端。 6 | 2、服务器端从客户端发来的加密算法中,选出一组加密算法和HASH算法(注,HASH也属于加密),并将自己的身份信息以证书的形式发回给客户端。而证书中包含了网站的地址,加密用的公钥,以及证书的颁发机构等. 7 |   这里有提到公钥的概念是故事中没有的。我们常见的加密算法一般是一些对称的算法,如凯撒加密;对称算法即加密用的密钥和解密用的密钥是一个。如故事中的密钥是4。还有一种加密解密算法称之为非对称算法。这种算法加密用的密钥(公钥)和解密用的密钥(私钥)是两个不同的密钥;通过公钥加密的内容一定要使用私钥才能够解密。 8 |   这里,服务器就将自己用来加密用的公钥一同发还给客户端,而私钥则服务器保存着,用户解密客户端加密过后的内容。 9 | 10 | 3、客户端收到了服务器发来的数据包后,会做这么几件事情: 11 |  1)验证一下证书是否合法。一般来说,证书是用来标示一个站点是否合法的标志。如果说该证书由权威的第三方颁发和签名的,则说明证书合法。 12 |  2)如果证书合法,或者客户端接受和信任了不合法的证书,则客户端就会随机产生一串序列号,使用服务器发来的公钥进行加密。这时候,一条返回的消息就基本就绪。 13 |  3)最后使用服务器挑选的HASH算法,将刚才的消息使用刚才的随机数进行加密,生成相应的消息校验值,与刚才的消息一同发还给服务器。 14 | 15 | 4、服务器接受到客户端发来的消息后,会做这么几件事情: 16 |  1)使用私钥解密上面第2)中公钥加密的消息,得到客户端产生的随机序列号。 17 |  2)使用该随机序列号,对该消息进行加密,验证的到的校验值是否与客户端发来的一致。如果一致则说明消息未被篡改,可以信任。 18 |  3)最后,使用该随机序列号,加上之前第2步中选择的加密算法,加密一段握手消息,发还给客户端。同时HASH值也带上。 19 | 20 | 5、客户端收到服务器端的消息后,接着做这么几件事情: 21 |  1)计算HASH值是否与发回的消息一致 22 |  2)检查消息是否为握手消息 23 | 24 | 6、握手结束后,客户端和服务器端使用握手阶段产生的随机数以及挑选出来的算法进行对称加解密的传输。 25 |   为什么不直接全程使用非对称加密算法进行数据传输?这个问题的答案是因为非对称算法的效率对比起对称算法来说,要低得多得多;因此往往只用在HTTPS的握手阶段。这就是HTTPS的基本原理 26 | 27 | -------------------------------------------------------------------------------- /protocol/img/img.md: -------------------------------------------------------------------------------- 1 | #img for protocol 2 | -------------------------------------------------------------------------------- /protocol/img/ssl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/micolore/note/3a90fc916de4a4d2476ad83676064207ec925432/protocol/img/ssl.png -------------------------------------------------------------------------------- /protocol/ssl&tls.md: -------------------------------------------------------------------------------- 1 | # TLS/SSL 2 | 3 | * SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。 4 | SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。 5 | 6 | * TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。 7 | TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。 8 | 9 | !["tls&ssl"](https://github.com/micolore/blogs/blob/master/protocol/img/ssl.png) 10 | 11 | ## SSL/TLS协议提供的服务主要有: 12 | 1. 认证用户和服务器,确保数据发送到正确的客户机和服务器; 13 | 2. 加密数据以防止数据中途被窃取; 14 | 3. 维护数据的完整性,确保数据在传输过程中不被改变。 15 | 16 | ## TLS与SSL的区别 17 | 1. 版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。 18 | 2. 报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。 19 | 3. 伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。 20 | 4. 报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。 21 | 5. 密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。 22 | 6.certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。 23 | 7. 加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。 24 | 填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文8. 块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击 25 | 26 | ## TLS主要增强的内容 27 | TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善   28 | * 更安全的MAC算法 29 | * 更严密的警报 30 | * “灰色区域”规范的更明确的定义 31 | 32 | ## 密钥协商过程——TLS握手 33 | SSL协议分为两部分:Handshake Protocol和Record Protocol。其中Handshake Protocol用来协商密钥,协议的大部分内容就是通信双方如何利用它来安全的协商出一份密钥。 Record Protocol则定义了传输的格式。 34 | 由于非对称加密的速度比较慢,所以它一般用于密钥交换,双方通过公钥算法协商出一份密钥,然后通过对称加密来通信,当然,为了保证数据的完整性,在加密前要先经过HMAC的处理。 35 | 36 | !["tls-ssl"](https://github.com/micolore/blogs/blob/master/protocol/img/tls-ssl.svg) 37 | 38 | ### 客户端发出请求(ClientHello) 39 | client 必须把自身支持的加密方式告知server端,并生成一个随机数。 40 | 1. 支持的协议版本,比如TLS 1.0版 41 | 2. 一个客户端生成的随机数,稍后用于生成"对话密钥" 42 | 4. 支持的加密方法,比如RSA公钥加密 43 | 5. 支持的压缩方法 44 | 45 | ### 服务器回应(SeverHello) 46 | 1. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信 47 | 3. 一个服务器生成的随机数,稍后用于生成"对话密钥" 48 | 4. 确认使用的加密方法,比如RSA公钥加密 49 | 5. 服务器证书 50 | 51 | ### 客户端回应(Certificate Verify) 52 | 验证证书合法之后(机构、域名、有效期),向服务器发送以下信息。 53 | 1. 一个随机数。该随机数用服务器公钥加密,防止被窃听 54 | 2. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送 55 | 3. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验 56 | 57 | 58 | ### 服务器的最后回应(Server Finish) 59 | 服务端在接收到客户端传过来的 PreMaster 加密数据之后,使用私钥对这段加密数据进行解密,并对数据进行验证,也会使用跟客户端同样的方式生成 Session Secret,一切准备好之后,会给客户端发送一个 ChangeCipherSpec,告知客户端已经切换到协商过的加密套件状态,准备使用加密套件和 Session Secret加密数据了。之后,服务端也会使用 Session Secret 加密一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功。 60 | 61 | ### 几个secret 62 | !["tls-kes-create"](https://github.com/micolore/blogs/blob/master/protocol/img/tls-keys-create.svg) 63 | 64 | 65 | 参考连接:   66 | [SSL/TLS原理详解](https://segmentfault.com/a/1190000002554673) 67 | -------------------------------------------------------------------------------- /read-action/201802.md: -------------------------------------------------------------------------------- 1 | # 2018-02-07 2 | 3 | ## Wednesday 4 | 5 | * JFR Java Flight Recorder,Java飞行器收集应用&虚拟机的信息 6 | * JMC Java Mission Control 7 | 8 | ## Thursday 9 | * btrace a safe, dynamic tracing tool for the Java platform 10 | 11 | ## Friday 12 | * AbstractQueuedSynchronizer 13 | 14 | ## 2.26 15 | * JNI Java Native Interface JAVA本地调用,允许java调用其他语言 16 |  Example: compareAndSwapInt   17 | 18 | * php-fpm nginx 19 | -------------------------------------------------------------------------------- /read-action/201803.md: -------------------------------------------------------------------------------- 1 | # 2018-3 2 | 3 | ## 03-02 4 | java 日志: slf4j 、logback、log4j2 5 |   [该让log4j退休了 - 论Java日志组件的选择](https://www.jianshu.com/p/85d141365d39) 6 | ## 03-06 7 | * PostgreSQL 8 | https://www.postgresql.org 9 | * 前端测试 10 | Karma+Mocha+chai+emzyme+Istanbul 11 | 测试管理工具 测试环境库、 断言库 页面测试库 覆盖率库 12 | 13 | ## 03-08 14 | 龙书(Dragon book) Compilers: Principles,Techniques,and Tools 15 | 编译原理技术和工具 16 | 17 | 虎书(Tiger book)Modern Compiler Implementation in C 18 | 现代编译原理-C语言描述 19 | 20 | 鲸书(Whale book) Advanced Compiler Design and Implementation 21 | 高级编译器设计与实现 22 | 23 | ## 03-12 24 | 数据结构 25 | [visualgo](https://visualgo.net/en) 26 | 27 | ## 03-30 28 | jmap mat 线上服务器问题分析,感觉还是没有系统的流程去进行分析,还需要进行看相关资料,做好研究结论 29 | 输出到纸上,针对具体的问题,针对性测试。 30 | 关于这几天在脑子频繁出现的问题,就是java class怎么在虚拟机里面运行的,看来莫枢大大的那个jvm分析比较牛逼啊 31 | -------------------------------------------------------------------------------- /read-action/201804.md: -------------------------------------------------------------------------------- 1 | # 2018-04 2 | 接受任何新事物时,首先去怀疑它。 3 | 4 | ## 0425 5 | ### Piont (Linkedin) 6 | Pinot is a realtime distributed OLAP datastore 7 | 8 | ### Helix 9 | A cluster management framework for partitioned and replicated distributed resources 10 | [helix](http://helix.apache.org/) 11 | 12 | ### samza 13 | Apache Samza is a distributed stream processing framework. It uses Apache Kafka for messaging, and Apache Hadoop YARN to provide fault tolerance, processor isolation, security, and resource management     14 | [Samza](http://samza.apache.org/) 15 | 16 | 17 | ### HDFS 18 | HDFS is the primary distributed storage used by Hadoop applications 19 | [HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) 20 | 21 | ### 数据处理 22 | * 联机事务处理OLTP(on-line transaction processing) 23 | OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易 24 | * 联机分析处理OLAP(On-Line Analytical Processing) 25 | OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果 26 | 27 | | |OLTP|OLAP | 28 | -|------|-------| 29 | |用户 |操作人员,低层管理人员 |决策人员,高级管理人员 30 | |功能 |日常操作处理 | 分析决策 31 | |DB 设计 |面向应用 | 面向主题 32 | |数据 |当前的, 最新的细节的, | 二维的分立的 历史的, 聚集的, 多维的集成的, 统一的 33 | |存取 |读/写数十条记录 | 读上百万条记录 34 | |工作单位 | 简单的事务 |复杂的查询 35 | |用户数 |上千个 | 上百个 36 | |DB 大小 |100MB-GB |100GB-TB 37 | 38 | > TPCC(Transaction Processing Performance Council)、TPCH 39 | 40 | #### User-Defined Functions (UDFs) 41 | User-defined functions (frequently abbreviated as UDFs) let you code your own application logic for processing column values during an Impala query. 42 | [udfs](https://www.cloudera.com/documentation/cdh/5-0-x/Impala/Installing-and-Using-Impala/ciiu_udf.html) 43 | 44 | #### AOS SOA 45 | 在需要高频率(如渲染循环中)访问数据的时候,一般情况下SOA的效率高于AOS,因为将需要频繁访问的数据连续存放会大大提高访问速度。虽然AOS的结构可能更适合面向对象设计,但是在高度依赖效率的地方应该使用SOA。 46 | 47 | #### AVRO 48 | Apache Avro™ is a data serialization system. 49 | [avro](https://avro.apache.org/) 50 | 51 | 52 | 53 | ### slideshare (Linkedin) 54 | [SlideShare](https://www.slideshare.net) 55 | 56 | ## 0426 57 | 58 | 59 | ### day summarize 60 | > 日积月累的知识在必要的时候总会能体现出来,平时不需要太用力。也比平时突击一个重要的知识点要强,因为它在你脑子里只会存在那一段时间。 61 | 输入伴随你自身的编译系统解码成你能够明白的代码,才能慢慢形成属于你自己的知识结构。 62 | 63 | ## 0428 64 | ### XA数据源 (eXtended Architecture) 65 | * 非 XA 数据源 66 | 用于不使用事务的应用程序,或者使用的事务只有一个数据库的应用程序。 67 | * XA 数据源 68 | 将多个数据库或其他 XA 资源作为 XA 事务的一部分使用的应用程序会使用它。XA 数据源会导致额外的负荷。 69 | 70 | [what's XA?](https://www.atomikos.com/Documentation/WhatIsXa) 71 | 72 | ### JTA 73 | JTA (Java Transaction API) defines the interfaces for Java applications to interact with the platform-specific transaction manager. Like most APIs in Java 74 | 75 | ## 0502 76 | * Gradle 77 | Java的自动化构建工具,大家一定对Ant和Maven都不会陌生,对,Gradle就是这样一种类似的工具,不过它比Ant和Maven强大的多,而且使用起来更加方便简单并且兼容Maven。Gradle是以Groovy为基础,面向java应用,基于DSL语法的自动化构建工具。是google引入,替换ant和maven的新工具 78 | 79 | ## other 80 | * 好奇心、怀疑的精神 81 | * 对已有技术、方法、模式和理论的不盲信不盲从 82 | * 不断试错(需要承担风险、成本,也需要一种韧劲儿) 83 | * 从细节中找到“密码”,而不是格局 84 | * 抛去对虚名的追逐,别被羁绊,才有继续探索的可能 85 | 86 | -------------------------------------------------------------------------------- /read-action/201805.md: -------------------------------------------------------------------------------- 1 | # 201805 2 | 3 | ## 0502 4 | 5 | * 元数据是用来描述数据的数据(Data that describes other data) 6 | 元数据最大的好处是,它使信息的描述和分类可以实现格式化,从而为机器处理创造了可能。我原来以为是原始数据,看来是我想错了。 7 | 8 | > 贪多嚼不烂,做减法,什么不能做,不断的往外面扔东西,最后留下的就是你真正喜欢的 9 | 10 | > 怎么建立个人的体系,知识、交友、思想,不要让大脑接触的都是旧的的知识,但是必须要打好基础。 11 | 得出自己独特的见解,为以后的判断积累经验。 12 | 13 | ## 0508 14 | 15 | * 已经从eclipse换到 idea上面了,大概一天多就习惯了,开始折腾 16 | * 反思下最近好像没有学习c 、数据结构、以及英语书。 17 |  python、lua、perl也没坚持下去,没有毅力啊。主要还是不知道学了做什么,不然只是看api是没有继续下去的动力。 18 |  所以还是需要找个目标,网站也好,小工具也好都是用来练手的一个开始。 19 | * 关于jvm 又重新过了一遍收集器,唯一的一个感悟就是不是什么事情都需要去看gc的日志,有时候你写的就是bug 20 | * i need a plan not only java and english and other language must do it 21 | 22 | 23 | ## 0510 24 | perl 很多好玩的特性,不用声明变量,重视场景 25 | * 标量 复数 26 | * CPAN (comprehensive perl archive network) 综合存档网络 27 | * perl -e 'print "hello world perl!\n";' i like it 28 | * TMTOWTDI 29 | * CGI 通用网关接口(Common Gateway Interface) 30 | * 时间+空间+场景 等于一个具体的画面,帮助你更能有效的记忆 31 | * 兴趣是让你不断向前的唯一动力,不要膨胀。 32 | [githup books](https://www.jianshu.com/p/0f122a6120e7) 33 | 34 | ## 0511 35 | * 学英语 学perl 不打游戏 多思考 36 | [goldendict下优质词典简介及安装](https://blog.yuanbin.me/posts/2013-01/2013-01-31_23-07-00.html) 37 | 38 | ## 0515 39 | * JAPH 40 | * 自然语言 41 | 42 | 43 | ## 0521 44 | * OCR (Optical Character Recognition) 光学字符识别 45 | 46 | ## 0528 47 | * showdoc 48 | [一个非常适合IT团队的在线API文档、技术文档工具](http://www.showdoc.cc) 49 | 50 | ## 0530 51 | * 富文本转成图片的本质还是html转成图片 52 | [php](http://xmsay.com/html%E9%A1%B5%E9%9D%A2%E7%94%9F%E6%88%90%E8%BD%AC%E6%8D%A2%E6%88%90imagepngimg%E5%9B%BE%E7%89%87%E7%9A%84%E5%8E%9F%E7%90%86%E6%96%B9%E6%B3%95%E7%A8%8B%E5%BA%8F%E5%9C%A8%E6%9C%8D%E5%8A%A1/) 53 | -------------------------------------------------------------------------------- /read-action/201806.md: -------------------------------------------------------------------------------- 1 | # 2018-06-01 2 | 3 | ## 06-02 4 | * 原型图 5 | [产品原型工具](http://next.36kr.com/posts/collections/1) 6 | * 流程图 7 | [processon](https://processon.com/) 8 | 9 | 10 | ## 06-05 11 | * time-line 12 | 13 | * 想做一个老詹的网站 14 | 把老詹从进联盟到现在他所有的新闻、所有说的话都收录下来,比球星看台做的更好 15 | hupu ? _ 16 | * 旅行app 推荐、规划路线、 17 | * 我想我还是适合做一个产品经理 18 | * every day is new 19 | * i must very hard study english 20 | * up 21 | 22 | ## 06-10 23 | * Segmentation fault 24 | 所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间,访问了不可访问的内存,这个内存要么是不存在的,要么是受系统保护的 25 | 我所遇到的是变量类型不一致 26 | * %s %d 27 | d,o,x,u,c,s,f,e,g 28 | -------------------------------------------------------------------------------- /read-action/201807.md: -------------------------------------------------------------------------------- 1 | ## 7月 2 | everyday and everything is new 3 | 4 | ## 20180717 5 | * [The Go Programming Language](https://golang.org/) 6 | * 雪球 7 | 8 | ## 20180718 9 | * go的指针传递的原因是什么 10 | go默认值传递,有些结构体比较大,传递效率就相对较低。 11 | * 从计算机的角度去理解语言设计的初衷相对会更容易理解 12 | 学xx语言是为了解决某些方面的问题,最好是做点它锁擅长的领域的轮子出来 13 | -------------------------------------------------------------------------------- /read-action/read-action.md: -------------------------------------------------------------------------------- 1 | # read-action 2 | 3 | 断断续续 ,东啃一口,西吃一块,不成体系,学的很快,忘的也很快。 4 | 5 | > 遇到新的观点、新的概念、新的名词,不要排斥,先自己仔细的思考这是个什么东西,具有什么特点,然后google别人对此的理解。 6 | 看是是否对自己的认知体系有没有可取之处。有则取,无则舍,这个过程相对是美好的。   7 | 8 | > 当然也不需要什么都要进行刨根问底,精力有限,感兴趣的,可以适当的花时间做些研究,不要做做一个人云亦云的人。 9 | 10 | > 要种就种一颗参天大树,而不是河边的歪脖子树。 11 | 12 | -------------------------------------------------------------------------------- /schedule.md: -------------------------------------------------------------------------------- 1 | # every day must read & write 2 | 3 | ## ms-spider java project 4 | 5 | 6 | ## http.md 7 | 8 | 9 | ## rust.md 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /service/emacs-test: -------------------------------------------------------------------------------- 1 | hello world 2 | ctrl-a row start 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | meta-g meta-g go line 13 | ctrl-d delete 14 | ctrl-k kill 15 | ctrl-y yank ss 16 | meta-d delete world 17 | 18 | love love 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /service/lopscoop-api.eamcs: -------------------------------------------------------------------------------- 1 | ## api for lop 2 | 3 | ## user 4 | 用户注册 5 | 徒弟列表 6 | 用户提现 7 | 自动绑定邀请码 8 | 绑定paytm 9 | 完善个人资料 10 | 第三方登录 11 | 手机号登录 12 | 更新token 13 | 基础配置信息 14 | 用户账户信息 15 | 16 | ## content 17 | 标签内容列表 18 | trending列表 19 | 内容收藏 20 | 取消内容收藏 21 | 内容阅读上报 22 | 内容评论列表 23 | 视频子频道列表 24 | 内容分享 25 | 内容搜索 26 | 搜索热词列表 27 | 频道内容列表广告回调 28 | 获取广告信息 29 | 分享内容列表 30 | 我的频道列表 31 | 内容详情 32 | 点赞内容 33 | 编辑频道 34 | 评论 35 | 推荐内容列表 36 | 内容收藏列表 37 | foryou列表 38 | 屏蔽内容 39 | 40 | ### 公共接口 41 | 获取手机验证码 42 | feedback 上报 43 | app策略配置 44 | 用户基本配置信息 45 | 根据手机号重置密码 46 | 图片上传 47 | 设备注册 48 | 新版本提示更新 49 | 公告列表 50 | 广告策略配置 51 | 获取邮箱验证码 52 | 用户行为上报 53 | 静态资源配置 54 | 55 | ### 活动&活动相关 56 | 活动指一般展示的h5页面 57 | 任务则是活动的具体的细节,在具体点就是代码的逻辑 58 | 59 | 60 | 任务进度 61 | 获取宝箱时段倒计时 62 | 任务上报接口 63 | 客户端手动上报的任务 64 | 服务端触发的任务 65 | 绑定邀请码 66 | 67 | 每日签到 68 | 绑定facebook 69 | 我的等级 70 | 商品下单接口 71 | 72 | ### h5 73 | 一些展示类的数据可以使用h5进行处理 74 | 75 | 账户详细记录列表 76 | 积分兑换 77 | 绑定paytm 78 | 获取账户信息 79 | 分享邀请好友得卢比活动 80 | 商品数量 81 | 活动分享 82 | 转盘抽奖 83 | 转盘数据 84 | 用户提现 85 | -------------------------------------------------------------------------------- /service/lopscoop-service.md: -------------------------------------------------------------------------------- 1 | 重构,为什么要重构?面对日益增长的用户量以及产品业务的不断发展,系统目前的架构完全支撑不了。 2 | 截止目前系统的主要压力来自于数据库以及缓存的压力,以及接口的不合理(针对业务需要的不断变化) 3 | 坑也就在不断的追赶业务中进行增加,为了业务的继续发展,系统需要重构 4 | 5 | 假如 系统拆成微服务架构,问题来了 6 | 1. 但是配套的配置系统,服务治理系统是不是也要跟上?这个比较纠结 7 | 2. 系统拆分以具体的业务模块进行拆分呢? 8 | 内容? 用户? 活动? 9 | 3. 数据库是否也需要进行拆分? 10 | 4. 缓存的服务是否需要进行管理? 11 | 5. 如果都拆成服务,那就会引入rpc进行服务内部调用 12 | 13 | ## 拆分 14 | ### 业务 15 | ### 服务 16 | ### 资源 17 | 18 | ## 接口 19 | ### 请求 20 | 1. 客户端避免重复请求 21 | 2. 基础数据请求控制在一次,或者每天几次,最好是服务器端进行通知客户端有改动然后进行拉取新的配置 22 | 3. 综合请求数据 23 | 24 | ### 关于请求接口的次数与返回值大小的取舍 25 | 请求次数很少 一定会好么? 26 | 同样如果返回值太大也一定不好么? 27 | 1· 这取决于服务器的运行情况, 28 | 如果整体请求量很大,那么可以适当的降低请求次数 29 | 如果整体请求量不大,那么就不用纠结返回值的大小 30 | 2. 31 | 取决于用户使用数据的频次 32 | 频次划分 33 | 少量 1-3 学历、兴趣列表、印度联邦列表、app策略配置 34 | 中等 10-20 公告列表、广告策略配置、 35 | 大量 20-100 36 | 37 | 38 | ## 测试 39 | ### 单元测试 40 | ### 性能测试 41 | ### 端到端测试 42 | ### 功能测试 43 | ### 其他 44 | 1. 权衡 45 | 2. 比例 46 | 47 | ### design 48 | 目标 减少数据库的query,减少单表的存储量,代码更容易维护,迭代更加快速 49 | 1. 用户信息是否可以拆成两个表 50 | 基本的用户信息+具体的用户详细信息 51 | 2. 业务需要缩减,重复的策略会影响用户的选择 52 | 53 | ### 缓存 54 | 1. 内存相关 55 | key 的数量、value的大小、key的过期时间 56 | 2. 缓存的效率相关 57 | key的更新频率、key的命中率 58 | 3、缓存与数据库的一致性要求 59 | 4、单个key的占用内存大小 单个value的内存占用大小 60 | 5、线上的缓存服务器大小控制在多少? 6G? 32G? 61 | 62 | ### 新版本重点关注的地方 63 | 1. 统计 64 | 监控、用户行为分析 65 | 2. 日常数据的记录与备份 66 | 对于增量数据,可以进行完全备份 按天或者按月 67 | 对于存量数据,尽量优化数据结构,便于查询,新增,或者修改 68 | 3. 接口响应的速度,安全性,独立性 69 | 4. 缓存的结构设计 70 | 5. 代码的复用性,清晰化,模块化 71 | ### 老版本的问题 72 | 1. 接口混乱 73 | 2. 缓存使用不合理 74 | 不规范 75 | 3. 数据库设计不合理 76 | 4. 代码冗余太多 77 | 5. 后台不够人性化 统计不够完善 78 | 6. 扩展不够灵活 79 | 7. 迭代速度慢 80 | 8. 发布痛苦 81 | 9. 接口服务版本难控制 82 | 10. 接口发布更新版本没有记录 83 | 11. 测试不够方便 84 | 85 | ### 目标以及计划 86 | 1. 接口更加的合理 87 | 具体的落实点在哪? 88 | 1. 参数、返回值合理 89 | 2. 接口无状态 90 | 3. 安全 91 | 4. 灵活 92 | 5. 接口文档的后续维护 93 | 6. 接口需求的文档化 94 | 2. 服务可用化、稳定性提高 95 | 3. 数据库更加方便扩展 96 | 4. 代码的可维护性提高 97 | 98 | -------------------------------------------------------------------------------- /service/service-architecture.md: -------------------------------------------------------------------------------- 1 | # 服务架构 2 | 3 | 4 | ## 微服务 5 | 6 | 缺点: 开发跟不上具体的业务需要 7 | 调用链过长、拓扑图极恐怖 8 | 9 | 10 | ## soa 11 | 12 | ## serverless 13 | 14 | ## 关键名词 15 | 1. GraphQL 16 | 2. oauth2 17 | 18 | ## 关键思想 19 | 1. 系统在设计中演变,在演变中设计.尤其在相当长时间内的演变,更加明显 20 | 2. 架构师所需的思维 21 | 管理复杂性、抽象、分层、分治、演化 22 | 3. 没有银弹 23 | 4. 保证服务的低耦合、高内聚 -------------------------------------------------------------------------------- /test/wrk2/wrk-around-index-api.lua: -------------------------------------------------------------------------------- 1 | urimap = { 2 | "/around-api/content/index", 3 | } 4 | 5 | methodmap = { 6 | "POST", 7 | } 8 | 9 | params = { 10 | [[{"id":2}]], 11 | [[{"spu_id":2,"type":1}]], 12 | [[{"id":2,"sku_id":7}]], -- 双中括号里面不转译 13 | "page=1&size=100", 14 | "", 15 | "", 16 | } 17 | 18 | math.randomseed(os.time()) 19 | 20 | init = function() 21 | local r = {} 22 | local path = "" -- 局部变量(不加local 是全局变量) 23 | local method = "get" -- 默认get 24 | 25 | -- header 头 26 | wrk.headers["Hash"]= "85280aa135bbd0108dd6aa424565a" 27 | wrk.headers["Token"]= "" 28 | wrk.headers["longitude"]= "121.610704" 29 | wrk.headers["latitude"]= "31.214563" 30 | for i, v in ipairs(urimap) do -- 键从1 开始 非 0 31 | path = v -- 路径 32 | method = methodmap[i] -- method 33 | 34 | if method == "POST" then 35 | wrk.headers["content-type"]= "application/json" --POST 参数json格式 36 | wrk.body = params[i] 37 | end 38 | 39 | if method == "GET" and params[i] ~= "" then 40 | path = v .. "?" ..params[i] 41 | end 42 | 43 | io.write(method, "---", params[i], "----", path, "\n") -- 打印请求方式(1个线程会打印一次),参数,路径(不含域名) 44 | r[i] = wrk.format(method, path) 45 | end 46 | 47 | req = table.concat(r) 48 | end 49 | 50 | request = function() 51 | return req 52 | end 53 | 54 | response = function(status, headers, body) 55 | if status ~= 200 then 56 | print("status:", status) 57 | print("error:", body) 58 | wrk.thread:stop() 59 | else 60 | -- print("body:", body) 61 | end 62 | end 63 | 64 | done = function(summary, latency, requests) 65 | 66 | local durations=summary.duration / 1000000 -- 执行时间,单位是秒 67 | local errors=summary.errors.status -- http status不是200,300开头的 68 | local requests=summary.requests -- 总的请求数 69 | local valid=requests-errors -- 有效请求数=总请求数-error请求数 70 | 71 | io.write("Durations: "..string.format("%.2f",durations).."s".."\n") 72 | io.write("Requests: "..summary.requests.."\n") 73 | io.write("Avg RT: "..string.format("%.2f",latency.mean / 1000).."ms".."\n") 74 | io.write("Max RT: "..(latency.max / 1000).."ms".."\n") 75 | io.write("Min RT: "..(latency.min / 1000).."ms".."\n") 76 | io.write("Error requests: "..errors.."\n") 77 | io.write("Valid requests: "..valid.."\n") 78 | io.write("QPS: "..string.format("%.2f",valid / durations).."\n") 79 | io.write("--------------------------\n") 80 | 81 | end 82 | -------------------------------------------------------------------------------- /test/wrk2/wrk-around-more-request.lua: -------------------------------------------------------------------------------- 1 | urimap = { 2 | "/around-api/content/index", 3 | "/around-api/common/strategy" 4 | } 5 | 6 | methodmap = { 7 | "POST", 8 | "POST" 9 | } 10 | 11 | headermap = { 12 | "application/x-www-form-urlencoded", 13 | "application/json" 14 | } 15 | 16 | params = { 17 | "page=1", 18 | "" 19 | --[[{"spu_id":2,"type":1}]], 20 | --[[{"id":2,"sku_id":7}]] -- 双中括号里面不转译 21 | --"page=1&size=100", 22 | --"", 23 | --"", 24 | } 25 | 26 | math.randomseed(os.time()) 27 | 28 | init = function() 29 | local r = {} 30 | local path = "" -- 局部变量(不加local 是全局变量) 31 | local method = "get" -- 默认get 32 | 33 | -- header 头 34 | wrk.headers["Hash"]= "85280aa135bbd0108dd6aa424565a" 35 | wrk.headers["Token"]= "" 36 | wrk.headers["longitude"]= "121.610704" 37 | wrk.headers["latitude"]= "31.214563" 38 | for i, v in ipairs(urimap) do -- 键从1 开始 非 0 39 | path = v -- 路径 40 | method = methodmap[i] -- method 41 | 42 | if method == "POST" then 43 | wrk.headers["content-type"]= headermap[i] 44 | wrk.body = params[i] 45 | --wrk.body = "{\"page\":111}" 46 | --print (wrk.body) 47 | end 48 | 49 | if method == "GET" and params[i] ~= "" then 50 | path = v .. "?" ..params[i] 51 | end 52 | 53 | io.write(method, "---", params[i], "----", path, "\n") -- 打印请求方式(1个线程会打印一次),参数,路径(不含域名) 54 | r[i] = wrk.format(method, path) 55 | end 56 | 57 | req = table.concat(r) 58 | end 59 | 60 | request = function() 61 | return req 62 | end 63 | 64 | response = function(status, headers, body) 65 | if status ~= 200 then 66 | print("status:", status) 67 | print("error:", body) 68 | wrk.thread:stop() 69 | else 70 | -- print("body:", body) 71 | end 72 | end 73 | 74 | done = function(summary, latency, requests) 75 | 76 | local durations=summary.duration / 1000000 -- 执行时间,单位是秒 77 | local errors=summary.errors.status -- http status不是200,300开头的 78 | local requests=summary.requests -- 总的请求数 79 | local valid=requests-errors -- 有效请求数=总请求数-error请求数 80 | 81 | io.write("Durations: "..string.format("%.2f",durations).."s".."\n") 82 | io.write("Requests: "..summary.requests.."\n") 83 | io.write("Avg RT: "..string.format("%.2f",latency.mean / 1000).."ms".."\n") 84 | io.write("Max RT: "..(latency.max / 1000).."ms".."\n") 85 | io.write("Min RT: "..(latency.min / 1000).."ms".."\n") 86 | io.write("Error requests: "..errors.."\n") 87 | io.write("Valid requests: "..valid.."\n") 88 | io.write("QPS: "..string.format("%.2f",valid / durations).."\n") 89 | io.write("--------------------------\n") 90 | 91 | end 92 | -------------------------------------------------------------------------------- /test/wrk2/wrk-around-strategy-api.lua: -------------------------------------------------------------------------------- 1 | urimap = { 2 | "/", 3 | } 4 | 5 | methodmap = { 6 | "POST", 7 | } 8 | 9 | params = { 10 | "", 11 | "", 12 | } 13 | 14 | math.randomseed(os.time()) 15 | 16 | init = function() 17 | local r = {} 18 | local path = "" -- 局部变量(不加local 是全局变量) 19 | local method = "get" -- 默认get 20 | 21 | -- header 头 22 | wrk.headers["Hash"]= "85280aa135bbd0108dd6aa424565a" 23 | wrk.headers["Token"]= "" 24 | for i, v in ipairs(urimap) do -- 键从1 开始 非 0 25 | path = v -- 路径 26 | method = methodmap[i] -- method 27 | 28 | if method == "POST" then 29 | wrk.headers["content-type"]= "application/json" --POST 参数json格式 30 | wrk.body = params[i] 31 | end 32 | 33 | if method == "GET" and params[i] ~= "" then 34 | path = v .. "?" ..params[i] 35 | end 36 | 37 | io.write(method, "---", params[i], "----", path, "\n") -- 打印请求方式(1个线程会打印一次),参数,路径(不含域名) 38 | r[i] = wrk.format(method, path) 39 | end 40 | 41 | req = table.concat(r) 42 | end 43 | 44 | request = function() 45 | return req 46 | end 47 | 48 | response = function(status, headers, body) 49 | if status ~= 200 then 50 | print("status:", status) 51 | print("error:", body) 52 | wrk.thread:stop() 53 | else 54 | -- print("body:", body) 55 | end 56 | end 57 | 58 | done = function(summary, latency, requests) 59 | 60 | local durations=summary.duration / 1000000 -- 执行时间,单位是秒 61 | local errors=summary.errors.status -- http status不是200,300开头的 62 | local requests=summary.requests -- 总的请求数 63 | local valid=requests-errors -- 有效请求数=总请求数-error请求数 64 | 65 | io.write("Durations: "..string.format("%.2f",durations).."s".."\n") 66 | io.write("Requests: "..summary.requests.."\n") 67 | io.write("Avg RT: "..string.format("%.2f",latency.mean / 1000).."ms".."\n") 68 | io.write("Max RT: "..(latency.max / 1000).."ms".."\n") 69 | io.write("Min RT: "..(latency.min / 1000).."ms".."\n") 70 | io.write("Error requests: "..errors.."\n") 71 | io.write("Valid requests: "..valid.."\n") 72 | io.write("QPS: "..string.format("%.2f",valid / durations).."\n") 73 | io.write("--------------------------\n") 74 | 75 | end 76 | -------------------------------------------------------------------------------- /test/wrk2/wrk-around-upload-pic-api.lua: -------------------------------------------------------------------------------- 1 | urimap = { 2 | "/around-api/common/upload/pic", 3 | } 4 | 5 | methodmap = { 6 | "POST", 7 | } 8 | 9 | params = { 10 | --[[{"spu_id":2,"type":1}]] 11 | --[[{"id":2,"sku_id":7}]] -- 双中括号里面不转译 12 | "&type=1" 13 | --"", 14 | --"", 15 | } 16 | 17 | math.randomseed(os.time()) 18 | 19 | function read_txt_file(path) 20 | local file, errorMessage = io.open(path, "r") 21 | if not file then 22 | error("Could not read the file:" .. errorMessage .. "\n") 23 | end 24 | 25 | local content = file:read "*all" 26 | file:close() 27 | return content 28 | end 29 | 30 | local Boundary = "----WebKitFormBoundaryePkpFF7tjBAqx29L" 31 | local BodyBoundary = "--" .. Boundary 32 | local LastBoundary = "--" .. Boundary .. "--" 33 | 34 | local CRLF = "\r\n" 35 | 36 | local FileBody = read_txt_file("/Users/root1/Documents/pic/_thumb_P_15537977900253.jpg") 37 | 38 | local Filename = "wrk-lua.jpg" 39 | 40 | local ContentDisposition = "Content-Disposition: form-data; name=\"file\"; filename=\"" .. Filename .. "\"" 41 | 42 | 43 | init = function() 44 | local r = {} 45 | local path = "" -- 局部变量(不加local 是全局变量) 46 | local method = "get" -- 默认get 47 | 48 | -- header 头 49 | wrk.headers["Hash"]= "85280aa135bbd0108dd6aa424565a" 50 | wrk.headers["Token"]= "" 51 | wrk.headers["user_id"]= "2" 52 | wrk.headers["longitude"]= "121.610704" 53 | wrk.headers["latitude"]= "31.214563" 54 | 55 | for i, v in ipairs(urimap) do -- 键从1 开始 非 0 56 | path = v -- 路径 57 | method = methodmap[i] -- method 58 | 59 | if method == "POST" then 60 | wrk.headers["Content-Type"] = "multipart/form-data; boundary=" .. Boundary 61 | --wrk.body = params[i] 62 | wrk.body = BodyBoundary .. CRLF .. ContentDisposition .. CRLF .. CRLF .. FileBody .. CRLF .. LastBoundary .. CRLF 63 | --wrk.body = "type=1" 64 | end 65 | 66 | if method == "GET" and params[i] ~= "" then 67 | path = v .. "?" ..params[i] 68 | end 69 | 70 | io.write(method, "---", params[i], "----", path, "\n") -- 打印请求方式(1个线程会打印一次),参数,路径(不含域名) 71 | r[i] = wrk.format(method, path) 72 | end 73 | 74 | req = table.concat(r) 75 | end 76 | 77 | request = function() 78 | return req 79 | end 80 | 81 | response = function(status, headers, body) 82 | if status ~= 200 then 83 | print("status:", status) 84 | print("error:", body) 85 | wrk.thread:stop() 86 | else 87 | -- print("body:", body) 88 | end 89 | end 90 | 91 | done = function(summary, latency, requests) 92 | 93 | local durations=summary.duration / 1000000 -- 执行时间,单位是秒 94 | local errors=summary.errors.status -- http status不是200,300开头的 95 | local requests=summary.requests -- 总的请求数 96 | local valid=requests-errors -- 有效请求数=总请求数-error请求数 97 | 98 | io.write("Durations: "..string.format("%.2f",durations).."s".."\n") 99 | io.write("Requests: "..summary.requests.."\n") 100 | io.write("Avg RT: "..string.format("%.2f",latency.mean / 1000).."ms".."\n") 101 | io.write("Max RT: "..(latency.max / 1000).."ms".."\n") 102 | io.write("Min RT: "..(latency.min / 1000).."ms".."\n") 103 | io.write("Error requests: "..errors.."\n") 104 | io.write("Valid requests: "..valid.."\n") 105 | io.write("QPS: "..string.format("%.2f",valid / durations).."\n") 106 | io.write("--------------------------\n") 107 | 108 | end 109 | -------------------------------------------------------------------------------- /test/wrk2/wrk-standand-website.lua: -------------------------------------------------------------------------------- 1 | urimap = { 2 | "/", 3 | } 4 | 5 | methodmap = { 6 | "GET", 7 | } 8 | 9 | params = { 10 | [[{"id":2}]], 11 | [[{"spu_id":2,"type":1}]], 12 | [[{"id":2,"sku_id":7}]], -- 双中括号里面不转译 13 | "page=1&size=100", 14 | "", 15 | "", 16 | } 17 | 18 | math.randomseed(os.time()) 19 | 20 | init = function() 21 | local r = {} 22 | local path = "" -- 局部变量(不加local 是全局变量) 23 | local method = "get" -- 默认get 24 | 25 | -- header 头 26 | wrk.headers["Hash"]= "85280aa135bbd0108dd6aa424565a" 27 | wrk.headers["Token"]= "" 28 | for i, v in ipairs(urimap) do -- 键从1 开始 非 0 29 | path = v -- 路径 30 | method = methodmap[i] -- method 31 | 32 | if method == "POST" then 33 | wrk.headers["content-type"]= "application/json" --POST 参数json格式 34 | wrk.body = params[i] 35 | end 36 | 37 | if method == "GET" and params[i] ~= "" then 38 | path = v .. "?" ..params[i] 39 | end 40 | 41 | io.write(method, "---", params[i], "----", path, "\n") -- 打印请求方式(1个线程会打印一次),参数,路径(不含域名) 42 | r[i] = wrk.format(method, path) 43 | end 44 | 45 | req = table.concat(r) 46 | end 47 | 48 | request = function() 49 | return req 50 | end 51 | 52 | response = function(status, headers, body) 53 | if status ~= 200 then 54 | print("status:", status) 55 | print("error:", body) 56 | wrk.thread:stop() 57 | else 58 | -- print("body:", body) 59 | end 60 | end 61 | 62 | done = function(summary, latency, requests) 63 | 64 | local durations=summary.duration / 1000000 -- 执行时间,单位是秒 65 | local errors=summary.errors.status -- http status不是200,300开头的 66 | local requests=summary.requests -- 总的请求数 67 | local valid=requests-errors -- 有效请求数=总请求数-error请求数 68 | 69 | io.write("Durations: "..string.format("%.2f",durations).."s".."\n") 70 | io.write("Requests: "..summary.requests.."\n") 71 | io.write("Avg RT: "..string.format("%.2f",latency.mean / 1000).."ms".."\n") 72 | io.write("Max RT: "..(latency.max / 1000).."ms".."\n") 73 | io.write("Min RT: "..(latency.min / 1000).."ms".."\n") 74 | io.write("Error requests: "..errors.."\n") 75 | io.write("Valid requests: "..valid.."\n") 76 | io.write("QPS: "..string.format("%.2f",valid / durations).."\n") 77 | io.write("--------------------------\n") 78 | 79 | end 80 | -------------------------------------------------------------------------------- /thinking/Thinkingmodel.md: -------------------------------------------------------------------------------- 1 | # 思维模型 Thinking model 2 | 3 | ## 学习 4 | 5 | ### 费曼技巧 6 | 1. 确定主题 7 | 写下关于这个主题你知道的全部内容。当遇到新素材时,马上添加到参考资料中 8 | 9 | 2. 教给孩子 10 | * 用简单易懂的话语 11 | * 保持简洁 12 | 13 | 3. 发现缺口 14 | 这才是你真正学习的地方。如果你卡住了,就回到原始材料找原因,卡壳的地方就是你的知识缺口,你就要花时间钻研这个它,彻底搞清楚知识的来龙去脉,你将学到更多的知识。 15 | 16 | 4. 组织简化 17 | 将关于该主题的最重要的知识汇集在一起,用简洁故事的形式分享。可以大声朗读你的故事,假装你是在课堂上讲给学生听。在讲述的过程中你明白了语言的魅力,你还可以使用类比等方法。 18 | 19 | 在这个过程中如果卡壳了,被绊倒了,就表明你还对这个主题的理解不够完整。就回到了 Step 20 | 21 | > 1:存储于提取原则:存储的成本越低,获取的成本约高 ;反之,存储的成本高,获取的成本低 22 | 2.黄金圈原则:事物的理解程度从浅到深依次是:what->how->why。 23 | 24 | > 费曼技巧还可以得到一些改进:如果加上我的幂率原则(二八法则)、复利原则:步骤1:首先获得知识,但是只去获取最核心的知识,花时间专研20%的核心概念,做到能把概念解释通,可以问自己几个why。步骤2:然后讲述给自己,步骤3:要做到两点:在讲得清楚的前提下,然后强迫自己给自己提出3个意见,并去改进;如此重复三次 步骤4:再花一点时间把剩余的非核心知识简单梳理一遍;步骤5:搞定。没有孩子的可以发个博客。 25 | ## 决策 26 | 27 | ## 思考 28 | 29 | ## 其他想法 30 | > 长久以来,我坚信存在某个系统——几乎所有聪明人都能掌握的系统,它比绝大多数人用的系统管用。你需要做的是在你的头脑里形成一种思维模型的复式框架。有了那个系统之后,你就能逐渐提高对事物的认识。 31 | 你必须知道重要学科的重要理论,并经常使用它们——要全部都用上,而不是只用几种。大多数人都只使用学过的一个学科的思维模型,比如说经济学,试图用一种方法来解决所有问题,往往却并不可行,你必须在头脑中拥有一些思维模型,必须依靠这些模型组成的框架来安排你的经验,包括间接的和直接的。 32 | 33 | 34 | > 指导一个人能成功的需要哪些东西? 良好向上的价值观念+缜密的思维逻辑+坚决的执行力+坚持不懈的耐心(坚持) = 成功(人生) 35 | 36 | 37 | -------------------------------------------------------------------------------- /tools/chrome.md: -------------------------------------------------------------------------------- 1 | # chrome plugins 2 | 3 | ## code 4 | * view web githup code so easy [Octotree](https://github.com/buunguyen/octotree) 5 | 6 | -------------------------------------------------------------------------------- /tools/tool.md: -------------------------------------------------------------------------------- 1 | #### 画图 https://graphviz.gitlab.io/documentation/ 2 | 3 | #### https://sourceforge.net/projects/schemaspygui/ 4 | 5 | #### 数据库约束相关查看 https://github.com/schemaspy/schemaspy -------------------------------------------------------------------------------- /web-front-end/YSlow.md: -------------------------------------------------------------------------------- 1 | # YSlow 2 | 3 | ## 参数 4 | * 性能评级 F-A 5 | A是最优 F是最差 6 | 7 | * 加载时长 8 | * 页面大小 9 | 1 内容分类大小占比 10 | image、script、html、css 11 | 2 按照域名的请求内容大小 12 | 13 | * 请求数量 14 | 1 请求状态返回码 15 | 200、302 16 | 2 content type 17 | image、script、html、css 18 | 3 按照域名的请求数量分类 19 | * 查看请求时长最长的请求以及请求的结果集最大的请求 20 | * 网络中的耗时查看 21 | DNS SSL Connect Send Wait Receive 这几个也要进行观察 22 | * Content Types 23 | HTML HTML document 24 | Javascript JavaScript file 25 | CSS CSS file 26 | Image Image file 27 | Text/plain Plain text document 28 | Other Any other content type, for example flash files 29 | Warning The request got a 4XX, 5XX response or couldn’t be loaded 30 | Redirect The request got a 3XX response and was redirected 31 | 32 | ## 如何优化,使得网站响应速度更加的迅速 33 | * 尽量减少 HTTP请求 34 | * 减少 DNS查找 35 | * 避免跳转 36 | * 缓存 Ajxa 37 | * 推迟加载 38 | * 提前加载 39 | * 减少 DOM元素数量 40 | * 用域名划分页面内容 41 | * 使 frame数量最少 42 | * 避免 404错误 43 | 44 |  ## 常见处理方案 按照等级划分 45 | * Parallelize downloads across hostnames 46 | * Leverage browser caching 47 | * Combine external JavaScript 48 | * Serve static content from a cookieless domain 49 | * Minimize redirects 50 | * Minimize/reduce DNS lookups 51 | * Remove query strings from static resources 52 | * Specify a Vary: Accept-Encoding header 53 | * Specify a cache validator 54 | * Avoid bad requests 55 | * Combine external CSS 56 | * Minimize request size 57 | * Make javascript and css external 58 | * Avoid CSS expressions 59 | * Put CSS at top 60 | * Make fewer HTTP requests 61 | * Add Expires headers 62 | * Compress components with gzip 63 | * Put JavaScript at bottom 64 | * Minify JavaScript and CSS 65 | * Remove duplicate JavaScript and CSS 66 | * Configure entity tags (ETags) 67 | * Make AJAX cacheable 68 | * Use GET for AJAX requests 69 | * Reduce the number of DOM elements 70 | * Avoid HTTP 404 (Not Found) error 71 | * Reduce cookie size 72 | * Use cookie-free domains 73 | * Avoid AlphaImageLoader filter 74 | * Do not scale images in HTML 75 | * Make favicon small and cacheable 76 | * Flush the Buffer Early 77 | * Post-load Components 78 | * Preload Components 79 | * Split Components Across Domains 80 | * Minimize the Number of iframes 81 | * No 404s 82 | * Use Cookie-free Domains for Components 83 | * Minimize DOM Access 84 | * Develop Smart Event Handlers 85 | * Choose over @import 86 | * Avoid Filters 87 | * Optimize Images 88 | * Optimize CSS Sprites 89 | * Don't Scale Images in HTML 90 | * Keep Components under 25K 91 | * Pack Components into a Multipart Document 92 | * Avoid Empty Image src 93 | * Use a Content Delivery Network 94 | * Add an Expires or a Cache-Control Header 95 | * Gzip Components 96 | 97 | ![]() 98 | [20 种提升网页速度的技巧](https://www.ibm.com/developerworks/cn/web/wa-speedweb/index.html)     99 | 100 | [如何提高优化网站性能的30条规则方法](http://houshidai.com/internet/yahoo-optimize-web-rules.html) 101 | 102 | [yahoo developer performance rules](https://developer.yahoo.com/performance/rules.html) 103 | 104 | [cookie free](https://www.keycdn.com/support/how-to-use-cookie-free-domains/) 105 | -------------------------------------------------------------------------------- /web-front-end/readme.md: -------------------------------------------------------------------------------- 1 | # web front end 2 | -------------------------------------------------------------------------------- /work/2018/08/30_week.md: -------------------------------------------------------------------------------- 1 | # 20180806 2 | ## work 3 | * 缓存优化 4 | 减少key数量,保证每个key的value不是很大 5 | 频繁更新的热缓存,确保并发没问题 6 | * 缓存结构以及后续的更新都是很大的问题 7 | * 缓存的统计热点及利用率 8 | * 现在都不知道具体的缓存调用者都在什么地方 9 | delete a key so worry! 10 | * 自动更新 依赖具体的组件 11 | 而我想根据具体的业务进行更新或者删除、清空,那应该怎么办 12 | * 缓存的查询调用者、缓存的更新调用者 13 | 怎么样最大限度的解耦合 14 | 15 | 16 | ## mat 17 | * list object 18 | List objects with (以Dominator Tree的方式查看) 19 | incoming references 引用到该对象的对象 20 | outcoming references 被该对象引用的对象 21 | 22 | Show objects by class (以class的方式查看) 23 | incoming references 引用到该对象的对象 24 | outcoming references 被该对象引用的对象 25 | 参考链接: 26 | https://dzone.com/articles/java-thread-retained-memory 27 | http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory-analyser-mat/ 28 | ## me 29 | 弄清它的本质,在你的脑海里面是透明的,每个环节都了如指掌,遇到问题才能快速解决 30 | 31 | 32 | ## web服务器 33 | * 角色 34 | 通信维护者、请求处理者 35 | Connector负责的是底层的网络通信的实现 36 | Container负责的是上层servlet业务的实现 37 | 38 | -------------------------------------------------------------------------------- /work/2018/11/1120.md: -------------------------------------------------------------------------------- 1 | 缓存与业务的耦合性怎么平衡? 2 | 3 | 1. 缓存key的管理 4 | 失效期、key的访问相关统计、value的监控 5 | 2. 缓存总容量的控制 6 | 基本方针还是更少量的key,更少量的value 7 | 3. 策略 8 | 3.1 热数据与冷数据的比例控制在7/3 9 | 用户相关的数据 10 | 基本数据 11 | 公共纬度的数据 12 | user_name、user_email、user_mobile 13 | 4. 缓存初始化相关的操作 14 | 4.1 针对大数据量的列表或者其他重要级别低的数据 15 | 历史记录 ,可以预先初始化的一个记录到缓存里面去 16 | 4.2 相对重要的数据,其他地方使用作为判断的数据 17 | 查询初始化,但是也做一个保险措施,如果缓存中丢失了怎么办, 18 | 增加一个初始化的方法 19 | -------------------------------------------------------------------------------- /work/2018/11/1120.md~: -------------------------------------------------------------------------------- 1 | 缓存与业务的耦合性怎么平衡? 2 | 3 | 1. 缓存key的管理 4 | 失效期、key的访问相关统计、value的监控 5 | 2. 缓存总容量的控制 6 | 基本方针还是更少量的key,更少量的value 7 | 3. 策略 8 | 3.1 热数据与冷数据的比例控制在7/3 9 | 用户相关的数据 10 | 基本数据 11 | 公共纬度的数据 12 | user_name、user_email、user_mobile 13 | 4. 缓存初始化相关的操作 14 | 4.1 针对大数据量的列表或者其他重要级别低的数据 --------------------------------------------------------------------------------