├── source ├── uploads │ ├── avatar.gif │ ├── favicon.ico │ └── dunwu-logo.png ├── tags │ └── index.md ├── archives │ └── index.md ├── categories │ └── index.md ├── _posts │ ├── 02.编程 │ │ ├── 01.编程范式 │ │ │ ├── 如何阅读源码.md │ │ │ └── README.md │ │ ├── README.md │ │ └── 03.Python │ │ │ ├── README.md │ │ │ └── 01.基础特性 │ │ │ └── 04.Python控制语句.md │ ├── 01.Java │ │ ├── 12.工具 │ │ │ ├── 04.测试 │ │ │ │ └── README.md │ │ │ ├── 99.其他 │ │ │ │ ├── 02.Java工具包.md │ │ │ │ └── 07.Zxing.md │ │ │ ├── 01.IO │ │ │ │ └── README.md │ │ │ ├── README.md │ │ │ └── 03.模板引擎 │ │ │ │ └── README.md │ │ ├── 13.框架 │ │ │ ├── 01.Spring │ │ │ │ ├── 01.Spring核心 │ │ │ │ │ ├── 24.SpringEL.md │ │ │ │ │ ├── README.md │ │ │ │ │ └── 06.SpringBean作用域.md │ │ │ │ ├── 10.Spring安全 │ │ │ │ │ └── 01.SpringBoot之安全快速入门.md │ │ │ │ ├── 00.Spring综合 │ │ │ │ │ └── README.md │ │ │ │ ├── 99.Spring其他 │ │ │ │ │ └── README.md │ │ │ │ ├── 04.SpringIO │ │ │ │ │ └── README.md │ │ │ │ ├── 05.Spring集成 │ │ │ │ │ └── README.md │ │ │ │ └── 03.SpringWeb │ │ │ │ │ └── README.md │ │ │ ├── 13.IO │ │ │ │ └── README.md │ │ │ ├── 12.安全 │ │ │ │ └── README.md │ │ │ └── 11.ORM │ │ │ │ └── README.md │ │ ├── 11.软件 │ │ │ ├── 02.IDE │ │ │ │ ├── README.md │ │ │ │ └── 03.VsCode.md │ │ │ ├── 03.监控诊断 │ │ │ │ ├── README.md │ │ │ │ ├── 01.监控工具对比.md │ │ │ │ ├── 04.Skywalking.md │ │ │ │ └── 02.CAT.md │ │ │ ├── 01.构建 │ │ │ │ ├── README.md │ │ │ │ └── 01.Maven │ │ │ │ │ └── README.md │ │ │ └── README.md │ │ ├── 02.JavaEE │ │ │ ├── 02.服务器 │ │ │ │ ├── 01.Tomcat │ │ │ │ │ ├── README.md │ │ │ │ │ └── 05.Tomcat和Jetty.md │ │ │ │ └── README.md │ │ │ ├── 01.JavaWeb │ │ │ │ └── README.md │ │ │ └── README.md │ │ ├── 01.JavaCore │ │ │ ├── 04.IO │ │ │ │ └── README.md │ │ │ ├── 99.面试 │ │ │ │ └── README.md │ │ │ ├── 06.JVM │ │ │ │ ├── README.md │ │ │ │ └── Java_虚拟机_简介.md │ │ │ ├── 03.容器 │ │ │ │ ├── Java_容器_Stream.md │ │ │ │ └── README.md │ │ │ ├── 05.并发 │ │ │ │ └── README.md │ │ │ ├── 02.高级特性 │ │ │ │ └── README.md │ │ │ └── 01.基础特性 │ │ │ │ └── README.md │ │ └── 14.中间件 │ │ │ ├── README.md │ │ │ └── 02.缓存 │ │ │ ├── README.md │ │ │ └── 06.Http缓存.md │ ├── 12.数据库 │ │ ├── 01.数据库综合 │ │ │ └── README.md │ │ ├── 06.列式数据库 │ │ │ ├── hbase │ │ │ │ ├── HBase_API_高级特性_协处理器.md │ │ │ │ ├── README.md │ │ │ │ └── HBase_运维.md │ │ │ ├── Cassandra.md │ │ │ └── README.md │ │ ├── 02.数据库中间件 │ │ │ └── README.md │ │ ├── 04.文档数据库 │ │ │ ├── README.md │ │ │ └── mongodb │ │ │ │ └── README.md │ │ ├── 07.搜索引擎数据库 │ │ │ ├── elastic │ │ │ │ └── README.md │ │ │ └── elasticsearch │ │ │ │ └── README.md │ │ └── 05.KV数据库 │ │ │ ├── Memcached.md │ │ │ ├── README.md │ │ │ └── redis │ │ │ ├── Redis_脚本.md │ │ │ └── Redis_订阅.md │ ├── 16.大数据 │ │ ├── 综合 │ │ │ └── README.md │ │ ├── hadoop │ │ │ └── README.md │ │ ├── hive │ │ │ └── README.md │ │ ├── flink │ │ │ └── README.md │ │ └── Spark.md │ ├── 03.设计 │ │ ├── 04.DDD │ │ │ └── README.md │ │ ├── 01.架构 │ │ │ ├── 99.解决方案 │ │ │ │ ├── 亚马逊的架构.md │ │ │ │ ├── 电商.md │ │ │ │ ├── Cinchcast的架构.md │ │ │ │ └── 秒杀系统设计.md │ │ │ ├── 02.安全 │ │ │ │ └── README.md │ │ │ ├── 00.综合 │ │ │ │ ├── README.md │ │ │ │ ├── 01.系统架构面试.md │ │ │ │ ├── 09.系统测试架构.md │ │ │ │ └── 00.如何设计系统.md │ │ │ ├── 01.微服务 │ │ │ │ └── README.md │ │ │ └── README.md │ │ ├── 03.重构 │ │ │ └── README.md │ │ ├── 05.UML │ │ │ └── README.md │ │ └── 02.设计模式 │ │ │ ├── 25.面向对象原则.md │ │ │ ├── README.md │ │ │ ├── 18.解释器模式.md │ │ │ └── 00.设计模式概述.md │ ├── 15.分布式 │ │ ├── 21.分布式通信 │ │ │ ├── 01.RPC │ │ │ │ └── README.md │ │ │ ├── 02.MQ │ │ │ │ ├── 02.RocketMQ │ │ │ │ │ ├── README.md │ │ │ │ │ └── RocketMQFaq.md │ │ │ │ └── 01.Kafka │ │ │ │ │ └── README.md │ │ │ └── README.md │ │ ├── 22.分布式存储 │ │ │ ├── README.md │ │ │ └── 读写分离.md │ │ ├── 12.分布式调度 │ │ │ └── README.md │ │ ├── 11.分布式协同 │ │ │ ├── 01.分布式协同综合 │ │ │ │ └── README.md │ │ │ ├── README.md │ │ │ └── 02.ZooKeeper │ │ │ │ └── README.md │ │ └── 00.分布式综合 │ │ │ ├── README.md │ │ │ └── 拜占庭将军问题.md │ ├── 21.软件工程 │ │ └── README.md │ ├── 96.工作 │ │ ├── README.md │ │ └── 01.效能 │ │ │ └── 02.规范 │ │ │ └── 02.目录管理规范.md │ ├── 04.DevOps │ │ ├── README.md │ │ └── 99.工具 │ │ │ └── 01.Git │ │ │ └── README.md │ ├── 14.操作系统 │ │ └── 02.Linux │ │ │ └── 02.工具 │ │ │ ├── README.md │ │ │ └── 04.firewalld.md │ ├── 11.算法 │ │ ├── 数据结构和算法指南.md │ │ ├── 堆.md │ │ ├── 图.md │ │ ├── B+树.md │ │ ├── LSM树.md │ │ ├── 栈和队列.md │ │ └── 字典树.md │ ├── 00.笔记 │ │ ├── 03.设计 │ │ │ ├── 极客时间教程-从0开始学架构笔记.md │ │ │ └── 极客时间教程-左耳听风笔记.md │ │ ├── 15.分布式 │ │ │ └── 22.分布式存储 │ │ │ │ ├── the-log-structured-merge-tree.md │ │ │ │ └── hbase-a-nosql-database.md │ │ ├── 17.人工智能 │ │ │ └── 极客时间教程-机器学习40讲笔记.md │ │ └── 96.工作 │ │ │ └── 极客时间教程-职场求生攻略笔记.md │ └── 13.网络 │ │ ├── 02.网络协议 │ │ ├── 04.UDP.md │ │ └── README.md │ │ ├── 03.网络技术 │ │ └── README.md │ │ ├── 01.网络综合 │ │ ├── 11.物理层.md │ │ └── README.md │ │ └── README.md └── about │ └── index.md ├── scaffolds ├── page.md ├── draft.md └── post.md ├── prettier.config.js ├── .travis.yml ├── .editorconfig ├── .github └── workflows │ └── deploy.yml ├── package.json ├── deploy.sh ├── .gitattributes └── .gitignore /source/uploads/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dunwu/blog/HEAD/source/uploads/avatar.gif -------------------------------------------------------------------------------- /source/uploads/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dunwu/blog/HEAD/source/uploads/favicon.ico -------------------------------------------------------------------------------- /source/uploads/dunwu-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dunwu/blog/HEAD/source/uploads/dunwu-logo.png -------------------------------------------------------------------------------- /source/tags/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 文章标签 3 | date: 2019-03-06 17:29:54 4 | type: "tags" 5 | comments: true 6 | --- 7 | -------------------------------------------------------------------------------- /source/archives/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 归档 3 | date: 2019-03-06 17:31:27 4 | type: "archives" 5 | comments: false 6 | --- 7 | -------------------------------------------------------------------------------- /source/categories/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 文章分类 3 | date: 2019-03-06 17:30:35 4 | type: "categories" 5 | comments: true 6 | --- 7 | -------------------------------------------------------------------------------- /scaffolds/page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: {{ title }} 3 | date: {{ date }} 4 | categories: 5 | - 6 | tags: 7 | - 8 | --- 9 | 10 | # {{ title }} 11 | 12 | ## 参考资料 13 | -------------------------------------------------------------------------------- /scaffolds/draft.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: {{ title }} 3 | date: {{ date }} 4 | categories: 5 | - 6 | tags: 7 | - 8 | --- 9 | 10 | # {{ title }} 11 | 12 | ## 参考资料 13 | -------------------------------------------------------------------------------- /scaffolds/post.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: {{ title }} 3 | date: {{ date }} 4 | categories: 5 | - 6 | tags: 7 | - 8 | --- 9 | 10 | # XXX 11 | 12 | ## 简介 13 | 14 | ### 什么是XXX 15 | 16 | ### XXX有什么用 17 | 18 | ## XXX原理 19 | 20 | ## 参考资料 21 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @see https://prettier.io/docs/en/options.html 3 | * @see https://prettier.io/docs/en/configuration.html 4 | */ 5 | module.exports = { 6 | tabWidth: 2, 7 | semi: false, 8 | singleQuote: true, 9 | trailingComma: 'none' 10 | } 11 | -------------------------------------------------------------------------------- /source/_posts/02.编程/01.编程范式/如何阅读源码.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 如何阅读源码 3 | date: 2022-05-07 14:05:51 4 | categories: 5 | - 编程 6 | - 编程范式 7 | tags: 8 | - 编程 9 | permalink: /pages/04e2841d/ 10 | --- 11 | 12 | # XXX 13 | 14 | ## 简介 15 | 16 | ### 什么是 XXX 17 | 18 | ### XXX 有什么用 19 | 20 | ## XXX 原理 21 | 22 | ## 参考资料 -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/04.测试/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 测试 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - 工具 7 | - 测试 8 | tags: 9 | - Java 10 | - 测试 11 | permalink: /pages/cffa3952/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Java 测试 17 | 18 | ## 内容 19 | 20 | - [Junit](01.Junit.md) 21 | - [Mockito](02.Mockito.md) 22 | - [Jmeter](03.Jmeter.md) 23 | - [JMH](04.JMH.md) -------------------------------------------------------------------------------- /source/_posts/12.数据库/01.数据库综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 数据库综合 3 | date: 2022-04-11 16:52:35 4 | categories: 5 | - 数据库 6 | - 数据库综合 7 | tags: 8 | - 数据库 9 | - 综合 10 | permalink: /pages/2cf6ceb4/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 数据库综合 16 | 17 | ## 📖 内容 18 | 19 | - [Nosql 技术选型](Nosql技术选型.md) 20 | - [数据结构与数据库索引](数据结构与数据库索引.md) 21 | 22 | ## 🚪 传送 23 | 24 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # 持续集成 CI 2 | # @see https://docs.travis-ci.com/user/tutorial/ 3 | 4 | language: node_js 5 | 6 | sudo: required 7 | 8 | node_js: '16.13.0' 9 | 10 | branches: 11 | only: 12 | - master 13 | 14 | before_install: 15 | - export TZ=Asia/Shanghai 16 | 17 | script: bash ./deploy.sh 18 | 19 | notifications: 20 | email: 21 | recipients: 22 | - forbreak@163.com 23 | on_success: change 24 | on_failure: always 25 | -------------------------------------------------------------------------------- /source/_posts/16.大数据/综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 大数据综合 3 | date: 2023-02-10 14:38:43 4 | categories: 5 | - 大数据 6 | - 综合 7 | tags: 8 | - 大数据 9 | - 综合 10 | permalink: /pages/9f25156b/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 大数据综合 16 | 17 | ## 📖 内容 18 | 19 | - [大数据简介](01.大数据简介.md) 20 | - [大数据学习](02.大数据学习.md) 21 | 22 | ## 📚 资料 23 | 24 | ## 🚪 传送 25 | 26 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/04.DDD/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 领域驱动设计 3 | date: 2022-11-16 19:31:11 4 | categories: 5 | - 设计 6 | - DDD 7 | tags: 8 | - 设计 9 | - DDD 10 | permalink: /pages/53db812a/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 领域驱动设计 16 | 17 | ## 📖 内容 18 | 19 | - [领域驱动设计](01.领域驱动设计简介.md) 20 | 21 | ## 📚 资料 22 | 23 | - [DDD 实战课](https://time.geekbang.org/column/intro/100037301) 24 | 25 | ## 🚪 传送 26 | 27 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/02.编程/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 编程 3 | date: 2022-04-27 17:11:50 4 | categories: 5 | - 编程 6 | tags: 7 | - 编程 8 | permalink: /pages/47a444a4/ 9 | hidden: true 10 | index: false 11 | --- 12 | 13 | # 编程 14 | 15 | ## 📖 内容 16 | 17 | ### 编程范式 18 | 19 | - [如何学习编程语言](01.编程范式/01.如何学习编程语言.md) 20 | 21 | ### 编程语言 22 | 23 | - [python](02.编程语言/01.python.md) 24 | - [shell](02.编程语言/02.shell.md) 25 | - [scala](02.编程语言/03.scala.md) 26 | 27 | ## 🚪 传送 28 | 29 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/16.大数据/hadoop/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: devicon:hadoop 3 | title: Hadoop 教程 4 | date: 2020-09-09 17:53:08 5 | categories: 6 | - 大数据 7 | - hadoop 8 | tags: 9 | - 大数据 10 | - hadoop 11 | permalink: /pages/82f6eae9/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Hadoop 教程 17 | 18 | ## 📖 内容 19 | 20 | - [MapReduce](MapReduce.md) 21 | - [YARN](YARN.md) 22 | - [HDFS](HDFS.md) 23 | - [Hadoop 面试](Hadoop面试.md) 💯 24 | 25 | ## 🚪 传送 26 | 27 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/02.编程/01.编程范式/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 编程范式 3 | date: 2021-04-29 16:05:03 4 | categories: 5 | - 编程 6 | - 编程范式 7 | tags: 8 | - 设计 9 | - 编程范式 10 | permalink: /pages/7a94ec4e/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 编程范式 16 | 17 | ## 📖 内容 18 | 19 | - [错误处理](01.错误处理.md) 20 | 21 | ## 📚 资料 22 | 23 | - **书籍** 24 | - [《程序员修炼之道》](ttps://item.jd.com/12828404.html) 25 | - [《代码整洁之道》](https://item.jd.com/12842858.html) 26 | 27 | ## 🚪 传送 28 | 29 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/99.其他/02.Java工具包.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: javalib-util 3 | date: 2022-02-17 22:34:30 4 | order: 02 5 | categories: 6 | - Java 7 | - 工具 8 | - 其他 9 | tags: 10 | - Java 11 | - 工具包 12 | permalink: /pages/38604da2/ 13 | --- 14 | 15 | # 细说 Java 主流工具包 16 | 17 | - apache.commons 18 | - [commons-lang](https://github.com/apache/commons-lang) 19 | - [commons-collections](https://github.com/apache/commons-collections) 20 | - [common-io](https://github.com/apache/commons-io) 21 | - [guava](https://github.com/google/guava) -------------------------------------------------------------------------------- /source/about/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 关于我 3 | date: 2020-02-01 22:53:00 4 | type: 'about' 5 | comments: false 6 | --- 7 | 8 | 时间实在是流逝的太快了,一不小心,已经工作 10 年了! 9 | 10 | 技能清单: 11 | 12 | - 编程语言:Java、JavaScript、Shell、C、C++、C# 13 | - 数据库:Mysql、Redis、OracleDB、Hbase 14 | - 框架:Spring、SpringBoot、Mybatis、Dubbo、Shiro、Quartz、Ehcache、jdbc-sharding 15 | - 分布式服务:ZooKeeper、Kafka、Elasticsearch、FastDFS 16 | - 容器:Nginx、Tomcat、Jetty、Resin、Docker 17 | - 前端:React、Vue、Angular、Webpack、Nodejs、jQuery、JSP、Freemark、Velocity、EazyUI 18 | - 研发工具:Git、Svn、Maven、Gitlab、Jenkins、Nexus 19 | -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/01.Spring核心/24.SpringEL.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring EL 表达式 3 | date: 2023-01-12 20:26:46 4 | order: 24 5 | categories: 6 | - Java 7 | - 框架 8 | - Spring 9 | - Spring核心 10 | tags: 11 | - Java 12 | - 框架 13 | - Spring 14 | permalink: /pages/be2542d9/ 15 | --- 16 | 17 | # Spring EL 表达式 18 | 19 | ## 参考资料 20 | 21 | - [Spring 官方文档之 Core Technologies](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans) 22 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) -------------------------------------------------------------------------------- /source/_posts/15.分布式/21.分布式通信/01.RPC/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: RPC 3 | date: 2022-06-23 17:34:43 4 | categories: 5 | - 分布式 6 | - 分布式通信 7 | - RPC 8 | tags: 9 | - 分布式 10 | - 通信 11 | - RPC 12 | - 微服务 13 | permalink: /pages/2af2f5a6/ 14 | hidden: true 15 | index: false 16 | --- 17 | 18 | # RPC 19 | 20 | ## 📖 内容 21 | 22 | - [Dubbo 面试之服务治理](Dubbo_面试_服务治理.md) 23 | - [Dubbo 面试之架构](Dubbo_面试_架构.md) 24 | - [Dubbo 面试之应用](Dubbo_面试_应用.md) 25 | - [RPC 面试](RPC面试.md) 26 | 27 | ## 📚 资料 28 | 29 | ## 🚪 传送 30 | 31 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/99.解决方案/亚马逊的架构.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 亚马逊的架构 3 | date: 2021-11-08 08:15:33 4 | categories: 5 | - 设计 6 | - 架构 7 | - 解决方案 8 | tags: 9 | - 架构 10 | - 解决方案 11 | permalink: /pages/d3934133/ 12 | --- 13 | 14 | # 亚马逊的架构 15 | 16 | ## 摘录的要点 17 | 18 | 可扩展:添加资源,性能成正比提升 19 | 20 | 分布式、去中心化 21 | 22 | 隔离性:面向服务,聚合数以百计的服务,对外统一提供服务 23 | 24 | 同时支持 REST 和 SOAP 25 | 26 | 团队在精不在多,节省沟通成本 27 | 28 | 状态管理是大规模系统的核心问题,如分布式 Session 等 29 | 30 | 设计应尽量简单,很多问题可以用业务逻辑去解决,而不是通过技术 31 | 32 | ## 参考资料 33 | 34 | - [Amazon 的架构](http://highscalability.com/amazon-architecture) -------------------------------------------------------------------------------- /source/_posts/15.分布式/22.分布式存储/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式存储 3 | date: 2022-06-23 17:37:18 4 | categories: 5 | - 分布式 6 | - 分布式存储 7 | tags: 8 | - 分布式 9 | - 分布式存储 10 | permalink: /pages/04e10fe3/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 分布式存储 16 | 17 | ## 📖 内容 18 | 19 | - [分布式缓存](分布式缓存.md) - 关键词:`缓存雪崩`、`缓存穿透`、`缓存击穿`、`缓存更新`、`缓存预热`、`缓存降级` 20 | - [读写分离](读写分离.md) - 关键词:`读写分离` 21 | - [分库分表](分库分表.md) - 关键词:`分库分表`、`分片`、`路由`、`迁移`、`扩容`、`双写`、`聚合` 22 | - [分布式存储面试](分布式存储面试.md) 💯 23 | 24 | ## 🚪 传送 25 | 26 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/21.软件工程/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 软件工程 3 | date: 2022-07-12 13:10:23 4 | categories: 5 | - 软件工程 6 | tags: 7 | - 软件工程 8 | permalink: /pages/b74c7c77/ 9 | hidden: true 10 | index: false 11 | --- 12 | 13 | # 软件工程 14 | 15 | ## 📖 内容 16 | 17 | ## 📚 资料 18 | 19 | - [人月神话](https://book.douban.com/subject/26358448/) 20 | - [人件](https://book.douban.com/subject/25956450/) 21 | - [构建之法](https://book.douban.com/subject/25965995/) 22 | - [极客时间教程 - 软件工程之美](https://time.geekbang.org/column/intro/100023701) 23 | 24 | ## 🚪 传送 25 | 26 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/99.解决方案/电商.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 电商 3 | date: 2021-08-05 23:42:12 4 | categories: 5 | - 设计 6 | - 架构 7 | - 解决方案 8 | tags: 9 | - 架构 10 | - 解决方案 11 | permalink: /pages/5b7e99de/ 12 | --- 13 | 14 | # 电商 15 | 16 | ## 基本业务架构 17 | 18 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20210805222544.jpg) 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 | 超卖 -------------------------------------------------------------------------------- /source/_posts/16.大数据/hive/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: simple-icons:apachehive 3 | title: Hive 4 | date: 2020-09-09 17:53:08 5 | categories: 6 | - 大数据 7 | - hive 8 | tags: 9 | - 大数据 10 | - Hive 11 | permalink: /pages/1a0ffe80/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Hive 17 | 18 | ## 📖 内容 19 | 20 | - [Hive 简介](Hive简介.md) 21 | - [Hive 表](Hive表.md) 22 | - [Hive 视图和索引](Hive视图和索引.md) 23 | - [Hive 查询](Hive查询.md) 24 | - [Hive DDL](HiveDDL.md) 25 | - [Hive DML](HiveDML.md) 26 | - [Hive 运维](Hive运维.md) 27 | - [Hive 运维](Hive运维.md) 28 | 29 | ## 📚 资料 30 | 31 | ## 🚪 传送 32 | 33 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/96.工作/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 工作 3 | date: 2022-04-27 20:26:27 4 | categories: 5 | - 工作 6 | tags: 7 | - 工作 8 | permalink: /pages/3b9cb1ca/ 9 | hidden: true 10 | index: false 11 | --- 12 | 13 | # DevOps 14 | 15 | ## 📖 内容 16 | 17 | - [效率提升方法论](01.效能/01.方法论/01.效率提升方法论.md) 18 | - [话术](01.效能/01.方法论/03.话术.md) 19 | 20 | ### 规范 21 | 22 | - [技术文档规范](01.效能/02.规范/01.技术文档规范.md) 23 | - [目录管理规范](01.效能/02.规范/02.目录管理规范.md) 24 | - [代码工程规范](01.效能/02.规范/03.代码工程规范.md) 25 | 26 | ### 工具 27 | 28 | - [Markdown 极简教程](01.效能/99.工具/01.Markdown.md) 29 | 30 | ## 📚 资料 31 | 32 | ## 🚪 传送 33 | 34 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 用于在 IDE 中检查代码的基本 Code Style 2 | # @see: https://editorconfig.org/ 3 | 4 | # 配置说明: 5 | # 所有文件换行使用 Unix 风格(LF),*.bat 文件使用 Windows 风格(CRLF) 6 | # java / sh 文件缩进 4 个空格,其他所有文件缩进 2 个空格 7 | 8 | root = true 9 | 10 | [*] 11 | end_of_line = lf 12 | indent_size = 2 13 | indent_style = space 14 | max_line_length = 120 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | 19 | [*.{bat, cmd}] 20 | end_of_line = crlf 21 | 22 | [*.{java, gradle, groovy, kt, sh, xml}] 23 | indent_size = 4 24 | 25 | [*.md] 26 | max_line_length = 0 27 | trim_trailing_whitespace = false 28 | end_of_line = lf 29 | -------------------------------------------------------------------------------- /source/_posts/15.分布式/12.分布式调度/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式调度 3 | date: 2022-06-23 17:21:19 4 | categories: 5 | - 分布式 6 | - 分布式调度 7 | tags: 8 | - 分布式 9 | - 分布式调度 10 | permalink: /pages/896ffada/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 分布式调度 16 | 17 | ## 📖 内容 18 | 19 | - [服务注册和发现](服务注册和发现.md) - 关键词:`服务注册`、`服务发现`、`元数据` 20 | - [负载均衡](负载均衡.md) - 关键词:`轮询`、`随机`、`最少连接`、`源地址哈希`、`一致性哈希`、`虚拟 hash 槽` 21 | - [流量控制](流量控制.md) - 关键词:`限流`、`熔断`、`降级`、`计数器法`、`时间窗口法`、`令牌桶法`、`漏桶法` 22 | - [路由和网关](网关路由.md) - 关键词:`路由`、`条件路由`、`脚本路由`、`标签路由` 23 | - [分布式调度面试](分布式调度面试.md) 💯 24 | 25 | ## 🚪 传送 26 | 27 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/04.DevOps/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DevOps 3 | date: 2022-04-27 20:26:27 4 | categories: 5 | - DevOps 6 | tags: 7 | - DevOps 8 | permalink: /pages/3559bef4/ 9 | hidden: true 10 | index: false 11 | --- 12 | 13 | # DevOps 14 | 15 | ## 📖 内容 16 | 17 | ### CI 18 | 19 | ### CD 20 | 21 | ### 监控 22 | 23 | - [监控体系](03.监控/01.监控体系.md) 24 | - [链路监控](03.监控/02.链路追踪.md) 25 | 26 | ### 工具 27 | 28 | - Git 29 | - [如何优雅的玩转 Git](99.工具/01.Git/01.如何优雅的玩转Git.md) 30 | - [Git 帮助手册](99.工具/01.Git/02.Git帮助手册.md) 31 | - 其他 32 | - [正则表达式](99.工具/99.其他/01.正则表达式.md) 33 | 34 | ## 📚 资料 35 | 36 | ## 🚪 传送 37 | 38 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/14.操作系统/02.Linux/02.工具/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: README 3 | date: 2023-11-27 11:04:31 4 | categories: 5 | - 操作系统 6 | - Linux 7 | - 工具 8 | tags: 9 | - 操作系统 10 | - Linux 11 | - 工具 12 | permalink: /pages/785397b5/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Linux 工具 18 | 19 | ## 📖 内容 20 | 21 | - [网络运维](01.network-ops.md) 22 | - [Samba](02.samba.md) 23 | - [NTP](03.ntp.md) 24 | - [Firewalld](04.firewalld.md) 25 | - [Iptables](05.iptables.md) 26 | - [Crontab](06.crontab.md) 27 | - [Systemd](07.systemd.md) 28 | - [Vim](08.vim.md) 29 | - [oh-my-zsh](09.zsh.md) 30 | 31 | ## 🚪 传送 32 | 33 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/11.算法/数据结构和算法指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 数据结构和算法指南 3 | date: 2015-03-10 18:29:37 4 | order: 01 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 算法 10 | permalink: /pages/f42f22cf/ 11 | --- 12 | 13 | # 数据结构和算法指南 14 | 15 | ## 1. 为什么学习数据结构和算法 16 | 17 | - **为了找到一份好工作**:大厂面试喜欢考算法 18 | - **更深入了解流行技术的设计思想**:数据结构和算法是计算机基础学科,很多框架、中间、底层系统设的设计,都借鉴了其思想。因此,掌握数据结构和算法,有利于更深入了解这些技术的设计思想。 19 | - 提升个人的编程水平 20 | - 不满足于做业务狗,拓展性能思考的视角 21 | 22 | ## 2. 如何学习数据结构和算法 23 | 24 | 数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 25 | 26 | 数据结构和算法是相辅相成的。**数据结构是为算法服务的,算法要作用在特定的数据结构之上。** 27 | 28 | 先要学会复杂度分析,才能识别数据结构和算法的利弊。 29 | 30 | - 循序渐进 31 | - 边学边练,适度刷题 32 | - 学习并思考:学而不思则罔,思而不学则殆 33 | - 知识需要沉淀,不要想试图一下子掌握所有 -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/02.IDE/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java IDE 3 | date: 2022-02-18 08:53:11 4 | categories: 5 | - Java 6 | - 软件 7 | - IDE 8 | tags: 9 | - Java 10 | - IDE 11 | permalink: /pages/57a22368/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Java IDE 17 | 18 | > 自从有了 **IDE**,写代码从此就告别了刀耕火种的蛮荒时代。 19 | > 20 | > - [Eclipse](02.Eclipse.md) 是久负盛名的开源 Java IDE,我的学生时代一直使用它写 Java。 21 | > - 曾经抗拒从转 [Intellij Idea](01.Intellij.md) ,但后来发现真香,不得不说,确实是目前最优秀的 Java IDE。 22 | > - 你可以在 [vscode](03.VsCode.md) 中写各种语言,只要安装相应插件即可。如果你的项目中使用了很多种编程语言,又懒得在多个 IDE 之间切换,那么就用 vscode 来一网打尽吧。 23 | 24 | - [Intellij IDEA 快速入门](01.Intellij.md) 25 | - [Eclipse 快速入门](02.Eclipse.md) 26 | - [Vscode 快速入门](03.VsCode.md) -------------------------------------------------------------------------------- /source/_posts/12.数据库/06.列式数据库/hbase/HBase_API_高级特性_协处理器.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:hbase 3 | title: HBase Java API 高级特性之协处理器 4 | date: 2023-03-16 09:46:37 5 | categories: 6 | - 数据库 7 | - 列式数据库 8 | - hbase 9 | tags: 10 | - 数据库 11 | - 列式数据库 12 | - 大数据 13 | - hbase 14 | - API 15 | permalink: /pages/bfd041c2/ 16 | --- 17 | 18 | # HBase Java API 高级特性之协处理器 19 | 20 | ## 简述 21 | 22 | 在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协处理器也允许用户扩展实现 HBase 目前所不具备的功能,如权限校验、二级索引、完整性约束等。 23 | 24 | ## 参考资料 25 | 26 | - [《HBase 权威指南》](https://item.jd.com/11321037.html) 27 | - [《HBase 权威指南》官方源码](https://github.com/larsgeorge/hbase-book) -------------------------------------------------------------------------------- /source/_posts/15.分布式/21.分布式通信/02.MQ/02.RocketMQ/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: RocketMQ 3 | date: 2022-07-07 21:12:25 4 | categories: 5 | - 分布式 6 | - 分布式通信 7 | - MQ 8 | - RocketMQ 9 | tags: 10 | - MQ 11 | permalink: /pages/4b74671e/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # RocketMQ 17 | 18 | ## 📖 内容 19 | 20 | - [RocketMQ 快速入门](RocketMQ快速入门) 21 | - [RocketMQ 基本原理](RocketMQ基本原理) 22 | 23 | ## 📚 资料 24 | 25 | - [RocketMQ Github](https://github.com/apache/rocketmq) 26 | - [RocketMQ 官方文档](http://rocketmq.apache.org/docs/quick-start/) 27 | - [RocketMQ 技术内幕](https://book.douban.com/subject/30417623/) 28 | - [分布式开放消息系统(RocketMQ)的原理与实践](https://www.jianshu.com/p/453c6e7ff81c) 29 | 30 | ## 🚪 传送 31 | 32 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/03.监控诊断/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 监控诊断 3 | date: 2020-02-11 17:48:32 4 | categories: 5 | - Java 6 | - 软件 7 | - 监控诊断 8 | tags: 9 | - Java 10 | - 监控 11 | - 诊断 12 | permalink: /pages/bc2f8c2a/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java 监控诊断 18 | 19 | ## 内容 20 | 21 | - [监控工具对比](01.监控工具对比.md) 22 | - [CAT](02.CAT.md) 23 | - [Zipkin](03.Zipkin.md) 24 | - [SkyWalking](04.Skywalking.md) 25 | - [Arthas](05.Arthas.md) 26 | 27 | ## 资料 28 | 29 | - [CAT Github](https://github.com/dianping/cat) 30 | - [Zipkin Github](https://github.com/openzipkin/zipkin) 31 | - [SkyWalking Github](https://github.com/apache/skywalking) 32 | - [PinPoint Github](https://github.com/naver/pinpoint) 33 | - [Arthas Github](https://github.com/alibaba/arthas) -------------------------------------------------------------------------------- /source/_posts/00.笔记/03.设计/极客时间教程-从0开始学架构笔记.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《极客时间教程 - 从0开始学架构》笔记 3 | date: 2022-04-15 09:38:33 4 | categories: 5 | - 笔记 6 | - 设计 7 | tags: 8 | - 设计 9 | - 架构 10 | permalink: /pages/70cf73cd/ 11 | --- 12 | 13 | # 《极客时间教程 - 从 0 开始学架构》笔记 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 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220415104328.png) 44 | 45 | ## 参考资料 46 | 47 | - [从 0 开始学架构](https://time.geekbang.org/column/intro/100006601) -------------------------------------------------------------------------------- /source/_posts/01.Java/02.JavaEE/02.服务器/01.Tomcat/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tomcat 教程 3 | date: 2022-02-18 08:53:11 4 | categories: 5 | - Java 6 | - JavaEE 7 | - 服务器 8 | - Tomcat 9 | tags: 10 | - Java 11 | - JavaWeb 12 | - 服务器 13 | - Tomcat 14 | permalink: /pages/efbf274f/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # Tomcat 教程 20 | 21 | ## 📖 内容 22 | 23 | - [Tomcat 快速入门](01.Tomcat快速入门.md) 24 | - [Tomcat 连接器](02.Tomcat连接器.md) 25 | - [Tomcat 容器](03.Tomcat容器.md) 26 | - [Tomcat 优化](04.Tomcat优化.md) 27 | - [Tomcat 和 Jetty](05.Tomcat和Jetty.md) 28 | 29 | ## 📚 资料 30 | 31 | - [Tomcat 官网](http://tomcat.apache.org/) 32 | - [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701) 33 | 34 | ## 🚪 传送 35 | 36 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/15.分布式/11.分布式协同/01.分布式协同综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式协同综合 3 | date: 2022-06-11 10:46:35 4 | categories: 5 | - 分布式 6 | - 分布式协同 7 | - 分布式协同综合 8 | tags: 9 | - 分布式 10 | - 分布式协同 11 | permalink: /pages/a15fcfce/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # 分布式协同 17 | 18 | ## 📖 内容 19 | 20 | - [分布式复制](分布式复制.md) - 关键词:`主从`、`多主`、`无主` 21 | - [分布式分区](分布式分区.md) - 关键词:`分区再均衡`、`路由` 22 | - [分布式共识](分布式共识.md) - 关键词:`共识`、`广播`、`epoch`、`quorum` 23 | - [分布式事务](分布式事务.md) - 关键词:`2PC`、`3PC`、`TCC`、`本地消息表`、`消息事务`、`SAGA` 24 | - [分布式锁](分布式锁.md) - 关键词:`互斥`、`可重入`、`死锁`、`容错`、`自旋尝试`、`公平性` 25 | - [分布式 ID](分布式ID.md) - 关键词:`UUID`、`自增序列`、`雪花算法`、`Leaf` 26 | - [分布式会话](分布式会话.md) - 关键词:`UUID`、`自增序列`、`雪花算法`、`Leaf` 27 | - [分布式协同面试](分布式协同面试.md) 💯 28 | 29 | ## 🚪 传送 30 | 31 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/15.分布式/21.分布式通信/02.MQ/01.Kafka/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:kafka-icon 3 | title: Kafka 教程 4 | date: 2020-09-09 17:53:08 5 | categories: 6 | - 分布式 7 | - 分布式通信 8 | - MQ 9 | - Kafka 10 | tags: 11 | - mq 12 | - kafka 13 | permalink: /pages/260fb327/ 14 | hidden: true 15 | index: false 16 | --- 17 | 18 | # Kafka 教程 19 | 20 | > Kafka 是 Apache 的开源项目。**Kafka 既可以作为一个消息队列中间件,也可以作为一个分布式流处理平台**。 21 | > 22 | > **Kafka 用于构建实时数据管道和流应用。它具有水平可伸缩性,容错性,快速快速性**。 23 | 24 | ## 📖 内容 25 | 26 | - [Kafka 快速入门](Kafka快速入门.md) 27 | - [Kafka 生产](Kafka生产.md) 28 | - [Kafka 消费](Kafka消费.md) 29 | - [Kafka 集群](Kafka集群.md) 30 | - [Kafka 可靠传输](Kafka可靠传输.md) 31 | - [Kafka 存储](Kafka存储.md) 32 | - [Kafka 流式处理](Kafka流式处理.md) 33 | - [Kafka 运维](Kafka运维.md) 34 | - [Kafka 面试](Kafka面试.md) 💯 35 | 36 | ## 🚪 传送 37 | 38 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/15.分布式/00.分布式综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式综合 3 | date: 2022-06-23 17:17:18 4 | categories: 5 | - 分布式 6 | - 分布式综合 7 | tags: 8 | - 分布式 9 | permalink: /pages/50dcb66a/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # 分布式综合 15 | 16 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202405170821320.png) 17 | 18 | ## 📖 内容 19 | 20 | - [分布式简介](分布式简介.md) 21 | - [逻辑时钟](逻辑时钟.md) - 关键词:`物理时钟`、`逻辑时钟`、`向量时钟`、`全序`、`偏序` 22 | - [CAP 和 BASE](CAP&BASE.md) - 关键词:`ACID`、`CAP`、`BASE`、`一致性` 23 | - [拜占庭将军问题](拜占庭将军问题.md) - 关键词:`共识` 24 | - [分布式算法 Paxos](Paxos.md) - 关键词:`共识`、`Paxos` 25 | - [分布式算法 Raft](Raft.md) - 关键词:`共识`、`Raft` 26 | - [分布式算法 Gossip](Gossip.md) - 关键词:`Gossip` 27 | - [ZAB 协议](Zab.md) - 关键词:`共识`、`ZAB`、`ZooKeeper` 28 | - [分布式综合面试](分布式综合面试.md) 💯 29 | 30 | ## 🚪 传送 31 | 32 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/03.监控诊断/01.监控工具对比.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 监控工具对比 3 | date: 2020-02-11 17:48:32 4 | order: 01 5 | categories: 6 | - Java 7 | - 软件 8 | - 监控诊断 9 | tags: 10 | - Java 11 | - 监控 12 | permalink: /pages/60751347/ 13 | --- 14 | 15 | # 监控工具对比 16 | 17 | ## 监控工具发展史 18 | 19 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211165813.png) 20 | 21 | ## 监控工具比对 22 | 23 | ### 特性对比 24 | 25 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211171551.png) 26 | 27 | ### 生态对比 28 | 29 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211172631.png) 30 | 31 | ## 技术选型 32 | 33 | - Zipkin 欠缺 APM 报表能力,不推荐。 34 | - 企业级,推荐 CAT 35 | - 关注和试点 SkyWalking。 36 | 37 | 用好调用链监控,需要订制化、自研能力。 38 | 39 | ## 参考资料 40 | 41 | [CAT、Zipkin 和 SkyWalking 该如何选型?](https://time.geekbang.org/dailylesson/detail/100028416) -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/13.IO/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java IO 框架 3 | date: 2025-05-08 23:29:42 4 | categories: 5 | - Java 6 | - 框架 7 | - IO 8 | tags: 9 | - Java 10 | - 框架 11 | - IO 12 | permalink: /pages/703250f4/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java IO 框架 18 | 19 | ## 📖 内容 20 | 21 | - [Netty](Netty.md) 22 | 23 | ## 📚 资料 24 | 25 | - [Shiro 官方文档](http://shiro.apache.org/reference.html) 26 | - [跟我学 Shiro](http://jinnianshilongnian.iteye.com/category/305053) 27 | - [The New RBAC: Resource-Based Access Control](https://stormpath.com/blog/new-rbac-resource-based-access-control) 28 | - [Spring Security Architecture](https://spring.io/guides/topicals/spring-security-architecture) 29 | - [Securing a Web Application](https://spring.io/guides/gs/securing-web/) 30 | 31 | ## 🚪 传送 32 | 33 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/12.安全/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 安全框架 3 | date: 2025-05-08 23:29:42 4 | categories: 5 | - Java 6 | - 框架 7 | - 安全 8 | tags: 9 | - Java 10 | - 框架 11 | - 安全 12 | permalink: /pages/23f120eb/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java 安全框架 18 | 19 | ## 📖 内容 20 | 21 | - [Shiro](Shiro.md) 22 | - [Spring Security](SpringSecurity.md) 23 | 24 | ## 📚 资料 25 | 26 | - [Shiro 官方文档](http://shiro.apache.org/reference.html) 27 | - [跟我学 Shiro](http://jinnianshilongnian.iteye.com/category/305053) 28 | - [The New RBAC: Resource-Based Access Control](https://stormpath.com/blog/new-rbac-resource-based-access-control) 29 | - [Spring Security Architecture](https://spring.io/guides/topicals/spring-security-architecture) 30 | - [Securing a Web Application](https://spring.io/guides/gs/securing-web/) 31 | 32 | ## 🚪 传送 33 | 34 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/00.笔记/15.分布式/22.分布式存储/the-log-structured-merge-tree.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《The Log-Structured Merge-Tree (LSM-Tree)》笔记 3 | date: 2023-09-05 19:52:01 4 | order: 02 5 | categories: 6 | - 笔记 7 | - 分布式 8 | - 分布式存储 9 | tags: 10 | - 分布式 11 | - 分布式存储 12 | - HBASE 13 | permalink: /pages/2514f058/ 14 | --- 15 | 16 | # 《The Log-Structured Merge-Tree (LSM-Tree)》笔记 17 | 18 | LSM 被广泛应用于很多以文件结构存储数据的数据库,如:HBase, Cassandra, LevelDB, SQLite。 19 | 20 | LSM 的设计目标:通过顺序写来提高写操作吞吐量,替代传统的 B+ 树或 ISAM。 21 | 22 | ## 参考资料 23 | 24 | - 原文 25 | - [The Log-Structured-Merge-Tree](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://www.cs.umb. 26 | edu/~poneil/lsmtree.pdf) 27 | - 扩展阅读 28 | - [Log Structured Merge Trees(LSM) 原理](https://www.open-open.com/lib/view/open1424916275249.html) 29 | - [Log Structured Merge Tree](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://lrita.github.io/images/posts/database/lsmtree-170129180333.pdf) -------------------------------------------------------------------------------- /source/_posts/12.数据库/02.数据库中间件/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 数据库中间件 3 | date: 2022-04-11 16:52:35 4 | categories: 5 | - 数据库 6 | - 数据库中间件 7 | tags: 8 | - 数据库 9 | - 中间件 10 | permalink: /pages/a5124f55/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 数据库中间件 16 | 17 | ## 📖 内容 18 | 19 | - [ShardingSphere](ShardingSphere.md) 20 | - [Flyway](Flyway.md) 21 | 22 | ## 📚 资料 23 | 24 | - [**Seata**](https://github.com/seata/seata) - 分布式事务中间件。 25 | - [**ShardingSphere**](https://github.com/apache/shardingsphere) - 关系型数据库读写分离、分库分表中间件。 26 | - [**Flyway**](https://github.com/flyway/flyway) - 关系型数据库版本管理中间件。 27 | - [**Canal**](https://github.com/alibaba/canal) - 基于 MySQL 的 binlog,提供增量数据订阅和消费。 28 | - [**Twemproxy**](https://github.com/twitter/twemproxy) - Twitter 开源的一个 Redis 和 Memcache 的中间代理服务。 29 | - [**Codis**](https://github.com/CodisLabs/codis) - Redis 分布式集群方案。 30 | 31 | ## 🚪 传送 32 | 33 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | # 在master分支发生push事件时触发。 4 | on: 5 | push: 6 | branches: 7 | - master 8 | 9 | env: # 设置环境变量 10 | TZ: Asia/Shanghai # 时区(设置时区可使页面中的`最近更新时间`使用时区时间) 11 | 12 | jobs: 13 | build: # 自定义名称 14 | runs-on: ubuntu-latest # 运行在虚拟机环境ubuntu-latest 15 | 16 | strategy: 17 | matrix: 18 | node-version: [14.x] 19 | 20 | steps: 21 | # 使用的动作。格式:userName/repoName。作用:检出仓库,获取源码。 官方actions库:https://github.com/actions 22 | - name: Checkout 23 | uses: actions/checkout@master 24 | 25 | # 指定 nodejs 版本 26 | - name: Use Nodejs ${{ matrix.node-version }} 27 | uses: actions/setup-node@v1 28 | with: 29 | node-version: ${{ matrix.node-version }} 30 | 31 | # 部署 32 | - name: Deploy 33 | env: # 设置环境变量 34 | GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }} 35 | GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }} 36 | run: npm install && npm run deploy 37 | -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/02.安全/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 安全架构 3 | date: 2021-06-02 11:22:02 4 | categories: 5 | - 设计 6 | - 架构 7 | - 安全 8 | tags: 9 | - 设计 10 | - 架构 11 | - 安全 12 | permalink: /pages/18c5e27a/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # 安全架构 18 | 19 | ## 📖 内容 20 | 21 | - 综述 22 | - [认证](02.认证.md) 23 | - [授权](03.授权.md) 24 | - 审计 25 | - [安全漏洞](05.安全漏洞.md) 26 | - [编码和加密](06.编码和加密.md) 27 | - 信息过滤 28 | - 风险控制 29 | 30 | ## 📚 资料 31 | 32 | - **书籍** 33 | - [《大型网站技术架构:核心原理与案例分析》](https://item.jd.com/11322972.html) - 浅显易懂的将解大型网站架构演进之路;简介了大型系统所面临的挑战以及核心技术点。 34 | - **教程** 35 | - [system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md) 36 | - [从 0 开始学微服务](https://time.geekbang.org/column/intro/100014401) 37 | - [微服务架构核心 20 讲](https://time.geekbang.org/course/intro/100003901) 38 | - [微服务架构实战 160 讲](https://time.geekbang.org/course/intro/84) 39 | 40 | ## 🚪 传送 41 | 42 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/03.重构/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 重构 3 | date: 2021-04-29 16:05:03 4 | categories: 5 | - 设计 6 | - 重构 7 | tags: 8 | - 设计 9 | - 重构 10 | permalink: /pages/7f65f5c2/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 重构 16 | 17 | > **重构是不改变软件系统外部行为的前提下,改善它的内部结构**。 18 | > 19 | > **重构的目的是为了提高代码的质量和性能**。 20 | 21 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20210430112157.png) 22 | 23 | ## 📖 内容 24 | 25 | - [代码的坏味道和重构](01.代码的坏味道和重构.md) 26 | - [代码坏味道之代码臃肿](02.代码坏味道之代码臃肿.md) 27 | - [代码坏味道之滥用面向对象](03.代码坏味道之滥用面向对象.md) 28 | - [代码坏味道之变革的障碍](04.代码坏味道之变革的障碍.md) 29 | - [代码坏味道之非必要的](05.代码坏味道之非必要的.md) 30 | - [代码坏味道之耦合](06.代码坏味道之耦合.md) 31 | 32 | ## 📚 资料 33 | 34 | - [《代码整洁之道》](https://book.douban.com/subject/4199741/) 35 | - [《重构 - 改善既有代码的设计》](https://book.douban.com/subject/4262627/) 36 | - [《代码大全》](https://book.douban.com/subject/1477390/) 37 | - [重构教程](https://sourcemaking.com/refactoring) 38 | 39 | ## 🚪 传送 40 | 41 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/02.JavaEE/02.服务器/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 服务器 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - JavaEE 7 | - 服务器 8 | tags: 9 | - Java 10 | - JavaWeb 11 | - 服务器 12 | permalink: /pages/0ccb3c71/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java 服务器 18 | 19 | ## 📖 内容 20 | 21 | - [Tomcat 快速入门](01.Tomcat/01.Tomcat快速入门.md) 22 | - [Tomcat 连接器](01.Tomcat/02.Tomcat连接器.md) 23 | - [Tomcat 容器](01.Tomcat/03.Tomcat容器.md) 24 | - [Tomcat 优化](01.Tomcat/04.Tomcat优化.md) 25 | - [Tomcat 和 Jetty](01.Tomcat/05.Tomcat和Jetty.md) 26 | - [Jetty](02.Jetty.md) 27 | 28 | ## 📚 资料 29 | 30 | - [Tomcat 官网](http://tomcat.apache.org/) 31 | - [Jetty 官网](http://www.eclipse.org/jetty/index.html) 32 | - [Jetty Github](https://github.com/eclipse/jetty.project) 33 | - [Nginx 官网](https://www.nginx.com/) 34 | - [Nginx 的中文维基](http://tool.oschina.net/apidocs/apidoc?api=nginx-zh) 35 | - [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701) 36 | 37 | ## 🚪 传送 38 | 39 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/05.UML/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: UML 3 | date: 2020-08-10 10:59:18 4 | categories: 5 | - 设计 6 | - UML 7 | tags: 8 | - 设计 9 | - UML 10 | permalink: /pages/845dbfe4/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # UML 16 | 17 | > 统一建模语言(英语 - Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML 是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML 展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。 18 | 19 | ## 📖 内容 20 | 21 | - [UML 快速入门](01.UML快速入门.md) 22 | - [UML 结构建模图](02.UML结构建模图.md) 23 | - [UML 行为建模图](03.UML行为建模图.md) 24 | 25 | ## 📚 资料 26 | 27 | - [Wiki-UML](https://zh.wikipedia.org/wiki/统一建模语言) 28 | - [Sparx UML 教程](https://sparxsystems.cn/resources/uml2_tutorial/index.html) 29 | - [OMG UML](https://www.omg.org/spec/UML) 30 | - [UML Tutorial](https://www.tutorialspoint.com/uml/index.htm) 31 | - [W3Cschool UML 教程](https://www.w3cschool.cn/uml_tutorial/) 32 | - [UML 学习入门就这一篇文章](https://blog.csdn.net/soft_zzti/article/details/79811923) 33 | 34 | ## 🚪 传送 35 | 36 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/02.编程/03.Python/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Python 3 | date: 2024-03-28 08:20:21 4 | categories: 5 | - 编程 6 | - Python 7 | tags: 8 | - Python 9 | permalink: /pages/3c3ccf24/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # Python 教程 15 | 16 | [初识 Python](01.基础特性/00.初识Python.md) 17 | 18 | ## 📚 资料 19 | 20 | - **书籍** 21 | - [《Python Cookbook》](https://book.douban.com/subject/26381341/) 22 | - [《流畅的 Python》](https://book.douban.com/subject/27028517/) 23 | - [《Python 编程》](https://book.douban.com/subject/36365320/) 24 | - **教程、社区** 25 | - [awesome-python](https://github.com/vinta/awesome-python) - Python 资源大全 26 | - [awesome-python-cn](https://github.com/jobbole/awesome-python-cn) - Python 资源大全中文版 27 | - [Python-100-Days](https://github.com/jackfrued/Python-100-Days) - Github Python 渐进式教程 28 | - [python-guide](https://github.com/realpython/python-guide) - Python 最佳实践 29 | - [python-patterns](https://github.com/faif/python-patterns) - Python 设计模式 30 | 31 | ## 🚪 传送 32 | 33 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/15.分布式/11.分布式协同/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式协同 3 | date: 2022-06-11 10:46:35 4 | categories: 5 | - 分布式 6 | - 分布式协同 7 | tags: 8 | - 分布式 9 | - 分布式协同 10 | permalink: /pages/d8a785a7/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 分布式协同 16 | 17 | ## 📖 内容 18 | 19 | - **分布式协同综合** 20 | - [分布式复制](01.分布式协同综合/分布式复制.md) - 关键词:`主从`、`多主`、`无主` 21 | - [分布式分区](01.分布式协同综合/分布式分区.md) - 关键词:`分区再均衡`、`路由` 22 | - [分布式共识](01.分布式协同综合/分布式共识.md) - 关键词:`共识`、`广播`、`epoch`、`quorum` 23 | - [分布式事务](01.分布式协同综合/分布式事务.md) - 关键词:`2PC`、`3PC`、`TCC`、`本地消息表`、`消息事务`、`SAGA` 24 | - [分布式锁](01.分布式协同综合/分布式锁.md) - 关键词:`互斥`、`可重入`、`死锁`、`容错`、`自旋尝试`、`公平性` 25 | - [分布式协同面试](01.分布式协同综合/分布式协同面试.md) 💯 26 | - **ZooKeeper** 27 | - [ZooKeeper 原理](02.ZooKeeper/ZooKeeper原理.md) 28 | - [ZooKeeper Java Api](02.ZooKeeper/ZooKeeperJavaApi.md) 29 | - [ZooKeeper 命令](02.ZooKeeper/ZooKeeper命令.md) 30 | - [ZooKeeper 运维](02.ZooKeeper/ZooKeeper运维.md) 31 | - [ZooKeeper Acl](02.ZooKeeper/ZooKeeperAcl.md) 32 | 33 | ## 🚪 传送 34 | 35 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog", 3 | "version": "1.0.0", 4 | "private": true, 5 | "hexo": { 6 | "version": "6.3.0" 7 | }, 8 | "scripts": { 9 | "draft": "hexo new draft \"Title\"", 10 | "clean": "hexo clean", 11 | "start": "hexo clean & hexo server -l -p 4000", 12 | "build": "hexo clean & hexo generate", 13 | "deploy": "bash deploy.sh" 14 | }, 15 | "dependencies": { 16 | "hexo": "^6.1.0", 17 | "hexo-deployer-git": "^4.0.0", 18 | "hexo-generator-archive": "^2.0.0", 19 | "hexo-generator-category": "^2.0.0", 20 | "hexo-generator-index": "^3.0.0", 21 | "hexo-generator-searchdb": "^1.4.0", 22 | "hexo-generator-tag": "^2.0.0", 23 | "hexo-hide-posts": "^0.2.0", 24 | "hexo-next-darkmode": "^0.1.7", 25 | "hexo-renderer-ejs": "^2.0.0", 26 | "hexo-renderer-marked": "^6.0.0", 27 | "hexo-renderer-stylus": "^2.0.1", 28 | "hexo-server": "^3.0.0", 29 | "hexo-symbols-count-time": "^0.7.0", 30 | "hexo-theme-next": "^8.11.0" 31 | }, 32 | "devDependencies": { 33 | "hexo-cli": "^4.3.0" 34 | } 35 | } -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/10.Spring安全/01.SpringBoot之安全快速入门.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: SpringBoot 之安全快速入门 3 | date: 2021-05-13 18:21:56 4 | order: 01 5 | categories: 6 | - Java 7 | - 框架 8 | - Spring 9 | - Spring安全 10 | tags: 11 | - Java 12 | - 框架 13 | - Spring 14 | - SpringBoot 15 | - 安全 16 | permalink: /pages/274214a7/ 17 | --- 18 | 19 | # SpringBoot 之安全快速入门 20 | 21 | ## QuickStart 22 | 23 | (1)添加依赖 24 | 25 | ```xml 26 | 27 | org.springframework.boot 28 | spring-boot-starter-web 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-security 33 | 34 | ``` 35 | 36 | (2)添加配置 37 | 38 | ```properties 39 | spring.security.user.name = root 40 | spring.security.user.password = root 41 | spring.security.user.roles = USER 42 | ``` 43 | 44 | (3)启动应用后,访问任意路径,都会出现以下页面,提示你先执行登录操作。输入配置的用户名、密码(root/root)即可访问应用页面。 45 | 46 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/image-20191118150326556.png) -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/04.IO/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java IO 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - IO 8 | tags: 9 | - Java 10 | - JavaCore 11 | - IO 12 | permalink: /pages/29b38dd2/ 13 | hidden: true 14 | index: false 15 | dir: 16 | order: 4 17 | link: true 18 | --- 19 | 20 | # Java IO 21 | 22 | ## 📖 内容 23 | 24 | - [Java I/O 之 简介](Java_IO_简介.md) - 关键词:BIO、NIO、AIO 25 | - [Java I/O 之 BIO](Java_IO_BIO.md) - 关键词:BIO、InputStream、OutputStream、Reader、Writer、File、Socket、ServerSocket 26 | - [Java I/O 之 NIO](Java_IO_NIO.md) - 关键词:NIO、Channel、Buffer、Selector、多路复用 27 | - [Java I/O 之序列化](Java_IO_序列化.md) - 关键词:Serializable、serialVersionUID、transient、Externalizable 28 | 29 | ## 📚 资料 30 | 31 | - [《Java 编程思想(Thinking in java)》](https://book.douban.com/subject/2130190/) 32 | - [《Java 核心技术 卷 I 基础知识》](https://book.douban.com/subject/26880667/) 33 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 34 | 35 | ## 🚪 传送 36 | 37 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/02.JavaEE/01.JavaWeb/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: JavaWeb 3 | date: 2020-02-07 23:04:47 4 | categories: 5 | - Java 6 | - JavaEE 7 | - JavaWeb 8 | tags: 9 | - JavaWeb 10 | permalink: /pages/b6e5e1cc/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # ☕ JavaWeb 16 | 17 | ## 知识点 18 | 19 | - [JavaWeb 之 Servlet 指南](01.JavaWeb之Servlet指南.md) 20 | - [JavaWeb 之 Jsp 指南](01.JavaWeb之Servlet指南.md) 21 | - [JavaWeb 之 Filter 和 Listener](03.JavaWeb之Filter和Listener.md) 22 | - [JavaWeb 之 Cookie 和 Session](04.JavaWeb之Cookie和Session.md) 23 | - [JavaWeb 面经](99.JavaWeb面经.md) 24 | 25 | ## 学习资料 26 | 27 | - **书籍** 28 | - [Java Web 整合开发王者归来](https://book.douban.com/subject/4189495/) 29 | - [Head First Servlets & JSP](https://book.douban.com/subject/1942934/) 30 | - **教程** 31 | - [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701) 32 | - [Servlet 教程](https://www.runoob.com/servlet/servlet-tutorial.html) 33 | - [博客园孤傲苍狼 JavaWeb 学习总结](https://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/) 34 | - [JSP 教程](https://www.runoob.com/jsp/jsp-tutorial.html) -------------------------------------------------------------------------------- /source/_posts/00.笔记/03.设计/极客时间教程-左耳听风笔记.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《极客时间教程 - 左耳听风》笔记 3 | date: 2021-08-15 15:27:00 4 | categories: 5 | - 笔记 6 | - 设计 7 | tags: 8 | - 设计 9 | - 架构 10 | permalink: /pages/6d4c4b76/ 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 | - 高可用运维:监控、DevOps 45 | 46 | 分布式系统的关键技术 47 | 48 | - 服务治理 49 | - 服务、资源调度 50 | - DevOps 51 | - 监控 52 | 53 | ## 编程范式游记 54 | 55 | ## 分布式系统设计模式 56 | 57 | ## 区块链 58 | 59 | ## 程序员练级攻略 60 | 61 | ## 面试攻略 62 | 63 | ## 高效学习 64 | 65 | 浅度学习和深度学习 66 | 67 | - **高质量的信息源和第一手的知识**。 68 | - **把知识连成地图,将自己的理解反述出来**。 69 | - **不断地反思和思辨,与不同年龄段的人讨论**。 70 | - **举一反三,并践行之,把知识转换成技能**。 71 | 72 | 深度,归纳和坚持实践 73 | 74 | 1. **这个技术出现的背景、初衷和目标**。 75 | 2. **这个技术的优势和劣势分别是什么** 76 | 3. **这个技术适用的场景** 77 | 4. **技术的组成部分和关键点**。 78 | 5. **技术的底层原理和关键实现**。 79 | 6. **已有的实现和它之间的对比**。 80 | 81 | ## 高效沟通 -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/00.综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 架构综合 3 | date: 2022-11-16 20:03:01 4 | categories: 5 | - 设计 6 | - 架构 7 | - 综合 8 | tags: 9 | - 设计 10 | - 架构 11 | permalink: /pages/ae754879/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # 架构综合 17 | 18 | ## 📖 内容 19 | 20 | - [如何设计系统](00.如何设计系统.md) 21 | - [系统架构面试总结](01.系统架构面试.md) 22 | - [系统架构概述](02.系统架构概述.md) 23 | - [系统高性能架构](03.系统高性能架构.md) 24 | - [系统高可用架构](04.系统高可用架构.md) 25 | - [系统伸缩性架构](05.系统伸缩性架构.md) 26 | - [系统扩展性架构](06.系统扩展性架构.md) 27 | - [系统安全性架构](07.系统安全性架构.md) 28 | - [大型系统核心技术](08.大型系统核心技术.md) 29 | - [系统测试架构](09.系统测试架构.md) 30 | 31 | ## 📚 资料 32 | 33 | - **书籍** 34 | - [《大型网站技术架构:核心原理与案例分析》](https://item.jd.com/11322972.html) - 浅显易懂的将解大型网站架构演进之路;简介了大型系统所面临的挑战以及核心技术点。 35 | - **教程** 36 | - [system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md) 37 | - [从 0 开始学微服务](https://time.geekbang.org/column/intro/100014401) 38 | - [微服务架构核心 20 讲](https://time.geekbang.org/course/intro/100003901) 39 | - [微服务架构实战 160 讲](https://time.geekbang.org/course/intro/84) 40 | 41 | ## 🚪 传送 42 | 43 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/16.大数据/flink/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Flink 教程 3 | date: 2022-02-21 09:30:27 4 | categories: 5 | - 大数据 6 | - flink 7 | tags: 8 | - 大数据 9 | - Flink 10 | permalink: /pages/5368d043/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # Flink 教程 16 | 17 | > Apache Flink 是一个框架和分布式处理引擎,用于在**无边界**和**有边界**数据流上进行**有状态**的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 18 | 19 | ## 📖 内容 20 | 21 | ### [Flink 入门](Flink入门.md) 22 | 23 | ### [Flink 简介](Flink简介.md) 24 | 25 | ### [Flink ETL](FlinkETL.md) 26 | 27 | ### [Flink 事件驱动](Flink事件驱动.md) 28 | 29 | ### [Flink API](FlinkApi.md) 30 | 31 | ### [Flink 架构](Flink架构.md) 32 | 33 | ### [Flink 运维](Flink运维.md) 34 | 35 | ### [Flink Table API & SQL](FlinkTableApi.md) 36 | 37 | ## 📚 资料 38 | 39 | - **官方** 40 | - [Flink Github](https://github.com/apache/flink) 41 | - [Flink 官方文档](https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/) 42 | - **教程** 43 | - [flink-learning](https://github.com/zhisheng17/flink-learning) 44 | - [flink-training-course](https://github.com/flink-china/flink-training-course) - Flink 中文视频课程 45 | 46 | ## 🚪 传送 47 | 48 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/00.Spring综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring 综述 3 | date: 2020-02-26 23:48:06 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - Spring综合 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | permalink: /pages/32ef3b63/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # Spring 综述 20 | 21 | ## 📖 内容 22 | 23 | - [Spring 概述](01.Spring概述.md) 24 | - [SpringBoot 知识图谱](21.SpringBoot知识图谱.md) 25 | - [SpringBoot 基本原理](22.SpringBoot基本原理.md) 26 | - [Spring 面试](99.Spring面试.md) 27 | 28 | ## 📚 资料 29 | 30 | - **官方** 31 | - [Spring 官网](https://spring.io/) 32 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 33 | - [Spring Github](https://github.com/spring-projects/spring-framework) 34 | - **书籍** 35 | - [《Spring In Action》](https://item.jd.com/12622829.html) 36 | - **教程** 37 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 38 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 39 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 40 | 41 | ## 🚪 传送 42 | 43 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # ------------------------------------------------------------------------------ 4 | # gh-pages 部署脚本 5 | # @author Dunwu 6 | # @since 2020/2/10 7 | # ------------------------------------------------------------------------------ 8 | 9 | # 装载其它库 10 | ROOT_DIR=$( 11 | cd $(dirname $0) 12 | pwd 13 | ) 14 | 15 | # 确保脚本抛出遇到的错误 16 | set -e 17 | 18 | # 生成静态文件 19 | npm install 20 | npm run build 21 | 22 | # 进入生成的文件夹 23 | cd ${ROOT_DIR}/.temp 24 | 25 | # 如果是发布到自定义域名 26 | # echo 'www.example.com' > CNAME 27 | 28 | if [[ ${GITHUB_TOKEN} && ${GITEE_TOKEN} ]]; then 29 | msg='自动部署' 30 | GITHUB_URL=https://dunwu:${GITHUB_TOKEN}@github.com/dunwu/blog.git 31 | GITEE_URL=https://turnon:${GITEE_TOKEN}@gitee.com/turnon/blog.git 32 | git config --global user.name "dunwu" 33 | git config --global user.email "forbreak@163.com" 34 | else 35 | msg='手动部署' 36 | GITHUB_URL=git@github.com:dunwu/blog.git 37 | GITEE_URL=git@gitee.com:turnon/blog.git 38 | fi 39 | git init 40 | git add -A 41 | git commit -m "${msg}" 42 | # 推送到github gh-pages分支 43 | git push -f "${GITHUB_URL}" master:gh-pages 44 | #由于仓库容量超出gitee限制,停止push 45 | #git push -f "${GITEE_URL}" master:gh-pages 46 | 47 | rm -rf ${ROOT_DIR}/.temp 48 | -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/99.Spring其他/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring 其他 3 | date: 2020-02-26 23:48:06 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - Spring其他 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | permalink: /pages/d2e118ed/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # Spring 其他 20 | 21 | ## 📖 内容 22 | 23 | - [Spring4 升级](01.Spring4升级.md) 24 | - [SpringBoot 之 banner](21.SpringBoot之banner.md) 25 | - [SpringBoot 之 Actuator](22.SpringBoot之Actuator.md) 26 | 27 | ## 📚 资料 28 | 29 | - **官方** 30 | - [Spring 官网](https://spring.io/) 31 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 32 | - [Spring Github](https://github.com/spring-projects/spring-framework) 33 | - **书籍** 34 | - [《Spring In Action》](https://item.jd.com/12622829.html) 35 | - **教程** 36 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 37 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 38 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 39 | 40 | ## 🚪 传送 41 | 42 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | # plan text 4 | *.txt text 5 | *.java text 6 | *.scala text 7 | *.groovy text 8 | *.gradle text 9 | *.xml text 10 | *.xsd text 11 | *.tld text 12 | *.yaml text 13 | *.yml text 14 | *.wsdd text 15 | *.wsdl text 16 | *.jsp text 17 | *.jspf text 18 | *.js text 19 | *.jsx text 20 | *.json text 21 | *.css text 22 | *.less text 23 | *.sql text 24 | *.properties text 25 | *.md text 26 | 27 | # unix style 28 | *.sh text eol=lf 29 | 30 | # win style 31 | *.bat text eol=crlf 32 | 33 | # don't handle 34 | *.der -text 35 | *.jks -text 36 | *.pfx -text 37 | *.map -text 38 | *.patch -text 39 | *.dat -text 40 | *.data -text 41 | *.db -text 42 | 43 | # binary 44 | *.jar binary 45 | *.war binary 46 | *.zip binary 47 | *.tar binary 48 | *.tar.gz binary 49 | *.gz binary 50 | *.apk binary 51 | *.bin binary 52 | *.exe binary 53 | 54 | # images 55 | *.png binary 56 | *.jpg binary 57 | *.ico binary 58 | *.gif binary 59 | 60 | # medias 61 | *.mp3 binary 62 | *.swf binary 63 | 64 | # fonts 65 | *.eot binary 66 | *.svg binary 67 | *.ttf binary 68 | *.woff binary 69 | 70 | # others 71 | *.pdf binary 72 | *.doc binary 73 | *.docx binary 74 | *.ppt binary 75 | *.pptx binary 76 | *.xls binary 77 | *.xlsx binary 78 | *.xmind binary 79 | -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/02.IDE/03.VsCode.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vscode 快速入门 3 | date: 2019-05-14 14:57:33 4 | order: 03 5 | categories: 6 | - Java 7 | - 软件 8 | - IDE 9 | tags: 10 | - Java 11 | - IDE 12 | permalink: /pages/f9dd72c7/ 13 | --- 14 | 15 | # Vscode 快速入门 16 | 17 | ## 快捷键 18 | 19 | ### 命令面板(Command Palette) 20 | 21 | 根据您当前的上下文访问所有可用命令。 22 | 23 | > Mac: cmd+shift+p or f1 24 | > Windows / Linux: ctrl+shift+p or f1 25 | 26 | ### 快速打开文件(Quick Open) 27 | 28 | > Mac: cmd+p 29 | > Windows / Linux: ctrl+p 30 | 31 | ### Status Bar 32 | 33 | > Mac: shift+cmd+m 34 | > Windows / Linux: ctrl+shift+m 35 | 36 | ### 改变语言模式 37 | 38 | > Mac: cmd+k m 39 | > Windows / Linux: ctrl+k m 40 | 41 | ### 设置 42 | 43 | > Mac: cmd+, 44 | > Windows / Linux: **File** > **Preferences** > **Settings** or ctrl+, 45 | 46 | ## 插件 47 | 48 | - Chinese (Simplified) Language Pack for Visual Studio Code 49 | - Prettier - Code formatter 50 | - IntelliJ IDEA Keybindings 51 | - EditorConfig for VS Code 52 | - Git History 53 | 54 | ## 更多内容 55 | 56 | - 官方 57 | - https://github.com/Microsoft/vscode 58 | - https://github.com/Microsoft/vscode-docs 59 | - https://github.com/Microsoft/vscode-tips-and-tricks 60 | - 更多资源 61 | - https://github.com/viatsko/awesome-vscode -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/04.SpringIO/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring IO 3 | date: 2022-09-18 11:34:00 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - SpringIO 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | - IO 15 | permalink: /pages/c9519a1f/ 16 | hidden: true 17 | index: false 18 | --- 19 | 20 | # Spring IO 21 | 22 | ## 📖 内容 23 | 24 | - [SpringBoot 之异步请求](01.SpringBoot之异步请求.md) 25 | - [SpringBoot 之 Json](02.SpringBoot之Json.md) 26 | - [SpringBoot 之邮件](03.SpringBoot之邮件.md) 27 | 28 | ## 📚 资料 29 | 30 | - **官方** 31 | - [Spring 官网](https://spring.io/) 32 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 33 | - [Spring Github](https://github.com/spring-projects/spring-framework) 34 | - **书籍** 35 | - [《Spring In Action》](https://item.jd.com/12622829.html) 36 | - **教程** 37 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 38 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 39 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 40 | 41 | ## 🚪 传送 42 | 43 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/02.设计模式/25.面向对象原则.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 面向对象原则 3 | date: 2021-05-19 09:49:05 4 | order: 25 5 | categories: 6 | - 设计 7 | - 设计模式 8 | tags: 9 | - 设计 10 | - 设计模式 11 | permalink: /pages/3610064d/ 12 | --- 13 | 14 | # 面向对象设计六大原则 15 | 16 | ## 单一职责原则 17 | 18 | 单一职责原则(Single Responsibility Principle),应该有且仅有一个原因引起类的变更。 19 | 20 | 简单点说,**一个类,最好只负责一件事。** 21 | 22 | ## 开放-封闭原则 23 | 24 | 开放-封闭原则(Open Close Principle),软件实体(类、模块、函数)等应该可以扩展,但是不可修改。 25 | 26 | 对于扩展是开放的;对于更改是封闭的。 27 | 28 | ## 里氏替换原则 29 | 30 | 里氏替换原则(Liskov Substitution Principle),子类可以替换父类。 31 | 32 | ## 依赖倒置原则 33 | 34 | 依赖倒置原则(Dependency Inversion Principle),抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。 35 | 36 | 关键点: 37 | 38 | - 高层模块不应该依赖低层模块,两者都应该依赖其抽象 39 | - 抽象不应该依赖细节 40 | - 细节应该依赖抽象 41 | 42 | ## 接口隔离原则 43 | 44 | 接口隔离原则(Interface Segregation Principle)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 45 | 46 | - 客户端不应依赖它不需要的接口 47 | - 类间的依赖关系应该建立在最小的接口上 48 | 49 | ## 迪米特原则 50 | 51 | 迪米特原则(Least Knowledge Principle)又称最少知识原则,一个软件实体应当尽可能少地与其他实体发生相互作用。 52 | 53 | 一个类应该对自己需要调用的类知道得最少,类的内部如何实现、如何复杂都与调用者或者依赖者没关系,调用者或者依赖者只需要知道他需要的方法即可,其他的我一概不关心。 54 | 55 | ## 参考资料 56 | 57 | - [《Head First 设计模式》](https://book.douban.com/subject/2243615/) 58 | - [《大话设计模式》](https://book.douban.com/subject/2334288/) -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/05.Spring集成/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring 集成 3 | date: 2020-02-26 23:47:47 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - Spring集成 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | - 集成 15 | permalink: /pages/a43c2fcd/ 16 | hidden: true 17 | index: false 18 | --- 19 | 20 | # Spring 集成 21 | 22 | > 章节主要针对:Spring 与第三方框架、库集成。如:Cache、Scheduling、JMS、JMX 等。 23 | 24 | ## 📖 内容 25 | 26 | - [Spring 集成缓存中间件](01.Spring集成缓存.md) 27 | - [Spring 集成定时任务中间件](02.Spring集成调度器.md) 28 | - [Spring 集成 Dubbo](03.Spring集成Dubbo.md) 29 | 30 | ## 📚 资料 31 | 32 | - **官方** 33 | - [Spring 官网](https://spring.io/) 34 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 35 | - [Spring Github](https://github.com/spring-projects/spring-framework) 36 | - **书籍** 37 | - [《Spring In Action》](https://item.jd.com/12622829.html) 38 | - **教程** 39 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 40 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 41 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 42 | 43 | ## 🚪 传送 44 | 45 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------------------- 2 | # more gitignore templates see https://github.com/github/gitignore 3 | # --------------------------------------------------------------------- 4 | 5 | # ------------------------------- java ------------------------------- 6 | # compiled folders 7 | classes 8 | target 9 | logs 10 | .mtj.tmp/ 11 | 12 | # compiled files 13 | *.class 14 | 15 | # bluej files 16 | *.ctxt 17 | 18 | # package files # 19 | *.jar 20 | *.war 21 | *.nar 22 | *.ear 23 | *.zip 24 | *.tar.gz 25 | *.rar 26 | 27 | # virtual machine crash logs 28 | hs_err_pid* 29 | 30 | # maven plugin temp files 31 | .flattened-pom.xml 32 | 33 | 34 | # ------------------------------- javascript ------------------------------- 35 | # dependencies 36 | node_modules 37 | 38 | # temp folders 39 | build 40 | dist 41 | _book 42 | _jsdoc 43 | .temp 44 | .deploy*/ 45 | 46 | # temp files 47 | *.log 48 | npm-debug.log* 49 | yarn-debug.log* 50 | yarn-error.log* 51 | bundle*.js 52 | .DS_Store 53 | Thumbs.db 54 | db.json 55 | book.pdf 56 | package-lock.json 57 | 58 | 59 | # ------------------------------- intellij ------------------------------- 60 | .idea 61 | *.iml 62 | 63 | 64 | # ------------------------------- eclipse ------------------------------- 65 | .classpath 66 | .project 67 | -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/99.面试/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 面试 3 | date: 2020-06-04 13:51:00 4 | categories: 5 | - Java 6 | - JavaCore 7 | - 面试 8 | tags: 9 | - Java 10 | - JavaCore 11 | - 面试 12 | permalink: /pages/1b5f74fb/ 13 | hidden: true 14 | index: false 15 | dir: 16 | order: 99 17 | link: true 18 | --- 19 | 20 | # Java 面试 21 | 22 | ## 📖 内容 23 | 24 | - [Java 基础面试一](Java_面试_基础(一).md) 25 | - [Java 基础面试二](Java_面试_基础(二).md) 26 | - [Java 基础面试三](Java_面试_基础(三).md) 27 | - [Java 容器面试一](Java_面试_容器(一).md) 28 | - [Java 容器面试二](Java_面试_容器(二).md) 29 | - [Java 容器面试三](Java_面试_容器(三).md) 30 | - [Java 并发面试一](Java_面试_并发(一).md) 31 | - [Java 并发面试二](Java_面试_并发(二).md) 32 | - [Java 并发面试三](Java_面试_并发(三).md) 33 | - [Java 虚拟机面试一](Java_面试_虚拟机(一).md) 34 | - [Java 虚拟机面试二](Java_面试_虚拟机(二).md) 35 | 36 | ## 📚 资料 37 | 38 | - [《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/) 39 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 40 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) 41 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.ygeekbang.org/column/intro/100047701) 42 | - [极客时间教程 - 深入拆解 Java 虚拟机](https://time.geekbang.org/column/intro/100010301) 43 | - [从表到里学习 JVM 实现](https://www.douban.com/doulist/2545443/) 44 | 45 | ## 🚪 传送 46 | 47 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/02.JavaEE/02.服务器/01.Tomcat/05.Tomcat和Jetty.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tomcat 和 Jetty 3 | date: 2022-02-17 22:34:30 4 | order: 05 5 | categories: 6 | - Java 7 | - JavaEE 8 | - 服务器 9 | - Tomcat 10 | tags: 11 | - Java 12 | - JavaWeb 13 | - 服务器 14 | - Tomcat 15 | - Jetty 16 | permalink: /pages/9e448b84/ 17 | --- 18 | 19 | ## Tomcat 和 Jetty 20 | 21 | Web 容器 Tomcat 或 Jetty,作为重要的系统中间件,连接着浏览器和你的 Web 应用,并且支撑着 Web 程序的运行,可以说,**弄懂了 Tomcat 和 Jetty 的原理,Java Web 开发对你来说就毫无秘密可言**。 22 | 23 | ## Web 容器 24 | 25 | 早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。 26 | 27 | 随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序。 28 | 29 | 于是 Sun 公司推出了 Servlet 技术。你可以把 Servlet 简单理解为运行在服务端的 Java 小程序,但是 Servlet 没有 main 方法,不能独立运行,因此必须把它部署到 Servlet 容器中,由容器来实例化并调用 Servlet。 30 | 31 | 而 Tomcat 和 Jetty 就是一个 Servlet 容器。为了方便使用,它们也具有 HTTP 服务器的功能,因此**Tomcat 或者 Jetty 就是一个“HTTP 服务器 + Servlet 容器”,我们也叫它们 Web 容器。** 32 | 33 | 其他应用服务器比如 JBoss 和 WebLogic,它们不仅仅有 Servlet 容器的功能,也包含 EJB 容器,是完整的 Java EE 应用服务器。从这个角度看,Tomcat 和 Jetty 算是一个轻量级的应用服务器。 34 | 35 | 在微服务架构日渐流行的今天,开发人员更喜欢稳定的、轻量级的应用服务器,并且应用程序用内嵌的方式来运行 Servlet 容器也逐渐流行起来。之所以选择轻量级,是因为在微服务架构下,我们把一个大而全的单体应用,拆分成一个个功能单一的微服务,在这个过程中,服务的数量必然要增加,但为了减少资源的消耗,并且降低部署的成本,我们希望运行服务的 Web 容器也是轻量级的,Web 容器本身应该消耗较少的内存和 CPU 资源,并且由应用本身来启动一个嵌入式的 Web 容器,而不是通过 Web 容器来部署和启动应用,这样可以降低应用部署的复杂度。 -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/01.构建/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 构建 3 | date: 2020-08-04 15:20:54 4 | categories: 5 | - Java 6 | - 软件 7 | - 构建 8 | tags: 9 | - Java 10 | - 构建 11 | permalink: /pages/afbb2faf/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Java 构建 17 | 18 | > Java 项目需要通过 **构建工具** 来管理项目依赖,完成编译、打包、发布、生成 JavaDoc 等任务。 19 | > 20 | > - 目前最主流的构建工具是 Maven,它的功能非常强大。 21 | > - Gradle 号称是要替代 Maven 等构件工具,它的版本管理确实简洁,但是需要学习 Groovy,学习成本比 Maven 高。 22 | > - Ant 功能比 Maven 和 Gradle 要弱,现代 Java 项目基本不用了,但也有一些传统的 Java 项目还在使用。 23 | 24 | ## 📖 内容 25 | 26 | ### Maven 27 | 28 | - [Maven 快速入门](01.Maven/01.Maven快速入门.md) 29 | - [Maven 教程之 pom.xml 详解](01.Maven/02.Maven教程之pom.xml详解.md) 30 | - [Maven 教程之 settings.xml 详解](01.Maven/03.Maven教程之settings.xml详解.md) 31 | - [Maven 实战问题和最佳实践](01.Maven/04.Maven实战问题和最佳实践.md) 32 | - [Maven 教程之发布 jar 到私服或中央仓库](01.Maven/05.Maven教程之发布jar到私服或中央仓库.md) 33 | - [Maven 插件之代码检查](01.Maven/06.Maven插件之代码检查.md) 34 | 35 | ### Ant 36 | 37 | - [Ant 简易教程](02.Ant.md) 38 | 39 | ## 📚 资料 40 | 41 | - **官网** 42 | - [Maven Github](https://github.com/apache/maven) 43 | - [Maven 官方文档](https://maven.apache.org/ref/current) 44 | - [Ant 官方手册](http://ant.apache.org/manual/index.html) 45 | - **书籍** 46 | - [《Maven 实战》](https://book.douban.com/subject/5345682/) 47 | 48 | ## 🚪 传送 49 | 50 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/11.算法/堆.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 堆 3 | date: 2015-03-09 16:01:27 4 | order: 02 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 树 10 | - 二叉树 11 | - 堆 12 | permalink: /pages/9b7d8810/ 13 | --- 14 | 15 | # 堆 16 | 17 | ## 什么是堆? 18 | 19 | 堆(Heap)是一个可以被看成近似完全二叉树的数组。 20 | 21 | - **堆是一个完全二叉树**。完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。 22 | - **堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值**。 23 | 24 | 堆可以分为大顶堆和小顶堆。 25 | 26 | - 对于每个节点的值都大于等于子树中每个节点值的堆,叫作“**大顶堆**”。 27 | 28 | - 对于每个节点的值都小于等于子树中每个节点值的堆,叫作“**小顶堆**”。 29 | 30 | ## 如何实现堆 31 | 32 | 完全二叉树比较适合用数组来存储。用数组来存储完全二叉树是非常节省存储空间的。因为我们不需要存储左右子节点的指针,单纯地通过数组的下标,就可以找到一个节点的左右子节点和父节点。 33 | 34 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220311112542.jpg) 35 | 36 | 堆常见的操作: 37 | 38 | - HEAPIFY 建堆:把一个乱序的数组变成堆结构的数组,时间复杂度为 $$O(n)$$。 39 | - HEAPPUSH:把一个数值放进已经是堆结构的数组中,并保持堆结构,时间复杂度为 $$O(log N)$$ 40 | - HEAPPOP:从最大堆中取出最大值或从最小堆中取出最小值,并将剩余的数组保持堆结构,时间复杂度为 $$O(log N)$$。 41 | - HEAPSORT:借由 HEAPFY 建堆和 HEAPPOP 堆数组进行排序,时间复杂度为$$ O(N log N)$$,空间复杂度为 $$O(1)$$。 42 | 43 | ## 堆的应用场景 44 | 45 | ### 求 TOP N 46 | 47 | 堆结构的一个常见应用是建立优先队列(Priority Queue)。 48 | 49 | 求 Top K 的问题抽象成两类。一类是针对静态数据集合;另一类是针对动态数据集合 50 | 51 | ### 优先级队列 52 | 53 | 在优先级队列中,数据的出队顺序不是先进先出,而是按照优先级来,优先级最高的,最先出队。 54 | 55 | 堆和优先级队列非常相似:往优先级队列中插入一个元素,就相当于往堆中插入一个元素;从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。 56 | 57 | > 参考:Java 的 `PriorityQueue` 类 58 | 59 | ### 求中位数 -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/01.IO/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 序列化工具 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - 工具 7 | - IO 8 | tags: 9 | - Java 10 | - IO 11 | - 序列化 12 | permalink: /pages/b4b6ddc9/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java 序列化工具 18 | 19 | Java 官方的序列化存在许多问题,因此,很多人更愿意使用优秀的第三方序列化工具来替代 Java 自身的序列化机制。 如果想详细了解 Java 自身序列化方式,可以参考:[Java 序列化](https://dunwu.github.io/waterdrop/pages/737e5233/) 20 | 21 | 序列化库技术选型: 22 | 23 | - [thrift](https://github.com/apache/thrift)、[protobuf](https://github.com/protocolbuffers/protobuf) - 适用于对性能敏感,对开发体验要求不高的内部系统。 24 | - [hessian](http://hessian.caucho.com/doc/hessian-overview.xtp) - 适用于对开发体验敏感,性能有要求的内外部系统。 25 | - [jackson](https://github.com/FasterXML/jackson)、[gson](https://github.com/google/gson)、[fastjson](https://github.com/alibaba/fastjson) - 适用于对序列化后的数据要求有良好的可读性(转为 json 、xml 形式)。 26 | 27 | ## 内容 28 | 29 | - [JSON](01.JSON序列化.md) - Fastjson、Jackson、Gson 30 | - [二进制](02.二进制序列化.md) - Protobuf、Thrift、Hessian、Kryo、FST 31 | 32 | ## 资料 33 | 34 | - [Thrift Github](https://github.com/apache/thrift) 35 | - [Protobuf Github](https://github.com/protocolbuffers/protobuf) 36 | - [Hessian 官网](http://hessian.caucho.com/doc/hessian-overview.xtp) 37 | - [Fastjson Github](https://github.com/alibaba/fastjson) 38 | - [Jackson Github](https://github.com/FasterXML/jackson) 39 | - [Gson Github](https://github.com/google/gson) -------------------------------------------------------------------------------- /source/_posts/12.数据库/06.列式数据库/Cassandra.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Cassandra 3 | date: 2019-08-22 09:02:39 4 | order: 02 5 | categories: 6 | - 数据库 7 | - 列式数据库 8 | tags: 9 | - 数据库 10 | - 列式数据库 11 | - cassandra 12 | permalink: /pages/e6171578/ 13 | --- 14 | 15 | # Cassandra 16 | 17 | > Apache Cassandra 是一个高度可扩展的分区行存储。行被组织成具有所需主键的表。 18 | > 19 | > 最新版本:v4.0 20 | 21 | ## Quick Start 22 | 23 | ### 安装 24 | 25 | > 先决条件 26 | > 27 | > - JDK8+ 28 | > - Python 2.7 29 | 30 | ## 简介 31 | 32 | Apache Cassandra 是一套开源分布式 Key-Value 存储系统。它最初由 Facebook 开发,用于储存特别大的数据。 33 | 34 | ### 特性 35 | 36 | #### 主要特性 37 | 38 | - 分布式 39 | - 基于 column 的结构化 40 | - 高伸展性 41 | 42 | Cassandra 的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对 Cassandra 的一个写操作,会被复制到其他节点上去,对 Cassandra 的读操作,也会被路由到某个节点上面去读取。对于一个 Cassandra 群集来说,扩展性能 是比较简单的事情,只管在群集里面添加节点就可以了。 43 | 44 | #### 突出特性 45 | 46 | - **模式灵活** - 使用 Cassandra,像文档存储,不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。 47 | - **真正的可扩展性** - Cassandra 是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 48 | - **多数据中心识别** - 你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。 49 | - **范围查询** - 如果你不喜欢全部的键值查询,则可以设置键的范围来查询。 50 | - **列表数据结构** - 在混合模式可以将超级列添加到 5 维。对于每个用户的索引,这是非常方便的。 51 | - **分布式写操作** - 有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。 52 | 53 | ## 更多内容 54 | 55 | - [Cassandra 官网](http://cassandra.apache.org) 56 | - [Cassandra Github](https://github.com/apache/cassandra) 57 | 58 | ## 🚪 传送 59 | 60 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/01.构建/01.Maven/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Maven 教程 3 | date: 2020-08-04 15:20:54 4 | categories: 5 | - Java 6 | - 软件 7 | - 构建 8 | - Maven 9 | tags: 10 | - Java 11 | - 构建 12 | - Maven 13 | permalink: /pages/adb721ae/ 14 | hidden: true 15 | index: false 16 | --- 17 | 18 | # Maven 教程 19 | 20 | > [Maven](https://github.com/apache/maven) 是一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西。 21 | > 22 | > - **版本** - maven 有自己的版本定义和规则。 23 | > - **构建** - maven 支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。 24 | > - **输出物管理** - maven 可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为。 25 | > - **依赖关系** - maven 对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为 26 | > - **文档和构建结果** - maven 的 site 命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。 27 | > - **项目关系** - 一个大型的项目通常有几个小项目或者模块组成,用 maven 可以很方便地管理。 28 | > - **移植性管理** - maven 可以针对不同的开发场景,输出不同种类的输出结果。 29 | 30 | ## 📖 内容 31 | 32 | - [Maven 快速入门](01.Maven快速入门.md) 33 | - [Maven 教程之 pom.xml 详解](02.Maven教程之pom.xml详解.md) 34 | - [Maven 教程之 settings.xml 详解](03.Maven教程之settings.xml详解.md) 35 | - [Maven 实战问题和最佳实践](04.Maven实战问题和最佳实践.md) 36 | - [Maven 教程之发布 jar 到私服或中央仓库](05.Maven教程之发布jar到私服或中央仓库.md) 37 | - [Maven 插件之代码检查](06.Maven插件之代码检查.md) 38 | 39 | ## 📚 资料 40 | 41 | - **官网** 42 | - [Maven Github](https://github.com/apache/maven) 43 | - [Maven 官方文档](https://maven.apache.org/ref/current) 44 | - **书籍** 45 | - [《Maven 实战》](https://book.douban.com/subject/5345682/) 46 | 47 | ## 🚪 传送 48 | 49 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/03.SpringWeb/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring Web 3 | date: 2020-02-26 23:48:06 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - SpringWeb 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | - Web 15 | permalink: /pages/f9b6aef8/ 16 | hidden: true 17 | index: false 18 | --- 19 | 20 | # Spring Web 21 | 22 | > 章节主要针对:Spring 在 web 领域的应用。如:Spring MVC、WebSocket 等。 23 | 24 | ## 📖 内容 25 | 26 | - [SpringWeb 综述](01.SpringWeb综述.md) 27 | - [SpringWeb 应用](02.SpringWeb应用.md) 28 | - [DispatcherServlet](03.DispatcherServlet.md) 29 | - [Spring 过滤器](04.Spring过滤器.md) 30 | - [Spring 跨域](05.Spring跨域.md) 31 | - [Spring 视图](06.Spring视图.md) 32 | - [SpringBoot 之应用 EasyUI](21.SpringBoot之应用EasyUI.md) 33 | 34 | ## 📚 资料 35 | 36 | - **官方** 37 | - [Spring 官网](https://spring.io/) 38 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 39 | - [Spring Github](https://github.com/spring-projects/spring-framework) 40 | - **书籍** 41 | - [《Spring In Action》](https://item.jd.com/12622829.html) 42 | - **教程** 43 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 44 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 45 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 46 | 47 | ## 🚪 传送 48 | 49 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/14.中间件/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 中间件 3 | date: 2022-04-09 15:11:37 4 | categories: 5 | - Java 6 | - 中间件 7 | tags: 8 | - 编程 9 | - Java 10 | - 中间件 11 | permalink: /pages/f5854602/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Java 中间件 17 | 18 | ## 📖 内容 19 | 20 | #### 缓存 21 | 22 | > 缓存可以说是优化系统性能的第一手段,在各种技术中都会有缓存的应用。 23 | > 24 | > 如果想深入学习缓存,建议先了解一下 [缓存基本原理](https://dunwu.github.io/design/distributed/分布式缓存.html),有助于理解缓存的特性、原理,使用缓存常见的问题及解决方案。 25 | 26 | - [Java 缓存框架](02.缓存/02.Java缓存中间件.md) 27 | - [Ehcache 快速入门](02.缓存/04.Ehcache.md) 28 | - [Java 进程内缓存](02.缓存/05.Java进程内缓存.md) 29 | - [Http 缓存](02.缓存/06.Http缓存.md) 30 | 31 | #### 流量控制 32 | 33 | - [Hystrix](03.流量控制/01.Hystrix.md) 34 | 35 | ## 📚 资料 36 | 37 | - **Mybatis** 38 | - [Mybatis Github](https://github.com/mybatis/mybatis-3) 39 | - [Mybatis 官网](http://www.mybatis.org/mybatis-3/) 40 | - [MyBatis 官方代码生成(mybatis-generator)](https://github.com/mybatis/generator) 41 | - [MyBatis 官方集成 Spring(mybatis-spring)](https://github.com/mybatis/spring) 42 | - [Mybatis 官方集成 Spring Boot(mybatis-spring-boot)](https://github.com/mybatis/spring-boot-starter) 43 | - [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) - CRUD 扩展插件、代码生成器、分页器等多功能 44 | - [Mapper](https://github.com/abel533/Mapper) - CRUD 扩展插件 45 | - [Mybatis-PageHelper](https://github.com/pagehelper/Mybatis-PageHelper) - Mybatis 通用分页插件 46 | 47 | ## 🚪 传送 48 | 49 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/13.网络/02.网络协议/04.UDP.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 用户数据报协议 UDP 3 | date: 2019-05-31 11:51:00 4 | order: 04 5 | categories: 6 | - 网络 7 | - 网络协议 8 | tags: 9 | - 网络 10 | - 网络协议 11 | - UDP 12 | permalink: /pages/f372c2b8/ 13 | --- 14 | 15 | # 用户数据报协议 UDP 16 | 17 | ## 简介 18 | 19 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/1559263939493.png) 20 | 21 | UDP 是无连接的。数据报(类似于数据包)只在数据报级别有保证。数据报可能会无序的到达目的地,也有可能会遗失。UDP 不支持拥塞控制。虽然不如 TCP 那样有保证,但 UDP 通常效率更高。 22 | 23 | UDP 可以通过广播将数据报发送至子网内的所有设备。这对 [DHCP](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) 很有用,因为子网内的设备还没有分配 IP 地址,而 IP 对于 TCP 是必须的。 24 | 25 | UDP 可靠性更低但适合用在网络电话、视频聊天,流媒体和实时多人游戏上。 26 | 27 | 以下情况使用 UDP 代替 TCP: 28 | 29 | - 你需要低延迟 30 | - 相对于数据丢失更糟的是数据延迟 31 | - 你想实现自己的错误校正方法 32 | 33 | ### UDP 特点 34 | 35 | 1. **无连接的**,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。 36 | 2. **不保证可靠交付**,因此主机不需要为此复杂的连接状态表 37 | 3. **面向报文的**,意思是 UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后向下交给 IP 层。 38 | 4. **没有阻塞控制**,因此网络出现的拥塞不会使发送方的发送速率降低。 39 | 5. **支持一对一、一对多、多对一和多对多的交互通信**,也即是提供广播和多播的功能。 40 | 6. **首部开销小**,首部只有 8 个字节,分为四部分。 41 | 42 | ### UDP 应用场景 43 | 44 | 1. 名字转换(DNS) 45 | 2. 文件传送(TFTP) 46 | 3. 路由选择协议(RIP) 47 | 4. IP 地址配置(BOOTP,DHTP) 48 | 5. 网络管理(SNMP) 49 | 6. 远程文件服务(NFS) 50 | 7. IP 电话 51 | 8. 流式多媒体通信 52 | 53 | ## UDP 报文 54 | 55 | UDP 数据报分为数据字段和首部字段。 56 | 首部字段只有 8 个字节,由四个字段组成,每个字段的长度是 2 个字节。 57 | 58 | **首部各字段意义**: 59 | 60 | 1. **源端口**:源端口号,在需要对方回信时选用,不需要时可全 0. 61 | 2. **目的端口**:目的端口号,在终点交付报文时必须要使用到。 62 | 3. **长度**:UDP 用户数据报的长度,在只有首部的情况,其最小值是 8 。 63 | 4. **检验和**:检测 UDP 用户数据报在传输中是否有错,有错就丢弃。 -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 工具 3 | date: 2022-02-18 08:53:11 4 | categories: 5 | - Java 6 | - 工具 7 | tags: 8 | - Java 9 | - 工具 10 | permalink: /pages/c85e7820/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # Java 工具 16 | 17 | ## 📖 内容 18 | 19 | ### Java IO 20 | 21 | - [JSON 序列化](01.IO/01.JSON序列化.md) - [fastjson](https://github.com/alibaba/fastjson)、[Jackson](https://github.com/FasterXML/jackson)、[Gson](https://github.com/google/gson) 22 | - [二进制序列化](01.IO/02.二进制序列化.md) - [Protobuf](https://developers.google.com/protocol-buffers)、[Thrift](https://thrift.apache.org/)、[Hessian](http://hessian.caucho.com/)、[Kryo](https://github.com/EsotericSoftware/kryo)、[FST](https://github.com/RuedigerMoeller/fast-serialization) 23 | 24 | ### JavaBean 工具 25 | 26 | - [Lombok](02.JavaBean/01.Lombok.md) 27 | - [Dozer](02.JavaBean/02.Dozer.md) 28 | 29 | ### Java 模板引擎 30 | 31 | - [Freemark](03.模板引擎/01.Freemark.md) 32 | - [Velocity](03.模板引擎/02.Thymeleaf.md) 33 | - [Thymeleaf](03.模板引擎/03.Velocity.md) 34 | 35 | ### Java 测试工具 36 | 37 | - [Junit](04.测试/01.Junit.md) 38 | - [Mockito](04.测试/02.Mockito.md) 39 | - [Jmeter](04.测试/03.Jmeter.md) 40 | - [JMH](04.测试/04.JMH.md) 41 | 42 | ### 其他 43 | 44 | - [Java 日志](99.其他/01.Java日志.md) 45 | - [Java 工具包](99.其他/02.Java工具包.md) 46 | - [Reflections](99.其他/03.Reflections.md) 47 | - [JavaMail](99.其他/04.JavaMail.md) 48 | - [Jsoup](99.其他/05.Jsoup.md) 49 | - [Thumbnailator](99.其他/06.Thumbnailator.md) 50 | - [Zxing](99.其他/07.Zxing.md) 51 | 52 | ## 📚 资料 53 | 54 | ## 🚪 传送 55 | 56 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/14.中间件/02.缓存/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 缓存 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - 中间件 7 | - 缓存 8 | tags: 9 | - Java 10 | - 中间件 11 | - 缓存 12 | permalink: /pages/1420c34e/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java 缓存 18 | 19 | > 缓存可以说是优化系统性能的第一手段,在各种技术中都会有缓存的应用。 20 | > 21 | > 如果想深入学习缓存,建议先了解一下 [缓存基本原理](https://dunwu.github.io/design/distributed/分布式缓存.html),有助于理解缓存的特性、原理,使用缓存常见的问题及解决方案。 22 | 23 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200710163555.png) 24 | 25 | ## 📖 内容 26 | 27 | - [Java 缓存框架](02.Java缓存中间件.md) 28 | - [Ehcache 快速入门](04.Ehcache.md) 29 | - [Java 缓存库](05.Java进程内缓存.md) 30 | - [Http 缓存](06.Http缓存.md) 31 | 32 | ## 📚 资料 33 | 34 | - [JSR107](https://www.jcp.org/en/jsr/detail?id=107) 35 | - [Spring Cache 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/integration.html#cache) 36 | - [Spring Boot Cache 特性官方文档](https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-caching) 37 | - [J2Cache Gitee](https://gitee.com/ld/J2Cache) 38 | - [JetCache Github](https://github.com/alibaba/jetcache) 39 | - [JetCache wiki](https://github.com/alibaba/jetcache/wiki/Home_CN) 40 | - [Memcached 官网](https://memcached.org/) 41 | - [Memcached Github](https://github.com/memcached/memcached/) 42 | - [Redis 官网](https://redis.io/) 43 | - [Redis github](https://github.com/antirez/redis) 44 | - [Redis 官方文档中文版](http://redis.cn/) 45 | 46 | ## 🚪 传送 47 | 48 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/15.分布式/21.分布式通信/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 分布式通信 3 | date: 2022-06-23 17:33:52 4 | categories: 5 | - 分布式 6 | - 分布式通信 7 | tags: 8 | - 分布式 9 | - 分布式通信 10 | permalink: /pages/dec12b24/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 分布式通信 16 | 17 | ## 📖 内容 18 | 19 | ### RPC 20 | 21 | - [Dubbo 面试之服务治理](01.RPC/Dubbo_面试_服务治理.md) 22 | - [Dubbo 面试之架构](01.RPC/Dubbo_面试_架构.md) 23 | - [Dubbo 面试之应用](01.RPC/Dubbo_面试_应用.md) 24 | - [RPC 面试](01.RPC/RPC面试.md) 25 | 26 | ### [MQ](02.MQ) 27 | 28 | #### [MQ 综合](02.MQ/00.MQ综合) 29 | 30 | - [MQ 面试](02.MQ/00.MQ综合/MQ面试.md) 31 | 32 | #### [Kafka](02.MQ/01.Kafka) 33 | 34 | - [Kafka 快速入门](02.MQ/01.Kafka/Kafka快速入门.md) 35 | - [Kafka 生产](02.MQ/01.Kafka/Kafka生产.md) 36 | - [Kafka 消费](02.MQ/01.Kafka/Kafka消费.md) 37 | - [Kafka 集群](02.MQ/01.Kafka/Kafka集群.md) 38 | - [Kafka 可靠传输](02.MQ/01.Kafka/Kafka可靠传输.md) 39 | - [Kafka 存储](02.MQ/01.Kafka/Kafka存储.md) 40 | - [Kafka 流式处理](02.MQ/01.Kafka/Kafka流式处理.md) 41 | - [Kafka 运维](02.MQ/01.Kafka/Kafka运维.md) 42 | 43 | #### [RocketMQ](02.MQ/02.RocketMQ) 44 | 45 | - [RocketMQ 快速入门](02.MQ/02.RocketMQ/RocketMQ快速入门.md) 46 | - [RocketMQ 基本原理](02.MQ/02.RocketMQ/RocketMQ基本原理.md) 47 | - [RocketMQ Faq](02.MQ/02.RocketMQ/RocketMQFaq.md) 48 | 49 | #### 其他 MQ 50 | 51 | - [ActiveMQ](02.MQ/99.其他MQ/ActiveMQ.md) 52 | 53 | ### 分布式存储 54 | 55 | - [分布式缓存](../22.分布式存储/分布式缓存.md) - 关键词:`进程内缓存`、`分布式缓存`、`缓存雪崩`、`缓存穿透`、`缓存击穿`、`缓存更新`、`缓存预热`、`缓存降级` 56 | - [读写分离](../22.分布式存储/读写分离.md) 57 | - [分库分表](../22.分布式存储/分库分表.md) - 关键词:`分片`、`路由`、`迁移`、`扩容`、`双写`、`聚合` 58 | 59 | ## 🚪 传送 60 | 61 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/00.笔记/17.人工智能/极客时间教程-机器学习40讲笔记.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《极客时间教程 - 机器学习 40 讲》笔记 3 | date: 2023-02-09 21:08:48 4 | order: 01 5 | categories: 6 | - 笔记 7 | - 人工智能 8 | tags: 9 | - 人工智能 10 | - 机器学习 11 | permalink: /pages/e317d658/ 12 | --- 13 | 14 | # 《极客时间教程 - 机器学习 40 讲》笔记 15 | 16 | ## 开篇词 | 打通修炼机器学习的任督二脉 17 | 18 | “机器学习”分为 3 个模块 19 | 20 | - **机器学习概观**:介绍机器学习中超脱于具体模型和方法之上的一些共性问题 21 | - **统计学习(频率学派)**:利用不同的模型去拟合数据背后的规律;用拟合出的规律去推断和预测未知的结果 22 | - **符号学习(贝叶斯学派)**:即概率图模型,它计算的是变量间的相关关系,每个遍历的先验分布和大量复杂的积分技巧。 23 | 24 | ## 01 丨频率视角下的机器学习 25 | 26 | 频率学派认为概率是随机事件发生频率的极限值; 27 | 28 | 频率学派执行参数估计时,视参数为确定取值,视数据为随机变量; 29 | 30 | 频率学派主要使用最大似然估计法,让数据在给定参数下的似然概率最大化; 31 | 32 | 频率学派对应机器学习中的统计学习,以经验风险最小化作为模型选择的准则。 33 | 34 | ## 02 | 贝叶斯视角下的机器学习 35 | 36 | 贝叶斯学派认为概率是事件的可信程度或主体对事件的信任程度; 37 | 38 | 贝叶斯学派执行参数估计时,视参数为随机变量,视数据为确定取值; 39 | 40 | 贝叶斯学派主要使用最大后验概率法,让参数在先验信息和给定数据下的后验概率最大化; 41 | 42 | 贝叶斯学派对应机器学习中的概率图模型,可以在模型预测和选择中提供更加完整的信息。 43 | 44 | ## 03 丨学什么与怎么学 45 | 46 | 什么样的问题才能通过机器学习来解决呢? 47 | 48 | 首先,问题不能是完全随机的,需要具备一定的模式; 49 | 50 | 其次,问题本身不能通过纯计算的方法解决; 51 | 52 | 再次,有大量的数据可供使用。 53 | 54 | 机器学习的任务,就是使用数据计算出与目标函数最接近的假设,或者说拟合出最精确的模型 。 55 | 56 | 输入特征类型 57 | 58 | - 具体特征(concrete feature) 59 | - 原始特征(raw feature) 60 | - 抽象特征(abstract feature) 61 | 62 | 机器学习方法类型 63 | 64 | - 分类算法(classification) 65 | - 回归算法(regression) 66 | - 标注算法(tagging) 67 | 68 | 如果训练数据中的每组输入都有其对应的输出结果,这类学习任务就是**监督学习(supervised learning)**,对没有输出的数据进行学习则是**无监督学习(unsupervised learning)**。监督学习具有更好的预测精度,无监督学习则可以发现数据中隐含的结构特性,起到的也是分类的作用,只不过没有给每个类别赋予标签而已。无监督学习可以用于对数据进行聚类或者密度估计,也可以完成异常检测这类监督学习中的预处理操作。直观地看,监督学习适用于预测任务,无监督学习适用于描述任务。 69 | 70 | ## 04 丨计算学习理论 -------------------------------------------------------------------------------- /source/_posts/13.网络/03.网络技术/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 网络技术 3 | date: 2020-04-27 10:56:00 4 | categories: 5 | - 网络 6 | - 网络技术 7 | tags: 8 | - 网络 9 | permalink: /pages/12e30b8d/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # 网络技术 15 | 16 | ## 📖 内容 17 | 18 | - [WebSocket](01.WebSocket.md) 19 | - [CDN](02.CDN.md) 20 | - [VPN](03.VPN.md) 21 | 22 | ## 📚 资料 23 | 24 | - **书籍** 25 | - [TCP/IP 详解 卷 1:协议](https://book.douban.com/subject/1088054/) - TCP/IP 红宝书,经典中的经典 26 | - [TCP/IP 详解 卷 2:实现](https://book.douban.com/subject/1087767/) - TCP/IP 红宝书,经典中的经典 27 | - [TCP/IP 详解 卷 3:TCP 事务协议、HTTP、NNTP 和 UNIX 域协议](https://book.douban.com/subject/1058634/) - TCP/IP 红宝书,经典中的经典 28 | - [Web 性能权威指南](https://book.douban.com/subject/25856314/) 29 | - [HTTP 权威指南](https://book.douban.com/subject/10746113/) 30 | - [图解 HTTP](https://book.douban.com/subject/25863515/) 31 | - [图解 TCP/IP](https://book.douban.com/subject/24737674/) 32 | - [计算机网络(第 7 版)](https://book.douban.com/subject/26960678/) - 国内大学计算机专业经典教材 33 | - **教程** 34 | - [Computer Network Tutorials](https://www.geeksforgeeks.org/computer-network-tutorials/) 35 | - **RFC** 36 | - https://www.rfc-editor.org/ - 在线查阅、下载 RFC 文档 37 | - **DNS** 38 | - [RFC 1034 DOMAIN NAMES - CONCEPTS AND FACILITIES](https://tools.ietf.org/html/rfc1034) - DNS 最核心 RFC 39 | - [RFC 1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION](https://tools.ietf.org/html/rfc1035) - DNS 最核心 RFC 40 | - **工具** 41 | - [WireShark](https://www.wireshark.org/) 42 | - [Postman](https://www.getpostman.com/) 43 | 44 | ## 🚪 传送 45 | 46 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/06.列式数据库/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 列式数据库 3 | date: 2023-09-08 15:58:37 4 | categories: 5 | - 数据库 6 | - 列式数据库 7 | tags: 8 | - 数据库 9 | - 列式数据库 10 | permalink: /pages/e5fd7cac/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 列式数据库 16 | 17 | ## 📖 内容 18 | 19 | ### HBase 20 | 21 | - [HBase 快速入门](hbase/HBase_快速入门.md) 22 | - [HBase 数据模型](hbase/HBase_数据模型.md) 23 | - [HBase Schema 设计](hbase/HBase_Schema.md) 24 | - [HBase 架构](hbase/HBase_架构.md) 25 | - [HBase Java API 基础特性](hbase/HBase_API_基础特性.md) 26 | - [HBase Java API 高级特性](hbase/HBase_API_高级特性.md) 27 | - [HBase Java API 高级特性之过滤器](hbase/HBase_API_高级特性_过滤器.md) 28 | - [HBase Java API 高级特性之协处理器](hbase/HBase_API_高级特性_协处理器.md) 29 | - [HBase 运维](hbase/HBase_运维.md) 30 | - [HBase 命令](hbase/HBase_命令.md) 31 | - [HBase 面试](hbase/HBase_面试.md) 💯 32 | 33 | ## 📚 资料 34 | 35 | - **官方** 36 | - [HBase 官网](http://hbase.apache.org/) 37 | - [HBase 官方文档](https://hbase.apache.org/book.html) 38 | - [HBase 官方文档中文版](http://abloz.com/hbase/book.html) 39 | - [HBase API](https://hbase.apache.org/apidocs/index.html) 40 | - **教程** 41 | - [BigData-Notes](https://github.com/heibaiying/BigData-Notes) 42 | - **书籍** 43 | - [《Hadoop 权威指南(第四版)》](https://item.jd.com/12109713.html) 44 | - **文章** 45 | - [Bigtable: A Distributed Storage System for Structured Data](https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/bigtable-osdi06.pdf) 46 | - [Intro to HBase](https://www.slideshare.net/alexbaranau/intro-to-hbase) 47 | - [深入理解 Hbase 架构](https://segmentfault.com/a/1190000019959411) 48 | 49 | ## 🚪 传送 50 | 51 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/03.模板引擎/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 模板引擎 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - 工具 7 | - 模板引擎 8 | tags: 9 | - Java 10 | - 模板引擎 11 | permalink: /pages/cad15f3b/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Java 模板引擎 17 | 18 | 模板引擎不属于特定技术领域,它是跨领域跨平台的概念。 模板引擎的作用就是分离业务数据和最终呈现内容,它可以生成特定格式的文档(模板) 。 19 | 20 | 模板引擎简单来说,就是:**_`模板 + 数据模型 = 输出`_** 21 | 22 | 较早,也比较经典的模板引擎是 JavaEE 的标准技术 JSP。 23 | 24 | 但 JSP 存在以下缺点,导致逐渐被淘汰: 25 | 26 | - **性能差** 27 | - JSP 本质上是 Servlet,第一次请求 JSP 页面,必须要在 web 服务器中编译成 servlet,所以第一次响应较慢。 28 | - 每次请求 JSP 都是访问 servlet 再用输出流输出的 html 页面。 29 | - JSP 中的内容很多,页面响应会很慢,因为是同步加载。 30 | - **无法前后端分离** 31 | - 动态资源和静态资源全部耦合在一起,无法做到前后端分离。一旦服务器出现状况,前后台一起玩完。 32 | - 而且 Java 工程师既当爹又当妈,又要维护 Java 代码,又要维护 JSP 代码,痛苦。 33 | - 前端工程师如果不理解 JSP 语法,面对各种 JSP 标签、表达式、指令,会一脸懵逼,痛苦。 34 | - **不是所有服务器都支持** - JSP 必须要在支持 JSP 技术的 web 服务器里运行(如 Tomcat)。但有些服务器则不支持 JSP ,如 Nginx。 35 | 36 | 在 Java 领域,目前最常见的模板引擎就是: 37 | 38 | - Freemark 39 | - Thymeleaf 40 | - Velocity 41 | 42 | ## 内容 43 | 44 | - [Freemark](01.Freemark.md) 45 | - [Thymeleaf](02.Thymeleaf.md) 46 | - [Velocity](03.Velocity.md) 47 | 48 | ## 资源 49 | 50 | - **Freemark** 51 | - [Freemark Github](https://github.com/apache/freemarker/) 52 | - [Freemark 中文教程](http://freemarker.foofun.cn/) 53 | - [在线 Freemark 工具](https://try.freemarker.apache.org/) 54 | - **Velocity** 55 | - [Velocity Github](https://github.com/apache/velocity-engine/) 56 | - [Velocity 官网](https://velocity.apache.org/) 57 | - [Velocity 中文文档](https://wizardforcel.gitbooks.io/velocity-doc/content/) 58 | - [velocity-spring-boot-project](https://github.com/alibaba/velocity-spring-boot-project) -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/06.JVM/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java JVM 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - JVM 8 | tags: 9 | - Java 10 | - JavaCore 11 | - JVM 12 | permalink: /pages/be8c745f/ 13 | hidden: true 14 | index: false 15 | dir: 16 | order: 6 17 | link: true 18 | --- 19 | 20 | # JVM 教程 21 | 22 | > 【Java 虚拟机】总结、整理了个人对于 JVM 的学习、应用心得。 23 | 24 | ## 📖 内容 25 | 26 | - [Java 虚拟机简介](Java_虚拟机_简介.md) 27 | - [Java 虚拟机之内存区域](Java_虚拟机_内存区域.md) - 关键词:`程序计数器`、`虚拟机栈`、`本地方法栈`、`堆`、`方法区`、`运行时常量池`、`直接内存`、`OutOfMemoryError`、`StackOverflowError` 28 | - [Java 虚拟机之垃圾收集](Java_虚拟机_垃圾收集.md) - 关键词:`GC Roots`、`Serial`、`Parallel`、`CMS`、`G1`、`Minor GC`、`Full GC` 29 | - [Java 虚拟机之字节码](Java_虚拟机_字节码.md) - 关键词:`bytecode`、`asm`、`javassist` 30 | - [Java 虚拟机之类加载](Java_虚拟机_类加载.md) - 关键词:`ClassLoader`、`双亲委派` 31 | - [Java 虚拟机之工具](Java_虚拟机_工具.md) - 关键词:`jps`、`jstat`、`jmap` 、`jstack`、`jhat`、`jinfo`、`jconsole`、`jvisualvm`、`MAT`、`JProfile`、`Arthas` 32 | - [Java 虚拟机之故障处理](Java_虚拟机_故障处理.md) - 关键词:`CPU`、`内存`、`磁盘`、`网络`、`GC` 33 | - [Java 虚拟机之调优](Java_虚拟机_调优.md) - 关键词:`配置`、`调优` 34 | 35 | ## 📚 资料 36 | 37 | - [《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/) 38 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 39 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) 40 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.geekbang.org/column/intro/100047701) 41 | - [极客时间教程 - 深入拆解 Java 虚拟机](https://time.geekbang.org/column/intro/100010301) 42 | - [从表到里学习 JVM 实现](https://www.douban.com/doulist/2545443/) 43 | 44 | ## 🚪 传送 45 | 46 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/13.网络/02.网络协议/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 网络协议 3 | date: 2020-04-27 10:56:00 4 | categories: 5 | - 网络 6 | - 网络协议 7 | tags: 8 | - 网络 9 | - 网络协议 10 | permalink: /pages/a86f8245/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 网络协议 16 | 17 | ## 📖 内容 18 | 19 | - [超文本传输协议 HTTP](01.HTTP.md) 20 | - [域名系统协议 DNS](02.DNS) 21 | - [传输控制协议 TCP](03.TCP.md) 22 | - [用户数据报协议 UDP](04.UDP.md) 23 | - [ICMP](05.ICMP.md) 24 | 25 | ## 📚 资料 26 | 27 | - **书籍** 28 | - [TCP/IP 详解 卷 1:协议](https://book.douban.com/subject/1088054/) - TCP/IP 红宝书,经典中的经典 29 | - [TCP/IP 详解 卷 2:实现](https://book.douban.com/subject/1087767/) - TCP/IP 红宝书,经典中的经典 30 | - [TCP/IP 详解 卷 3:TCP 事务协议、HTTP、NNTP 和 UNIX 域协议](https://book.douban.com/subject/1058634/) - TCP/IP 红宝书,经典中的经典 31 | - [Web 性能权威指南](https://book.douban.com/subject/25856314/) 32 | - [HTTP 权威指南](https://book.douban.com/subject/10746113/) 33 | - [图解 HTTP](https://book.douban.com/subject/25863515/) 34 | - [图解 TCP/IP](https://book.douban.com/subject/24737674/) 35 | - [计算机网络(第 7 版)](https://book.douban.com/subject/26960678/) - 国内大学计算机专业经典教材 36 | - **教程** 37 | - [Computer Network Tutorials](https://www.geeksforgeeks.org/computer-network-tutorials/) 38 | - **RFC** 39 | - https://www.rfc-editor.org/ - 在线查阅、下载 RFC 文档 40 | - **DNS** 41 | - [RFC 1034 DOMAIN NAMES - CONCEPTS AND FACILITIES](https://tools.ietf.org/html/rfc1034) - DNS 最核心 RFC 42 | - [RFC 1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION](https://tools.ietf.org/html/rfc1035) - DNS 最核心 RFC 43 | - **工具** 44 | - [WireShark](https://www.wireshark.org/) 45 | - [Postman](https://www.getpostman.com/) 46 | 47 | ## 🚪 传送 48 | 49 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/04.文档数据库/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 文档数据库 3 | date: 2023-09-08 15:50:34 4 | categories: 5 | - 数据库 6 | - 文档数据库 7 | tags: 8 | - 数据库 9 | - 文档数据库 10 | permalink: /pages/4b2d2f5c/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 文档数据库 16 | 17 | ## 📖 内容 18 | 19 | ### MongoDB 20 | 21 | 22 | > MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 23 | > 24 | > MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。 25 | > 26 | > MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 27 | 28 | - [MongoDB 简介](mongodb/MongoDB_简介.md) 29 | - [MongoDB CRUD](mongodb/MongoDB_CRUD.md) 30 | - [MongoDB 聚合](mongodb/MongoDB_聚合.md) 31 | - [MongoDB 索引](mongodb/MongoDB_索引.md) 32 | - [MongoDB 事务](mongodb/MongoDB_事务.md) 33 | - [MongoDB 建模](mongodb/MongoDB_建模.md) 34 | - [MongoDB 复制](mongodb/MongoDB_复制.md) 35 | - [MongoDB 分片](mongodb/MongoDB_分片.md) 36 | - [MongoDB 运维](mongodb/MongoDB_运维.md) 37 | - [MongoDB 面试](mongodb/MongoDB_面试.md) 💯 38 | 39 | 40 | ## 📚 资料 41 | 42 | ### MongoDB 资料 43 | 44 | - **官方** 45 | - [MongoDB 官网](https://www.mongodb.com/) 46 | - [MongoDB Github](https://github.com/mongodb/mongo) 47 | - [MongoDB 官方免费教程](https://learn.mongodb.com/) 48 | - **教程** 49 | - [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.html) 50 | - [极客时间教程 - MongoDB 高手课](https://time.geekbang.org/course/intro/100040001) 51 | - **数据** 52 | - [mongodb-json-files](https://github.com/ozlerhakan/mongodb-json-files) 53 | - **文章** 54 | - [Introduction to MongoDB](https://www.slideshare.net/mdirolf/introduction-to-mongodb) 55 | 56 | ## 🚪 传送 57 | 58 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/14.操作系统/02.Linux/02.工具/04.firewalld.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: firewalld 3 | date: 2020-02-11 13:11:00 4 | order: 04 5 | categories: 6 | - 操作系统 7 | - Linux 8 | - 工具 9 | tags: 10 | - 操作系统 11 | - Linux 12 | - 工具 13 | - 防火墙 14 | permalink: /pages/17292e63/ 15 | --- 16 | 17 | # 防火墙 - Firewalld 18 | 19 | ## firewalld 服务命令 20 | 21 | ```shell 22 | systemctl enable firewalld.service # 开启服务(开机自动启动服务) 23 | systemctl disable firewalld.service # 关闭服务(开机不会自动启动服务) 24 | systemctl start firewalld.service # 启动服务 25 | systemctl stop firewalld.service # 停止服务 26 | systemctl restart firewalld.service # 重启服务 27 | systemctl reload firewalld.service # 重新载入配置 28 | systemctl status firewalld.service # 查看服务状态 29 | ``` 30 | 31 | ## firewall-cmd 命令 32 | 33 | `firewall-cmd` 命令用于配置防火墙。 34 | 35 | ```shell 36 | firewall-cmd --version # 查看版本 37 | firewall-cmd --help # 查看帮助 38 | firewall-cmd --state # 显示状态 39 | firewall-cmd --reload # 更新防火墙规则 40 | firewall-cmd --get-active-zones # 查看区域信息 41 | firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域 42 | firewall-cmd --panic-on # 拒绝所有包 43 | firewall-cmd --panic-off # 取消拒绝状态 44 | firewall-cmd --query-panic # 查看是否拒绝 45 | 46 | firewall-cmd --zone=public --list-ports # 查看所有打开的端口 47 | firewall-cmd --zone=public --query-port=80/tcp # 查看是否有开放的 80 TCP 端口 48 | firewall-cmd --zone=public --add-port=8080/tcp --permanent # 添加开放端口(--permanent永久生效,没有此参数重启后失效) 49 | firewall-cmd --zone=public --remove-port=80/tcp --permanent # 永久删除开放的 80 TCP 端口 50 | ``` 51 | 52 | ## 参考资料 53 | 54 | - [CentOS7 使用 firewalld 打开关闭防火墙与端口](https://www.cnblogs.com/moxiaoan/p/5683743.html) -------------------------------------------------------------------------------- /source/_posts/00.笔记/96.工作/极客时间教程-职场求生攻略笔记.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《极客时间教程 - 职场求生攻略》笔记 3 | date: 2022-07-11 07:23:21 4 | order: 01 5 | categories: 6 | - 笔记 7 | - 工作 8 | tags: 9 | - 工作 10 | - 职场 11 | permalink: /pages/80a0db57/ 12 | --- 13 | 14 | # 《极客时间教程 - 职场求生攻略》笔记 15 | 16 | ## 学会如何工作,和学习技术同等重要 17 | 18 | 以利益为视角,以换位思考为手段。 19 | 20 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711064451.png) 21 | 22 | ## 优先级:工作中那么多事情,我要如何安排优先级? 23 | 24 | ### 基于工作性质安排优先级 25 | 26 | 工作可以划分为: 27 | 28 | 业务拓展:需求分析、设计、开发都属于这范畴。 29 | 30 | 安全问题:安全无小事。要高度重视安全问题。 31 | 32 | 线上问题:直接影响用户体验和权益。要第一优先级去处理。 33 | 34 | ### 基于合作安排优先级 35 | 36 | 事情如果没有明显的轻重缓急,优先做那些会阻塞别人工作的事情。 37 | 38 | ### 做事情本身的优先级 39 | 40 | 我们做事情的时候,如果能把其中的每一步都想清楚,理清依赖关系,安排得井井有条,这就已经事半功倍了。 41 | 42 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711065205.png) 43 | 44 | ## 沟通:邮件那么重要,你还在轻视邮件吗? 45 | 46 | ### 邮件的特性 47 | 48 | 1. 异步交流:邮件是一种异步交流的方式,双方有足够的时间准备邮件内容。 49 | 2. 无法修改:邮件内容无法修改,这是邮件可靠的基石。 50 | 3. 方便扩散:邮件有邮件组,可以很方便地把相关人员加进来,并且保留邮件历史记录。 51 | 52 | ### 邮件是公司内部的合同 53 | 54 | 场景 1:设计确认(邮件的“确认”功能) 55 | 56 | 场景 2:优先级(邮件的“证据链”功能) 57 | 58 | 场景 3:大促(邮件的“沟通协调”功能) 59 | 60 | 场景 4:新业务接入(邮件的“防遗忘”功能) 61 | 62 | 场景 5:技术升级和 Bug 修复(邮件的“广而告之”功能) 63 | 64 | ### 邮件的魅力 65 | 66 | 我们都是普通人,普通人没有“背锅”的压力,就没有持久的把事情做好的动力。 67 | 68 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711065742.png) 69 | 70 | ## 沟通:程序员为什么应该爱上交流? 71 | 72 | ### ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711070152.png) 73 | 74 | ## 主观能动性:为什么程序员,需要发挥主观能动性? 75 | 76 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711070531.png) 77 | 78 | ## 责任的边界:程序员的职责范围仅仅只是被安排的任务吗? 79 | 80 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20220711070722.png) -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/00.综合/01.系统架构面试.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 系统架构面试 3 | date: 2020-08-10 10:59:18 4 | order: 01 5 | categories: 6 | - 设计 7 | - 架构 8 | - 综合 9 | tags: 10 | - 架构 11 | - 面试 12 | permalink: /pages/59eefc2d/ 13 | --- 14 | 15 | # 系统架构面试 16 | 17 | ## 如何设计一个秒杀系统? 18 | 19 | ### 秒杀系统的挑战 20 | 21 | 秒杀的核心问题就是**极高并发处理**,由于系统要在瞬时承受平时数十倍甚至上百倍的流量,这往往超出系统上限,因此处理秒杀的**核心思路是限流和缓存**。 22 | 23 | ### 秒杀系统的解决思路 24 | 25 | - 系统上有拦截流量:尽可能在上游拦截和限制请求,限制流入后端的量,保证后端系统正常。 因为无论多少人参与秒杀,实际成交往往是有限的,而且远小于参加秒杀的人数,因此可以通过前端系统进行拦截,限制最终流入系统的请求数量,来保证系统正常进行。 26 | - 充分利用缓存:这是一个典型的读多写少的应用场景(一趟火车其实只有 2000 张票,200w 个人来买,最多 2000 个人下单成功,其他人都是查询库存,写比例只有 0.1%,读比例占 99.9%),非常适合使用缓存。 27 | 28 | ### 秒杀系统的解决方案 29 | 30 | 秒杀系统具体方案如下: 31 | 32 | **(1)浏览器、客户端拦截重复请求** 33 | 34 | - 用户点击查询或购买按钮后,禁用按钮,避免用户重复提交请求。 35 | - JS 代码中限制用户在限定时间内只允许提交一次请求 36 | 37 | 基于此,大部分流量已被拦截。 38 | 39 | **(2)应用层拦截请求** 40 | 41 | 浏览器、客户端拦截重复请求只能应付通过浏览器访问的用户。如果有人通过程序发送 http 请求,则无法拦截。针对这种情况的方案是: 42 | 43 | 以页面缓存的方式,针对短时间内的同一个访问源(如同一个 IP、同一个 Session、同一个用户 ID 多次发送 HTTP 请求)或同样的查询请求(如大量请求都是查询某类商品的库存),都返回相同的展示页面。 44 | 45 | 如此限流,又有大部分的流量被拦截 46 | 47 | (3)服务层请求拦截与数据缓存 48 | 49 | 加入有黑客,控制了 10w 台肉鸡(并且假设买票不需要实名认证),前面的的限制都不起作用了。这时应该怎么办? 50 | 51 | - 读请求(查库存) - 对于读请求,直接使用缓存即可,一般缓存服务器单机处理每秒 10w 个请求应该没什么问题。 52 | 53 | - 写请求(下单) - 由于服务层清楚的知道库存数量,所以完全可以根据库存数量进行限流。具体来说,就是把所有下单请求都丢该消息队列中,每次只取有限的写请求去数据层处理。当这些写请求处理完,更新一下缓存中的库存数,再去取下一批写请求,如果库存数不够,则消息队列的写请求全部返回"已售罄"的结果。 54 | 55 | > 参考: 56 | > 57 | > - [如何设计秒杀系统? - 阿里云云栖社区的回答 - 知乎](https://www.zhihu.com/question/54895548/answer/146924420) 58 | > - [如何设计秒杀系统? - 网易云的回答 - 知乎](https://www.zhihu.com/question/54895548/answer/259218876) 59 | 60 | ## 参考资料 61 | 62 | - [如何设计秒杀系统? - 阿里云云栖社区的回答 - 知乎](https://www.zhihu.com/question/54895548/answer/146924420) 63 | - [如何设计秒杀系统? - 网易云的回答 - 知乎](https://www.zhihu.com/question/54895548/answer/259218876) -------------------------------------------------------------------------------- /source/_posts/03.设计/02.设计模式/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 设计模式 3 | date: 2020-08-10 10:59:18 4 | categories: 5 | - 设计 6 | - 设计模式 7 | tags: 8 | - 设计 9 | - 设计模式 10 | permalink: /pages/fe8df8f0/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # 设计模式 16 | 17 | > **设计模式**是软件设计中常见问题的典型解决方案。 18 | 19 | ## 📖 内容 20 | 21 | - [面向对象原则](25.面向对象原则.md) 22 | 23 | ### 创建型模式 24 | 25 | > 创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。 26 | 27 | - [简单工厂模式 (Simple Factory)](01.简单工厂模式.md) 28 | - [工厂方法模式 (Factory Method)](02.工厂方法模式.md) 29 | - [抽象工厂模式 (Abstract Factory)](03.抽象工厂模式.md) 30 | - [建造者模式 (Builder)](04.建造者模式.md) 31 | - [原型模式 (Prototype)](05.原型模式.md) 32 | - [单例模式 (Singleton)](06.单例模式.md) 33 | 34 | ### 结构型模式 35 | 36 | > 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。 37 | 38 | - [适配器模式 (Adapter)](07.适配器模式.md) 39 | - [桥接模式 (Bridge)](08.桥接模式.md) 40 | - [组合模式 (Composite)](09.组合模式.md) 41 | - [装饰模式 (Decorator)](10.装饰模式.md) 42 | - [外观模式 (Facade)](11.外观模式.md) 43 | - [享元模式 (Flyweight)](12.享元模式.md) 44 | - [代理模式 (Proxy)](13.代理模式.md) 45 | 46 | ### 行为型模式 47 | 48 | > 行为模式负责对象间的高效沟通和职责委派。 49 | 50 | - [模板方法模式 (Template Method)](14.模板方法模式.md) 51 | - [命令模式 (Command)](15.命令模式.md) 52 | - [迭代器模式 (Iterator)](16.迭代器模式.md) 53 | - [观察者模式 (Observer)](17.观察者模式.md) 54 | - [解释器模式 (Interpreter)](18.解释器模式.md) 55 | - [中介者模式 (Mediator)](19.中介者模式.md) 56 | - [职责链模式 (Chain of Responsibility)](20.职责链模式.md) 57 | - [备忘录模式 (Memento)](21.备忘录模式.md) 58 | - [策略模式 (Strategy)](22.策略模式.md) 59 | - [访问者模式 (Visitor)](23.访问者模式.md) 60 | - [状态模式 (State)](24.状态模式.md) 61 | 62 | ## 📚 资料 63 | 64 | - [《Head First 设计模式》](https://book.douban.com/subject/2243615/) 65 | - [《大话设计模式》](https://book.douban.com/subject/2334288/) 66 | - [设计模式教程](https://refactoringguru.cn/design-patterns/catalog) 67 | 68 | ## 🚪 传送 69 | 70 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/11.ORM/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java ORM 框架 3 | date: 2022-02-17 22:34:30 4 | categories: 5 | - Java 6 | - 框架 7 | - ORM 8 | tags: 9 | - Java 10 | - 框架 11 | - ORM 12 | permalink: /pages/1e4215bc/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Java ORM 框架 18 | 19 | > MyBatis 的前身就是 iBatis ,是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。本文以一个 MyBatis 完整示例为切入点,结合 MyBatis 底层源码分析,图文并茂的讲解 MyBatis 的核心工作机制。 20 | 21 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20210522101005.png) 22 | 23 | ## 📖 内容 24 | 25 | - [MyBatis 快速入门](MyBatis快速入门.md) 26 | - [MyBatis 原理](MyBatis原理.md) 27 | - [MyBatis 原理](MyBatis面试.md) 28 | 29 | ## 📚 资料 30 | 31 | - **官方** 32 | - [MyBatis Github](https://github.com/mybatis/mybatis-3) 33 | - [MyBatis 官网](http://www.mybatis.org/mybatis-3/) 34 | - [MyBatis 官方代码生成(mybatis-generator)](https://github.com/mybatis/generator) 35 | - [MyBatis 官方集成 Spring(mybatis-spring)](https://github.com/mybatis/spring) 36 | - [MyBatis 官方集成 Spring Boot(mybatis-spring-boot)](https://github.com/mybatis/spring-boot-starter) 37 | - **扩展插件** 38 | - [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) - CRUD 扩展插件、代码生成器、分页器等多功能 39 | - [Mapper](https://github.com/abel533/Mapper) - CRUD 扩展插件 40 | - [MyBatis-PageHelper](https://github.com/pagehelper/Mybatis-PageHelper) - MyBatis 通用分页插件 41 | - **文章** 42 | - [深入理解 mybatis 原理](https://blog.csdn.net/luanlouis/article/details/40422941) 43 | - [mybatis 源码中文注释](https://github.com/tuguangquan/mybatis) 44 | - [MyBatis Generator 详解](https://blog.csdn.net/isea533/article/details/42102297) 45 | - [MyBatis 常见面试题](https://juejin.im/post/5aa646cdf265da237e095da1) 46 | - [MyBatis 中强大的 resultMap](https://juejin.im/post/5cee8b61e51d455d88219ea4) 47 | 48 | ## 🚪 传送 49 | 50 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/03.容器/Java_容器_Stream.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 容器之 Stream 3 | date: 2020-12-05 18:30:22 4 | order: 06 5 | categories: 6 | - Java 7 | - JavaCore 8 | - 容器 9 | tags: 10 | - Java 11 | - JavaCore 12 | - 容器 13 | permalink: /pages/c7eb7d7d/ 14 | --- 15 | 16 | # Java 容器之 Stream 17 | 18 | ## Stream 简介 19 | 20 | 在 Java8 中,`Collection` 新增了两个流方法,分别是 `stream()` 和 `parallelStream()`。 21 | 22 | `Stream` 相当于高级版的 `Iterator`,他可以通过 Lambda 表达式对集合进行各种非常便利、高效的聚合操作(Aggregate Operation),或者大批量数据操作 (Bulk Data Operation)。 23 | 24 | ## Stream 操作分类 25 | 26 | 官方将 Stream 中的操作分为两大类:中间操作(Intermediate operations)和终结操作(Terminal operations)。 27 | 28 | 中间操作又可以分为无状态(Stateless)与有状态(Stateful)操作,前者是指元素的处理不受之前元素的影响,后者是指该操作只有拿到所有元素之后才能继续下去。 29 | 30 | 终结操作又可以分为短路(Short-circuiting)与非短路(Unshort-circuiting)操作,前者是指遇到某些符合条件的元素就可以得到最终结果,后者是指必须处理完所有元素才能得到最终结果。 31 | 32 | ## Stream 源码实现 33 | 34 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201205174140.jpg) 35 | 36 | `BaseStream` 和 `Stream` 是最顶层的接口类。`BaseStream` 主要定义了流的基本接口方法,例如,spliterator、isParallel 等;`Stream` 则定义了一些流的常用操作方法,例如,map、filter 等。 37 | 38 | `Sink` 接口是定义每个 `Stream` 操作之间关系的协议,他包含 `begin()`、`end()`、`cancellationRequested()`、`accpt()` 四个方法。`ReferencePipeline` 最终会将整个 `Stream` 流操作组装成一个调用链,而这条调用链上的各个 `Stream` 操作的上下关系就是通过 `Sink` 接口协议来定义实现的。 39 | 40 | `ReferencePipeline` 是一个结构类,他通过定义内部类组装了各种操作流。他定义了 `Head`、`StatelessOp`、`StatefulOp` 三个内部类,实现了 `BaseStream` 与 `Stream` 的接口方法。Head 类主要用来定义数据源操作,在初次调用 names.stream() 方法时,会加载 Head 对象,此时为加载数据源操作;接着加载的是中间操作,分别为无状态中间操作 StatelessOp 对象和有状态操作 StatefulOp 对象,此时的 Stage 并没有执行,而是通过 AbstractPipeline 生成了一个中间操作 Stage 链表;当我们调用终结操作时,会生成一个最终的 Stage,通过这个 Stage 触发之前的中间操作,从最后一个 Stage 开始,递归产生一个 Sink 链。 41 | 42 | ## Stream 并行处理 43 | 44 | Stream 处理数据的方式有两种,串行处理和并行处理。 45 | 46 | ## 4. 参考资料 47 | 48 | - [Java 编程思想(第 4 版)](https://item.jd.com/10058164.html) -------------------------------------------------------------------------------- /source/_posts/15.分布式/22.分布式存储/读写分离.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 读写分离基本原理 3 | date: 2022-04-14 11:36:23 4 | order: 02 5 | categories: 6 | - 分布式 7 | - 分布式存储 8 | tags: 9 | - 分布式 10 | - 分布式存储 11 | - 读写分离 12 | permalink: /pages/708e3c01/ 13 | --- 14 | 15 | # 读写分离基本原理 16 | 17 | **读写分离的基本原理是:主服务器用来处理写操作以及实时性要求比较高的读操作,而从服务器用来处理读操作**。 18 | 19 | ## 为何要读写分离 20 | 21 | - **有效减少锁竞争** - 主服务器只负责写,从服务器只负责读,能够有效的避免由数据更新导致的行锁竞争,使得整个系统的查询性能得到极大的改善。 22 | - **提高查询吞吐量** - 通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力。 23 | - **提升数据库可用性** - 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升数据库的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。 24 | 25 | ## 读写分离的原理 26 | 27 | 读写分离的实现是根据 SQL 语义分析,将读操作和写操作分别路由至主库与从库。 28 | 29 | ![读写分离](https://shardingsphere.apache.org/document/current/img/read-write-split/read-write-split.png) 30 | 31 | 读写分离的基本实现是: 32 | 33 | ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/database/mysql/master-slave-proxy.png) 34 | 35 | - 数据库服务器搭建主从集群,一主一从、一主多从都可以。 36 | - 数据库主机负责读写操作,从机只负责读操作。 37 | - 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了全量数据。 38 | - 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。 39 | - 主机会记录请求的二进制日志,然后推送给从库,从库解析并执行日志中的请求,完成主从复制。这意味着:复制过程存在时延,这段时间内,主从数据可能不一致。 40 | 41 | ## 读写分离的问题 42 | 43 | 读写分离存在两个问题:**数据一致性**和**分发机制**。 44 | 45 | ### 数据一致性 46 | 47 | 读写分离产生了主库与从库之间的数据一致性的问题。 48 | 49 | ![数据分片 + 读写分离](https://shardingsphere.apache.org/document/current/img/read-write-split/sharding-read-write-split.png) 50 | 51 | ### 分发机制 52 | 53 | 数据库读写分离后,一个 SQL 请求具体分发到哪个数据库节点?一般有两种分发方式:客户端分发和中间件代理分发。 54 | 55 | 客户端分发,是基于程序代码,自行控制数据分发到哪个数据库节点。更细一点来说,一般程序中建立多个数据库的连接,根据一定的算法,选择合适的连接去发起 SQL 请求。这种方式也被称为客户端中间件,代表有:jdbc-sharding。 56 | 57 | 中间件代理分发,指的是独立一套系统出来,实现读写操作分离和数据库服务器连接的管理。中间件对业务服务器提供 SQL 兼容的协议,业务服务器无须自己进行读写分离。对于业务服务器来说,访问中间件和访问数据库没有区别,事实上在业务服务器看来,中间件就是一个数据库服务器。代表有:Mycat。 58 | 59 | ## 参考资料 60 | 61 | - [后端存储实战课](https://time.geekbang.org/column/intro/100046801) 62 | - [ShardingSphere 官方文档](https://shardingsphere.apache.org/document/current/cn/overview/) -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/01.微服务/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 微服务 3 | date: 2021-06-02 11:22:02 4 | categories: 5 | - 设计 6 | - 架构 7 | - 微服务 8 | tags: 9 | - 设计 10 | - 架构 11 | - 微服务 12 | - 分布式 13 | permalink: /pages/76c00a1f/ 14 | hidden: true 15 | index: false 16 | --- 17 | 18 | # 微服务 19 | 20 | > **微服务是一种架构模式**,它提倡将一个单一应用拆分为一些**可独立运行**、**可协同工作**的**小的服务**。在微服务架构中,每个小服务都拥有独立的进程和轻量级通信。这些服务是围绕业务能力构建的,并且可以通过全自动化部署机制独立部署。这些服务会使用最小规模的集中式管理能力(例如 Docker) ,可以用不同的编程语言编写并使用不同的数据存储技术。 21 | 22 | ## 📖 内容 23 | 24 | - [微服务简介](01.微服务简介.md) - 关键词:`定义`、`演进`、`利弊`、`如何拆分`、`容量规划`、`核心组件` 25 | - [微服务之注册和发现](02.微服务之注册和发现.md) - 关键词:`服务定义`、`注册中心`、`元数据`、`健康检查`、`服务订阅`、`一致性` 26 | - [微服务之服务调用](03.微服务之服务调用.md) - 关键词:`RPC`、`通信协议`、`传输方式`、`序列化` 27 | - [微服务基本原理](10.微服务基本原理.md) - 关键词:`微服务`、`序列化`、`动态代理`、`通信`、`服务注册发现`、`健康检查`、`路由`、`负载均衡`、`容错处理`、`优雅上线下线`、`限流`、`熔断`、`业务分组` 28 | 29 | ## 📚 资料 30 | 31 | - **书籍** 32 | - [《大型网站技术架构:核心原理与案例分析》](https://item.jd.com/11322972.html) - 浅显易懂的将解大型网站架构演进之路;简介了大型系统所面临的挑战以及核心技术点。 33 | - [大型网站系统与 Java 中间件实践](https://item.jd.com/11449803.html) 34 | - [亿级流量网站架构核心技术:跟开涛学搭建高可用高并发系统](https://item.jd.com/12153914.html) 35 | - [企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战](https://item.jd.com/12176278.html) - 阐述阿里巴巴中台系统发展,更多的是讲解应用场景和能力,没有讲解技术细节。 36 | - [逆流而上:阿里巴巴技术成长之路](https://item.jd.com/12238227.html) - 主要以运维的视角阐述系统运维中遇到的困难,定位思路以及解决方法。 37 | - **教程** 38 | - [system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md) 39 | - [从 0 开始学微服务](https://time.geekbang.org/column/intro/100014401) 40 | - [微服务架构核心 20 讲](https://time.geekbang.org/course/intro/100003901) 41 | - [微服务架构实战 160 讲](https://time.geekbang.org/course/intro/84) 42 | - [RPC 实战与核心原理](https://time.geekbang.org/column/intro/100046201) 43 | - **文章** 44 | - [Microservices](https://www.martinfowler.com/articles/microservices.html) Martin Fowler 与 James Lewis 对微服务的定义 45 | 46 | ## 🚪 传送 47 | 48 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/06.列式数据库/hbase/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:hbase 3 | title: HBase 教程 4 | date: 2020-09-09 17:53:08 5 | categories: 6 | - 数据库 7 | - 列式数据库 8 | - hbase 9 | tags: 10 | - 数据库 11 | - 列式数据库 12 | - 大数据 13 | - hbase 14 | permalink: /pages/a8b8ce65/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # HBase 教程 20 | 21 | ## 📖 内容 22 | 23 | - [HBase 快速入门](HBase_快速入门.md) 24 | - [HBase 数据模型](HBase_数据模型.md) 25 | - [HBase Schema 设计](HBase_Schema.md) 26 | - [HBase 架构](HBase_架构.md) 27 | - [HBase Java API 基础特性](HBase_API_基础特性.md) 28 | - [HBase Java API 高级特性](HBase_API_高级特性.md) 29 | - [HBase Java API 高级特性之过滤器](HBase_API_高级特性_过滤器.md) 30 | - [HBase Java API 高级特性之协处理器](HBase_API_高级特性_协处理器.md) 31 | - [HBase Java API 管理功能](HBase_API_管理功能.md) 32 | - [HBase 运维](HBase_运维.md) 33 | - [HBase 命令](HBase_命令.md) 34 | - [HBase 面试](HBase_面试.md) 💯 35 | 36 | ## 📚 资料 37 | 38 | - **官方** 39 | - [HBase 官网](http://hbase.apache.org/) 40 | - [HBase 官方文档](https://hbase.apache.org/book.html) 41 | - [HBase 官方文档中文版](http://abloz.com/hbase/book.html) 42 | - [HBase API](https://hbase.apache.org/apidocs/index.html) 43 | - **教程** 44 | - [BigData-Notes](https://github.com/heibaiying/BigData-Notes) 45 | - **书籍** 46 | - [《HBase 权威指南》](https://book.douban.com/subject/25784835/) 47 | - [《Hadoop 权威指南(第四版)》](https://book.douban.com/subject/27115351/) 48 | - **视频** 49 | - [What Is HBase?](https://www.youtube.com/watch?v=cEjDR3B_3cs) - 言简意赅,浅显易懂 50 | - [HBase Schema Design](https://www.youtube.com/watch?v=_HLoH_PgrLk&t=1054s) - 《HBase 权威指南》作者讲解 HBase 设计 51 | - **文章** 52 | - [Bigtable: A Distributed Storage System for Structured Data](https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/bigtable-osdi06.pdf) 53 | - [Intro to HBase](https://www.slideshare.net/alexbaranau/intro-to-hbase) 54 | - [深入理解 Hbase 架构](https://segmentfault.com/a/1190000019959411) 55 | 56 | ## 🚪 传送 57 | 58 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/13.网络/01.网络综合/11.物理层.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 计算机网络之物理层 3 | date: 2019-02-20 23:06:00 4 | order: 11 5 | categories: 6 | - 网络 7 | - 网络综合 8 | tags: 9 | - 网络 10 | - 网络分层 11 | permalink: /pages/3461bf57/ 12 | --- 13 | 14 | # 计算机网络之物理层 15 | 16 | > **摘要** 17 | > 18 | > **物理层(Physical Layer)** - 物理层只接收和发送一串比特(bit)流,不考虑信息的意义和信息结构。 19 | > 20 | > - 数据单元:比特流。 21 | > - 典型设备:光纤、同轴电缆、双绞线、中继器和集线器。 22 | 23 | ## 通信系统模型 24 | 25 | ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/network/physical/数据通信系统的模型.png) 26 | 27 | 通信系统模型分为三大部分:源系统(包括信源和发送器)、传输系统、目的系统(包括信宿接收器)。 28 | 29 | 重要概念: 30 | 31 | - **信源** - 也叫源点。产生各类信息的实体。 32 | - **信道** - 通信的通道,是信号传输的媒介。 33 | - **信宿** - 传输信息的归宿。 34 | - **码元** - 在数字通信中常常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。 35 | 36 | ## 通信方式 37 | 38 | ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/network/physical/通信方式.jpg) 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 | ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/network/physical/基本调制方法.png) 72 | 73 | 如果你收听过广播,一定经常听到 AM、FM 这两个关键词,这是什么意思呢?答案如下: 74 | 75 | - **调幅(AM)** - 即载波的**振幅**随基带数字信号而变化。 76 | - **调频(FM)** - 即载波的**频率**随基带数字信号而变化。 77 | - **调相(PM)** - 即载波的**初始相位**随基带数字信号而变化。 78 | 79 | > 📌 提示:我们收听广播时,为了接收不同广播台的信号,就要调整 AM 或 FM,指的就是这里的调制方法。 80 | 81 | ## 通信媒介 82 | 83 | 通信媒介分为两大类: 84 | 85 | - 导引型 - 双绞线、电缆、光纤 86 | - 非导引型 - 无线、红外线、大气、激光 87 | 88 | ## 信道复用 89 | 90 | 信道复用就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输一路信号。 91 | 92 | - 频分复用 93 | - 时分复用 94 | - 波分复用 95 | - 码分复用 -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/01.Spring核心/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring 核心 3 | date: 2020-02-26 23:47:47 4 | categories: 5 | - Java 6 | - 框架 7 | - Spring 8 | - Spring核心 9 | tags: 10 | - Java 11 | - 框架 12 | - Spring 13 | - SpringBoot 14 | permalink: /pages/686be900/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # Spring 核心 20 | 21 | > 章节主要针对:Spring & Spring Boot 框架的核心技术。如;Spring Bean、IoC、依赖查找、依赖注入、AOP、数据绑定、资源管理等。 22 | 23 | ## 📖 内容 24 | 25 | - [Spring Bean](01.SpringBean.md) 26 | - [Spring IoC](02.SpringIoC.md) 27 | - [Spring 依赖查找](03.Spring依赖查找.md) 28 | - [Spring 依赖注入](04.Spring依赖注入.md) 29 | - [Spring IoC 依赖来源](05.SpringIoC依赖来源.md) 30 | - [Spring Bean 作用域](06.SpringBean作用域.md) 31 | - [Spring Bean 生命周期](07.SpringBean生命周期.md) 32 | - [Spring 配置元数据](08.Spring配置元数据.md) 33 | - [Spring AOP](10.SpringAop.md) 34 | - [Spring 资源管理](20.Spring资源管理.md) 35 | - [Spring 校验](21.Spring校验.md) 36 | - [Spring 数据绑定](22.Spring数据绑定.md) 37 | - [Spring 类型转换](23.Spring类型转换.md) 38 | - [Spring EL 表达式](24.SpringEL.md) 39 | - [Spring 事件](25.Spring事件.md) 40 | - [Spring 国际化](26.Spring国际化.md) 41 | - [Spring 泛型处理](27.Spring泛型处理.md) 42 | - [Spring 注解](28.Spring注解.md) 43 | - [SpringBoot 教程之快速入门](31.SpringBoot之快速入门.md) 44 | - [SpringBoot 之属性加载](32.SpringBoot之属性加载.md) 45 | - [SpringBoot 之 Profile](33.SpringBoot之Profile.md) 46 | 47 | ## 📚 资料 48 | 49 | - **官方** 50 | - [Spring 官网](https://spring.io/) 51 | - [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html) 52 | - [Spring Github](https://github.com/spring-projects/spring-framework) 53 | - **书籍** 54 | - [《Spring In Action》](https://item.jd.com/12622829.html) 55 | - **教程** 56 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) 57 | - [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons) 58 | - [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071) 59 | 60 | ## 🚪 传送 61 | 62 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾ -------------------------------------------------------------------------------- /source/_posts/16.大数据/Spark.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spark 简介 3 | date: 2019-05-07 20:19:25 4 | order: 01 5 | categories: 6 | - 大数据 7 | tags: 8 | - 大数据 9 | - Spark 10 | permalink: /pages/ff93bb59/ 11 | --- 12 | 13 | # Spark 14 | 15 | ## Spark 简介 16 | 17 | ### Spark 概念 18 | 19 | - 大规模分布式通用计算引擎 20 | - Spark Core:核心计算框架 21 | - Spark SQL:结构化数据查询 22 | - Spark Streaming:实时流处理 23 | - Spark MLib:机器学习 24 | - Spark GraphX:图计算 25 | - 具有高吞吐、低延时、通用易扩展、高容错等特点 26 | - 采用 Scala 语言开发 27 | - 提供多种运行模式 28 | 29 | ### Spark 特点 30 | 31 | - 计算高效 32 | - 利用内存计算、Cache 缓存机制,支持迭代计算和数据共享,减少数据读取的 IO 开销 33 | - 利用 DAG 引擎,减少中间计算结果写入 HDFS 的开销 34 | - 利用多线程池模型,减少任务启动开销,避免 Shuffle 中不必要的排序和磁盘 IO 操作 35 | - 通用易用 36 | - 适用于批处理、流处理、交互式计算、机器学习算法等场景 37 | - 提供了丰富的开发 API,支持 Scala、Java、Python、R 等 38 | - 运行模式多样 39 | - Local 模式 40 | - Standalone 模式 41 | - YARN/Mesos 模式 42 | - 计算高效 43 | - 利用内存计算、Cache 缓存机制,支持迭代计算和数据共享,减少数据读取的 IO 开销 44 | - 利用 DAG 引擎,减少中间计算结果写入 HDFS 的开销 45 | - 利用多线程池模型,减少任务启动开销,避免 Shuffle 中不必要的排序和磁盘 IO 操作 46 | - 通用易用 47 | - 适用于批处理、流处理、交互式计算、机器学习等场景 48 | - 提供了丰富的开发 API,支持 Scala、Java、Python、R 等 49 | 50 | ## Spark 原理 51 | 52 | ### 编程模型 53 | 54 | #### RDD 55 | 56 | - 弹性分布式数据集(Resilient Distributed Datesets) 57 | - 分布在集群中的只读对象集合 58 | - 由多个 Partition 组成 59 | - 通过转换操作构造 60 | - 失效后自动重构(弹性) 61 | - 存储在内存或磁盘中 62 | - Spark 基于 RDD 进行计算 63 | 64 | #### RDD 操作(Operator) 65 | 66 | - Transformation(转换) 67 | - 将 Scala 集合或 Hadoop 输入数据构造成一个新 RDD 68 | - 通过已有的 RDD 产生新 RDD 69 | - 惰性执行:只记录转换关系,不触发计算 70 | - 例如:map、filter、flatmap、union、distinct、sortbykey 71 | - Action(动作) 72 | - 通过 RDD 计算得到一个值或一组值 73 | - 真正触发计算 74 | - 例如:first、count、collect、foreach、saveAsTextFile 75 | 76 | #### RDD 依赖(Dependency) 77 | 78 | - 窄依赖(Narrow Dependency) 79 | - 父 RDD 中的分区最多只能被一个子 RDD 的一个分区使用 80 | - 子 RDD 如果有部分分区数据丢失或损坏,只需从对应的父 RDD 重新计算恢复 81 | - 例如:map、filter、union 82 | - 宽依赖(Shuffle/Wide Dependency ) 83 | - 子 RDD 分区依赖父 RDD 的所有分区 84 | - 子 RDD 如果部分或全部分区数据丢失或损坏,必须从所有父 RDD 分区重新计算 85 | - 相对于窄依赖,宽依赖付出的代价要高很多,尽量避免使用 86 | - 例如:groupByKey、reduceByKey、sortByKey -------------------------------------------------------------------------------- /source/_posts/01.Java/02.JavaEE/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: JavaEE 3 | date: 2022-02-18 08:53:11 4 | categories: 5 | - Java 6 | - JavaEE 7 | tags: 8 | - Java 9 | - JavaEE 10 | permalink: /pages/7e4834de/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # JavaEE 16 | 17 | ## 📖 内容 18 | 19 | ### JavaWeb 20 | 21 | - [JavaWeb 面经](01.JavaWeb/99.JavaWeb面经.md) 22 | - [JavaWeb 之 Servlet 指南](01.JavaWeb/01.JavaWeb之Servlet指南.md) 23 | - [JavaWeb 之 Jsp 指南](01.JavaWeb/02.JavaWeb之Jsp指南.md) 24 | - [JavaWeb 之 Filter 和 Listener](01.JavaWeb/03.JavaWeb之Filter和Listener.md) 25 | - [JavaWeb 之 Cookie 和 Session](01.JavaWeb/04.JavaWeb之Cookie和Session.md) 26 | 27 | ### Java 服务器 28 | 29 | > Tomcat 和 Jetty 都是 Java 比较流行的轻量级服务器。 30 | > 31 | > Nginx 是目前最流行的反向代理服务器,也常用于负载均衡。 32 | 33 | - [Tomcat 快速入门](02.服务器/01.Tomcat/01.Tomcat快速入门.md) 34 | - [Tomcat 连接器](02.服务器/01.Tomcat/02.Tomcat连接器.md) 35 | - [Tomcat 容器](02.服务器/01.Tomcat/03.Tomcat容器.md) 36 | - [Tomcat 优化](02.服务器/01.Tomcat/04.Tomcat优化.md) 37 | - [Tomcat 和 Jetty](02.服务器/01.Tomcat/05.Tomcat和Jetty.md) 38 | - [Jetty](02.服务器/02.Jetty.md) 39 | 40 | ## 📚 资料 41 | 42 | - **JavaWeb** 43 | - **书籍** 44 | - [Java Web 整合开发王者归来](https://book.douban.com/subject/4189495/) 45 | - [Head First Servlets & JSP](https://book.douban.com/subject/1942934/) 46 | - **教程** 47 | - [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701) 48 | - [Servlet 教程](https://www.runoob.com/servlet/servlet-tutorial.html) 49 | - [博客园孤傲苍狼 JavaWeb 学习总结](https://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/) 50 | - [JSP 教程](https://www.runoob.com/jsp/jsp-tutorial.html) 51 | - **服务器** 52 | - [Tomcat 官网](http://tomcat.apache.org/) 53 | - [Jetty 官网](http://www.eclipse.org/jetty/index.html) 54 | - [Jetty Github](https://github.com/eclipse/jetty.project) 55 | - [Nginx 官网](https://www.nginx.com/) 56 | - [Nginx 的中文维基](http://tool.oschina.net/apidocs/apidoc?api=nginx-zh) 57 | - [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701) 58 | 59 | ## 🚪 传送 60 | 61 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/07.搜索引擎数据库/elastic/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Elastic 技术栈 3 | date: 2022-04-11 16:52:35 4 | categories: 5 | - 数据库 6 | - 搜索引擎数据库 7 | - elastic 8 | tags: 9 | - 数据库 10 | - 搜索引擎数据库 11 | - elastic 12 | permalink: /pages/650443ac/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # Elastic 技术栈 18 | 19 | > **Elastic 技术栈通常被用来作为日志采集、检索、可视化的解决方案。** 20 | > 21 | > ELK 是 elastic 公司旗下三款产品 [Elasticsearch](https://www.elastic.co/elasticsearch) 、[Logstash](https://www.elastic.co/products/logstash) 、[Kibana](https://www.elastic.co/kibana) 的首字母组合。 22 | > 23 | > [Logstash](https://www.elastic.co/products/logstash) 传输和处理你的日志、事务或其他数据。 24 | > 25 | > [Kibana](https://www.elastic.co/kibana) 将 Elasticsearch 的数据分析并渲染为可视化的报表。 26 | > 27 | > Elastic 技术栈,在 ELK 的基础上扩展了一些新的产品,如:[Beats](https://www.elastic.co/products/beats) 、[X-Pack](https://www.elastic.co/products/x-pack) 。 28 | 29 | ## 📖 内容 30 | 31 | - [Elastic](Elastic.md) 32 | - [Kibana](Kibana.md) 33 | - [Logstash](Logstash.md) 34 | - [Filebeat](Filebeat.md) 35 | 36 | ## 📚 资料 37 | 38 | - **官方** 39 | - [Logstash 官网](https://www.elastic.co/cn/products/logstash) 40 | - [Logstash Github](https://github.com/elastic/logstash) 41 | - [Logstash 官方文档](https://www.elastic.co/guide/en/logstash/current/index.html) 42 | - [Kibana 官网](https://www.elastic.co/cn/products/kibana) 43 | - [Kibana Github](https://github.com/elastic/kibana) 44 | - [Kibana 官方文档](https://www.elastic.co/guide/en/kibana/current/index.html) 45 | - [Beats 官网](https://www.elastic.co/cn/products/beats) 46 | - [Beats Github](https://github.com/elastic/beats) 47 | - [Beats 官方文档](https://www.elastic.co/guide/en/beats/libbeat/current/index.html) 48 | - **第三方工具** 49 | - [logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) 50 | - **文章** 51 | - [Elasticsearch+Logstash+Kibana 教程](https://www.cnblogs.com/xing901022/p/4704319.html) 52 | - [ELK(Elasticsearch、Logstash、Kibana)安装和配置](https://github.com/judasn/Linux-Tutorial/blob/master/ELK-Install-And-Settings.md) 53 | 54 | ## 🚪 传送 55 | 56 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/13.网络/01.网络综合/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 网络综合 3 | date: 2020-04-27 10:56:00 4 | categories: 5 | - 网络 6 | - 网络综合 7 | tags: 8 | - 网络 9 | permalink: /pages/e8e40dc6/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # 网络综合 15 | 16 | > 理解计算机网络,首先需要从宏观层面了解计算机网络通信的分层结构。最有代表性的是 OSI 七层结构模型,但现实中更流行的是五层结构模型。 17 | > 18 | > 了解网络分层结构,需要了解每个网络层级在网络通信中的定位,以及这个层级主要的通信设备、通信协议。 19 | 20 | ## 📖 内容 21 | 22 | - [计算机网络面试总结](01.计算机网络面试.md) 23 | - [计算机网络指南](02.计算机网络指南.md) - 关键词:核心概念、拓扑结构、作用范围、性能指标、体系结构 24 | - **网络分层** 25 | - [计算机网络之物理层](11.物理层.md) - 关键词:调制、解调、数字信号、模拟信号、通信媒介、信道复用 26 | - [计算机网络之数据链路层](12.数据链路层.md) - 关键词:点对点信道、广播信道、`PPP`、`CSMA/CD`、局域网、以太网、`MAC`、适配器、集线器、网桥、交换机 27 | - [计算机网络之网络层](13.网络层.md) - 关键词:`IP`、`ICMP`、`ARP`、路由 28 | - [计算机网络之传输层](14.传输层.md) - 关键词:`UDP`、`TCP`、滑动窗口、拥塞控制、三次握手 29 | - [计算机网络之应用层](15.应用层.md) - 关键词:`HTTP`、`DNS`、`FTP`、`TELNET`、`DHCP` 30 | 31 | ## 📚 资料 32 | 33 | - **书籍** 34 | - [TCP/IP 详解 卷 1:协议](https://book.douban.com/subject/1088054/) - TCP/IP 红宝书,经典中的经典 35 | - [TCP/IP 详解 卷 2:实现](https://book.douban.com/subject/1087767/) - TCP/IP 红宝书,经典中的经典 36 | - [TCP/IP 详解 卷 3:TCP 事务协议、HTTP、NNTP 和 UNIX 域协议](https://book.douban.com/subject/1058634/) - TCP/IP 红宝书,经典中的经典 37 | - [Web 性能权威指南](https://book.douban.com/subject/25856314/) 38 | - [HTTP 权威指南](https://book.douban.com/subject/10746113/) 39 | - [图解 HTTP](https://book.douban.com/subject/25863515/) 40 | - [图解 TCP/IP](https://book.douban.com/subject/24737674/) 41 | - [计算机网络(第 7 版)](https://book.douban.com/subject/26960678/) - 国内大学计算机专业经典教材 42 | - **教程** 43 | - [Computer Network Tutorials](https://www.geeksforgeeks.org/computer-network-tutorials/) 44 | - **RFC** 45 | - https://www.rfc-editor.org/ - 在线查阅、下载 RFC 文档 46 | - **DNS** 47 | - [RFC 1034 DOMAIN NAMES - CONCEPTS AND FACILITIES](https://tools.ietf.org/html/rfc1034) - DNS 最核心 RFC 48 | - [RFC 1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION](https://tools.ietf.org/html/rfc1035) - DNS 最核心 RFC 49 | - **工具** 50 | - [WireShark](https://www.wireshark.org/) 51 | - [Postman](https://www.getpostman.com/) 52 | 53 | ## 🚪 传送 54 | 55 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/96.工作/01.效能/02.规范/02.目录管理规范.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 个人目录管理规范 3 | date: 2018-12-11 10:23:22 4 | order: 02 5 | categories: 6 | - 工作 7 | - 效能 8 | - 规范 9 | tags: 10 | - 效率提升 11 | - 规范 12 | permalink: /pages/d7f2c4f6/ 13 | --- 14 | 15 | # 个人目录管理规范 16 | 17 | > 作为程序员,想必每个人都会有大量的资料、数据。按照条理清晰的目录结构去分类化存储,十分有助于管理文件。 18 | 19 | ## 目录结构 20 | 21 | 以下是我个人整理的目录结构: 22 | 23 | ``` 24 | . 25 | ├── Codes #代码目录 26 | │ ├── Other #第三方代码目录 27 | │ ├── My #个人代码目录 28 | │ └── Work #工作代码目录 29 | ├── Data #数据目录 30 | ├── Downloads #下载文件目录 31 | ├── Docs #文档目录 32 | │ ├── Books #电子书目录 33 | │ ├── My #个人文档目录 34 | │ └── Work #工作文档目录 35 | ├── Movies #视频目录 36 | ├── Music #音乐目录 37 | ├── Pictures #图片目录 38 | ├── Public #共享目录 39 | ├── Temp #临时文件目录 40 | └── Tools #工具软件目录 41 | └── Packages #安装包目录 42 | ``` 43 | 44 | 注:如果您使用的操作系统是 Mac 这种可以为目录或文件添加 tag 的操作系统,那么您可以根据自己的喜好更细致化的管理。 45 | 46 | ## 2. 文件管理软件 47 | 48 | > 选用便利的文件管理软件,可以让你的文件管理如虎添翼。这里推荐几款经典的文件管理工具。 49 | 50 | ### 2.1. Clover 51 | 52 | > [Clover](http://cn.ejie.me/) 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能。 53 | 54 |
55 | 56 |
57 | 58 | ### 2.2. Everything 59 | 60 | > [Everything](http://www.voidtools.com/) 可以立即在 windows 系统中找到制定名称的文件和文件夹。 61 | 62 |
63 | 64 |
65 | 66 | ### 2.3. Wox 67 | 68 | > [Wox](https://github.com/Wox-launcher/Wox) 是一款简单易用的 Windows 启动器。可以把它视为 windows 版的 Alfred。 69 | 70 |
71 | 72 |
73 | 74 | ### 2.4. Q-dir 75 | 76 | > [Q-dir](http://www.softpedia.com/get/File-managers/Q-Dir.shtml) 是轻量的文件管理器,特点鲜明,各种布局视图切换灵活,默认四个小窗口组成一个大窗口,操作快捷。 77 | 78 |
79 | 80 |
-------------------------------------------------------------------------------- /source/_posts/15.分布式/21.分布式通信/02.MQ/02.RocketMQ/RocketMQFaq.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: RocketMQ FAQ 3 | date: 2022-07-12 07:49:48 4 | order: 99 5 | categories: 6 | - 分布式 7 | - 分布式通信 8 | - MQ 9 | - RocketMQ 10 | tags: 11 | - Java 12 | - 中间件 13 | - MQ 14 | - RocketMQ 15 | permalink: /pages/d101fb71/ 16 | --- 17 | 18 | # RocketMQ FAQ 19 | 20 | ## API 问题 21 | 22 | ### connect to `<172.17.0.1:10909>` failed 23 | 24 | 启动后,Producer 客户端连接 RocketMQ 时报错: 25 | 26 | ```java 27 | org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.0.1:10909> failed 28 | at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:357) 29 | at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:343) 30 | at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:327) 31 | at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:290) 32 | at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:688) 33 | at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendSelectImpl(DefaultMQProducerImpl.java:901) 34 | at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:878) 35 | at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:873) 36 | at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:369) 37 | at com.emrubik.uc.mdm.sync.utils.MdmInit.sendMessage(MdmInit.java:62) 38 | at com.emrubik.uc.mdm.sync.utils.MdmInit.main(MdmInit.java:2149) 39 | ``` 40 | 41 | 原因:RocketMQ 部署在虚拟机上,内网 ip 为 10.10.30.63,该虚拟机一个 docker0 网卡,ip 为 172.17.0.1。RocketMQ broker 启动时默认使用了 docker0 网卡,Producer 客户端无法连接 172.17.0.1,造成以上问题。 42 | 43 | 解决方案 44 | 45 | (1)干掉 docker0 网卡或修改网卡名称 46 | 47 | (2)停掉 broker,修改 broker 配置文件,重启 broker。 48 | 49 | 修改 conf/broker.conf,增加两行来指定启动 broker 的 IP: 50 | 51 | ``` 52 | namesrvAddr = 10.10.30.63:9876 53 | brokerIP1 = 10.10.30.63 54 | ``` 55 | 56 | 启动时需要指定配置文件 57 | 58 | ```bash 59 | nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf & 60 | ``` -------------------------------------------------------------------------------- /source/_posts/11.算法/图.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 图 3 | date: 2015-03-24 15:31:13 4 | order: 05 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构和算法 9 | - 图 10 | permalink: /pages/7336978b/ 11 | --- 12 | 13 | # 图 14 | 15 | 在计算机科学中,一个图就是一些*顶点*的集合,这些顶点通过一系列*边*结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。 16 | 17 | ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/data-structure/graph/graph.png) 18 | 19 | ## 什么是图 20 | 21 | - **阶(Order)** - 图 G 中点集 V 的大小称作图 G 的阶。 22 | - **子图(Sub-Graph)** - 当图 G'=(V',E')其中 V‘包含于 V,E’包含于 E,则 G'称作图 G=(V,E)的子图。每个图都是本身的子图。 23 | - 生成子图(Spanning Sub-Graph) - 指满足条件 V(G') = V(G)的 G 的子图 G'。 24 | - 导出子图(Induced Subgraph) - 以图 G 的顶点集 V 的[非空子集](https://baike.baidu.com/item/%E9%9D%9E%E7%A9%BA%E5%AD%90%E9%9B%86/10180460)V1 为顶点集,以两端点均在 V1 中的全体边为边集的 G 的子图,称为 V1 导出的导出子图;以图 G 的边集 E 的非空子集 E1 为边集,以 E1 中边关联的顶点的全体为顶点集的 G 的子图,称为 E1 导出的导出子图。 25 | - **有向图** - 如果给图的每条边规定一个方向,那么得到的图称为有向图。 26 | - **无向图** - 边没有方向的图称为无向图。 27 | - **度(Degree)** - 一个顶点的度是指与该顶点相关联的边的条数,顶点 v 的度记作 d(v)。 28 | - **入度(In-degree)**和**出度(Out-degree)** - 对于有向图来说,一个顶点的度可细分为入度和出度。一个顶点的入度是指与其关联的各边之中,以其为终点的边数;出度则是相对的概念,指以该顶点为起点的边数。 29 | - **自环(Loop)** - 若一条边的两个顶点为同一顶点,则此边称作自环。 30 | - 路径(Path) - 从 u 到 v 的一条路径是指一个序列 v0,e1,v1,e2,v2,...ek,vk,其中 ei 的顶点为 vi 及 vi - 1,k 称作路径的长度。如果它的起止顶点相同,该路径是“闭”的,反之,则称为“开”的。一条路径称为一简单路径(simple path),如果路径中除起始与终止[顶点](https://baike.baidu.com/item/%E9%A1%B6%E7%82%B9)可以重合外,所有顶点两两不等。 31 | - **行迹(Trace)** - 如果路径 P(u,v)中的边各不相同,则该路径称为 u 到 v 的一条行迹。闭的行迹称作回路(Circuit)。 32 | - **轨迹(Track)** - 如果路径 P(u,v)中的顶点各不相同,则该路径称为 u 到 v 的一条轨迹。闭的轨迹称作圈(Cycle)。 33 | - **桥(Bridge)** - 若去掉一条边,便会使得整个图不连通,该边称为[桥](https://baike.baidu.com/item/%E6%A1%A5)。 34 | 35 | 如果图的边没有方向性,则被成为无向图。 36 | 37 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220314093554.jpg) 38 | 39 | ## 图的基本操作 40 | 41 | - 创建一个图结构 - CreateGraph(G) 42 | - 检索给定顶点 - LocateVex(G,elem) 43 | - 获取图中某个顶点 - GetVex(G,v) 44 | - 为图中顶点赋值 - PutVex(G,v,value) 45 | - 返回第一个邻接点 - FirstAdjVex(G,v) 46 | - 返回下一个邻接点 - NextAdjVex(G,v,w) 47 | - 插入一个顶点 - InsertVex(G,v) 48 | - 删除一个顶点 - DeleteVex(G,v) 49 | - 插入一条边 - InsertEdge(G,v,w) 50 | - 删除一条边 - DeleteEdge(G,v,w) 51 | - 遍历图 - Traverse(G,v) 52 | 53 | ## 参考资料 54 | 55 | - [数据结构与算法之美](https://time.geekbang.org/column/intro/100017301) -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/05.并发/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 并发 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - 并发 8 | tags: 9 | - Java 10 | - JavaCore 11 | - 并发 12 | permalink: /pages/deea6eca/ 13 | hidden: true 14 | index: false 15 | dir: 16 | order: 5 17 | link: true 18 | --- 19 | 20 | # Java 并发 21 | 22 | > Java 并发总结、整理 Java 并发编程相关知识点。 23 | > 24 | > 并发编程并非 Java 语言所独有,而是一种成熟的编程范式,Java 只是用自己的方式实现了并发工作模型。学习 Java 并发编程,应该先熟悉并发的基本概念,然后进一步了解并发的特性以及其特性所面临的问题。掌握了这些,当学习 Java 并发工具时,才会明白它们各自是为了解决什么问题,为什么要这样设计。通过这样由点到面的学习方式,更容易融会贯通,将并发知识形成体系化。 25 | 26 | ## 📖 内容 27 | 28 | - [Java 并发简介](Java_并发_简介.md) - 关键词:并发、线程、安全性、活跃性、性能、死锁、活锁 29 | - [Java 并发之内存模型](Java_并发_内存模型.md) - 关键词:JMM、Happens-Before、内存屏障、volatile、synchronized、final、指令重排序 30 | - [Java 并发之线程](Java_并发_线程.md) - 关键词:Thread、Runnable、Callable、Future、FutureTask、线程生命周期 31 | - [Java 并发之锁](Java_并发_锁.md) - 关键词:锁、Lock、Condition、ReentrantLock、ReentrantReadWriteLock、StampedLock 32 | - [Java 并发之无锁](Java_并发_无锁.md) - 关键词:CAS、ThreadLocal、Immutability、Copy-on-Write 33 | - [Java 并发之 AQS](Java_并发_AQS.md) - 关键词:AQS、独占锁、共享锁 34 | - [Java 并发之容器](Java_并发_容器.md) - 关键词:ConcurrentHashMap、CopyOnWriteArrayList 35 | - [Java 并发之线程池](Java_并发_线程池.md) - 关键词:Executor、ExecutorService、ThreadPoolExecutor、Executors 36 | - [Java 并发之同步工具](Java_并发_同步工具.md) - 关键词:Semaphore、CountDownLatch、CyclicBarrier 37 | - [Java 并发之分工工具](Java_并发_分工工具.md) - 关键词:FutureTask、CompletableFuture、CompletionStage、CompletionService、ForkJoinPool 38 | 39 | ## 📚 资料 40 | 41 | - [《Java 并发编程实战》](https://book.douban.com/subject/10484692/) 42 | - [《Java 并发编程的艺术》](https://book.douban.com/subject/26591326/) 43 | - [《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/) 44 | - [《Effective Java》](https://book.douban.com/subject/30412517/) 45 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 46 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) 47 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.geekbang.org/column/intro/100047701) 48 | - [极客时间教程 - Java 并发编程实战](https://time.geekbang.org/column/intro/100023901) 49 | 50 | ## 🚪 传送 51 | 52 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/02.高级特性/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 高级 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - 高级特性 8 | tags: 9 | - Java 10 | - JavaCore 11 | permalink: /pages/515e9ef6/ 12 | hidden: true 13 | index: false 14 | dir: 15 | order: 2 16 | link: true 17 | --- 18 | 19 | # Java 高级特性 20 | 21 | > Java 高级总结 Java 的一些高级特性。 22 | 23 | ## 📖 内容 24 | 25 | - [Java 正则](Java_正则.md) - 关键词:Pattern、Matcher、捕获与非捕获、反向引用、零宽断言、贪婪与懒惰、元字符、DFA、NFA 26 | - [Java 编码和加密](Java_编码和加密.md) - 关键词:Base64、消息摘要、数字签名、对称加密、非对称加密、MD5、SHA、HMAC、AES、DES、DESede、RSA 27 | - [Java 国际化](Java_国际化.md) - 关键词:Locale、ResourceBundle、NumberFormat、DateFormat、MessageFormat 28 | - [Java JDK8](Java_JDK8.md) - 关键词:Stream、lambda、Optional、@FunctionalInterface 29 | - [Java SPI](Java_SPI.md) - 关键词:SPI、ClassLoader 30 | - [JavaAgent](Java_Agent.md) 31 | 32 | ## 📚 资料 33 | 34 | - Java 综合 35 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.geekbang.org/column/intro/100047701) - 极客时间教程——基于 Java 生产环境的真实案例,讲解“避坑”的手段,很硬核 36 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) - 极客时间教程——覆盖 80% 以上 Java 应用调优场景 37 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) - 极客时间教程——从面试官视角梳理如何解答常见 Java 面试问题 38 | - [CS-Notes](https://github.com/CyC2018/CS-Notes) - Github 上的 Java 基础级面试教程,行文清晰简洁 39 | - [JavaGuide](https://github.com/Snailclimb/JavaGuide) - Github 上的 Java 面试教程,Java 基础部分讲解较为细致 40 | - [advanced-java](https://github.com/doocs/advanced-java) - Github 上的 Java 面试教程,分布式部分从面试官视角讲解核心考察点 41 | - Java 基础 42 | - [《Java 编程思想》](https://book.douban.com/subject/2130190/) - Thinking in java,典中典!由于成书较早,部分内容已经多少有点过时 43 | - [《Java 核心技术 卷 I 开发基础》](https://book.douban.com/subject/35920145/) - 第 12 版,涵盖 Java 17 的新特性 44 | - [《Java 核心技术 卷 II 高级特性》](https://book.douban.com/subject/36337685/) - 第 12 版,涵盖 Java 17 的新特性 45 | - [《Head First Java》](https://book.douban.com/subject/2000732/) - 图文并茂,对新手非常友好的入门级教程 46 | - [《疯狂 Java 讲义》](https://book.douban.com/subject/3246499/) - 入门级教程 47 | - [Runoob Java 教程](https://www.runoob.com/java/java-tutorial.html) - 入门级在线教程 48 | 49 | ## 🚪 传送 50 | 51 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/00.笔记/15.分布式/22.分布式存储/hbase-a-nosql-database.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 《HBase A NoSQL database》笔记 3 | date: 2023-09-05 19:52:01 4 | order: 01 5 | categories: 6 | - 笔记 7 | - 分布式 8 | - 分布式存储 9 | tags: 10 | - 分布式 11 | - 分布式存储 12 | - HBASE 13 | permalink: /pages/d47e4b60/ 14 | --- 15 | 16 | # 《HBase: A NoSQL database》笔记 17 | 18 | ## 简介 19 | 20 | HBase 是一种 NoSQL 数据库,它是Java版本的 Google’s Big Table 实现,它原本是 Hadoop 的子项目,现在已独立出来,并成为 apache 的顶级项目。 21 | 22 | HBase 的设计目标是用于存储大规模数据集。HBase 是列式数据库,与传统行式数据库相比,其非常适合用于存储稀疏性的数据。 23 | 24 | HBase 是基于 HDFS 实现的。 25 | 26 | ## HBase 和历史 27 | 28 | HBase 关键特性: 29 | 30 | - 水平扩展 31 | - 分区容错性 32 | - 支持并行处理 33 | - 支持 HDFS 和 MapReduce 34 | - 近实时查询 35 | - 适用于存储大规模数据集 36 | - 适用于存储稀疏型数据(宽表) 37 | - 表的动态负载均衡 38 | - 对于大规模的查询,支持块缓存和布隆过滤器 39 | 40 | HBase 发展历史 41 | 42 | 2007 - Mike Cafarella 发布 BigTable 的开源实现——HBase 43 | 44 | 2008 ~ 2010 - HBase 成为 Apache 顶级项目。 45 | 46 | ## HBase 数据结构和架构 47 | 48 | HBase 表可以用于 MapReduce 任务的输入、输出对象。 49 | 50 | HBase 由行、列族、列、时间戳组成。 51 | 52 | HBase 表会被分成多个分区,每个分区会定义起始key、结束key。它们被存于 HDFS 文件中。 53 | 54 | HBase 的架构通常为一个 master server,多个 region server,以及 ZooKeeper 集群。 55 | 56 | - **master server** 57 | - 在 ZooKeeper 的帮助下,为分区分配 region server,控制 region server 的负载均衡。 58 | - 负责 schema 的变更 59 | - 管理和监控 Hadoop 集群 60 | - **region server** 61 | - region server 负责处理来自客户端的 CRUD 操作 62 | - region server 包括内存存储和 HFile 63 | - region server 运行在 HDFS 的数据节点上 64 | - region server 有四个核心组件:Block cache(读缓存)、MemStore(写缓存)、WAL、HFile(存储行数据,键值对结构) 65 | - Zookeeper 66 | - 当 region server 宕机并重新工作时,HBase 会使用 ZooKeeper 作为协调工具,对其进行恢复 67 | - Zookeeper 是客户端和 master server 的中心,它维护着 master server 和 region server 注册的元数据信息。例如:有多少有效的 region server;任意 region server 持有哪些 data node 68 | - ZooKeeper 可以用于追踪服务器错误 69 | 70 | ## HBase 和大数据 71 | 72 | HBase 相比于其他 NoSQL,最显著的优势在于,它属于 Hadoop 生态体系中的重要一环,被广泛用于大数据领域。但是,近些年,有 MongoDB、Cassandra 等一些数据库挑战着其地位。 73 | 74 | ## HBase 的应用 75 | 76 | Facebook 的消息平台使用 HBase 存储数据,每月产生约 13.5 亿条信息。 77 | 78 | HBase 还被用于存储各种海量操作数据。 79 | 80 | ## HBase 的挑战和限制 81 | 82 | HBase 采用主从架构,一旦 master server 不可用,需要很长时间才能恢复。 83 | 84 | HBase 不支持二级索引。 85 | 86 | ## 参考资料 87 | 88 | - [HBase: A NoSQL Database](https://www.researchgate.net/publication/317399857_HBase_A_NoSQL_Database) -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 软件 3 | date: 2022-02-18 08:53:11 4 | categories: 5 | - Java 6 | - 软件 7 | tags: 8 | - Java 9 | permalink: /pages/f8ce3054/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # Java 软件 15 | 16 | > 本部分内容主要是 Java 开发领域使用的一些 Java 软件,如构建工具、IDE、服务器、日志中心等等。 17 | 18 | ## 📖 内容 19 | 20 | ### 构建 21 | 22 | > Java 项目需要通过 [**构建工具**](01.构建) 来管理项目依赖,完成编译、打包、发布、生成 JavaDoc 等任务。 23 | > 24 | > - 目前最主流的构建工具是 Maven,它的功能非常强大。 25 | > - Gradle 号称是要替代 Maven 等构件工具,它的版本管理确实简洁,但是需要学习 Groovy,学习成本比 Maven 高。 26 | > - Ant 功能比 Maven 和 Gradle 要弱,现代 Java 项目基本不用了,但也有一些传统的 Java 项目还在使用。 27 | 28 | - [Maven](01.构建/01.Maven) 📚 29 | - [Maven 快速入门](01.构建/01.Maven/01.Maven快速入门.md) 30 | - [Maven 教程之 pom.xml 详解](01.构建/01.Maven/02.Maven教程之pom.xml详解.md) 31 | - [Maven 教程之 settings.xml 详解](01.构建/01.Maven/03.Maven教程之settings.xml详解.md) 32 | - [Maven 实战问题和最佳实践](01.构建/01.Maven/04.Maven实战问题和最佳实践.md) 33 | - [Maven 教程之发布 jar 到私服或中央仓库](01.构建/01.Maven/05.Maven教程之发布jar到私服或中央仓库.md) 34 | - [Maven 插件之代码检查](01.构建/01.Maven/06.Maven插件之代码检查.md) 35 | - [Ant 简易教程](01.构建/02.Ant.md) 36 | 37 | ### IDE 38 | 39 | > 自从有了 [**IDE**](02.IDE),写代码从此就告别了刀耕火种的蛮荒时代。 40 | > 41 | > - [Eclipse](02.IDE/02.Eclipse.md) 是久负盛名的开源 Java IDE,我的学生时代一直使用它写 Java。 42 | > - 曾经抗拒从转 [Intellij Idea](02.IDE/01.Intellij.md) ,但后来发现真香,不得不说,确实是目前最优秀的 Java IDE。 43 | > - 你可以在 [vscode](02.IDE/03.VsCode.md) 中写各种语言,只要安装相应插件即可。如果你的项目中使用了很多种编程语言,又懒得在多个 IDE 之间切换,那么就用 vscode 来一网打尽吧。 44 | 45 | - [Intellij Idea](02.IDE/01.Intellij.md) 46 | - [Eclipse](02.IDE/02.Eclipse.md) 47 | - [vscode](02.IDE/03.VsCode.md) 48 | 49 | ### 监控诊断 50 | 51 | > [监控/诊断](03.监控诊断) 工具主要用于 Java 应用的运维。通过采集、分析、存储、可视化应用的有效数据,帮助开发者、使用者快速定位问题,找到性能瓶颈。 52 | 53 | - [监控工具对比](03.监控诊断/01.监控工具对比.md) 54 | - [CAT](03.监控诊断/02.CAT.md) 55 | - [Zipkin](03.监控诊断/03.Zipkin.md) 56 | - [SkyWalking](03.监控诊断/04.Skywalking.md) 57 | - [Arthas](03.监控诊断/05.Arthas.md) 58 | 59 | ## 📚 资料 60 | 61 | - **官网** 62 | - [Maven Github](https://github.com/apache/maven) 63 | - [Maven 官方文档](https://maven.apache.org/ref/current) 64 | - [Ant 官方手册](http://ant.apache.org/manual/index.html) 65 | - **书籍** 66 | - [《Maven 实战》](https://book.douban.com/subject/5345682/) 67 | 68 | ## 🚪 传送 69 | 70 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/03.监控诊断/04.Skywalking.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: SkyWalking 快速入门 3 | date: 2020-02-07 23:04:47 4 | order: 04 5 | categories: 6 | - Java 7 | - 软件 8 | - 监控诊断 9 | tags: 10 | - Java 11 | - 监控 12 | - SkyWalking 13 | permalink: /pages/55de5c6d/ 14 | --- 15 | 16 | # SkyWalking 快速入门 17 | 18 | SkyWalking 是一个基于 Java 开发的分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 19 | 20 | ## 一、SkyWalking 简介 21 | 22 | SkyWalking 是观察性分析平台和应用性能管理系统。 23 | 24 | 提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。 25 | 26 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211152235.png) 27 | 28 | ### SkyWalking 特性 29 | 30 | - 多种监控手段,语言探针和 service mesh 31 | - 多语言自动探针,Java,.NET Core 和 Node.JS 32 | - 轻量高效,不需要大数据 33 | - 模块化,UI、存储、集群管理多种机制可选 34 | - 支持告警 35 | - 优秀的可视化方案 36 | 37 | ### SkyWalking 核心概念 38 | 39 | - **Service** - 服务。代表一组为传入请求提供相同的行为的工作负载。 使用代理或 SDK 时,可以定义服务名称。 40 | - **Service Instance** - 服务实例。服务组中的每个工作负载都称为一个实例。就像 Kubernetes 中的 Pod 一样,它在 OS 中不必是单个进程。 41 | - **Endpoint** - 端点。它是特定服务中用于传入请求的路径,例如 HTTP URI 路径或 RPC 服务类+方法签名。 42 | 43 | ## 二、SkyWalking 架构 44 | 45 | 从逻辑上讲,SkyWalking 分为四个部分:探针(Probes),平台后端,存储和 UI。 46 | 47 | ![SkyWalking 架构](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211153516.png) 48 | 49 | - **探针(Probes)** - 探针是指集成到目标系统中的代理或 SDK 库。它们负责收集数据(包括跟踪数据和统计数据)并将其按照 SkyWalking 的要求重新格式化为。 50 | - **平台后端** - 平台后端是一个提供后端服务的集群。它用于聚合、分析和驱动从探针到 UI 的流程。它还为传入格式(如 Zipkin 的格式),存储实现程序和集群管理提供可插入功能。 您甚至可以使用 Observability Analysis Language 自定义聚合和分析。 51 | - **存储** - 您可以选择一个 SkyWalking 已实现的存储,如由 Sharding-Sphere 管理的 ElasticSearch,H2 或 MySQL 集群,也可以自行实现一个存储。 52 | - **UI** - 用户界面很酷,对于 SkyWalking 最终用户而言非常强大。它也可以自定义以匹配您的自定义后端。 53 | 54 | ## 三、SkyWalking 安装 55 | 56 | 进入 [Apache SkyWalking 官方下载页面](http://skywalking.apache.org/downloads/),选择安装版本,下载解压到本地。 57 | 58 | ![SkyWalking 组件](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211154612.png) 59 | 60 | 安装分为三个部分: 61 | 62 | - [Backend setup document](https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-setup.md) 63 | - [UI setup document](https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/ui-setup.md) 64 | - [CLI set up document](https://github.com/apache/skywalking-cli) 65 | 66 | ## 参考资料 67 | 68 | - [SkyWalking Github](https://github.com/apache/skywalking) -------------------------------------------------------------------------------- /source/_posts/15.分布式/00.分布式综合/拜占庭将军问题.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 拜占庭将军问题 3 | date: 2021-11-08 08:15:33 4 | categories: 5 | - 分布式 6 | - 分布式综合 7 | tags: 8 | - 分布式 9 | - 共识 10 | permalink: /pages/3b069c65/ 11 | --- 12 | 13 | # 拜占庭将军问题 14 | 15 | > 拜占庭将军问题是由[莱斯利·兰波特](https://zh.wikipedia.org/wiki/莱斯利·兰波特)在其同名论文中提出的[分布式对等网络](https://zh.wikipedia.org/wiki/对等网络)通信容错问题。其实是借拜占庭将军的例子,抛出了分布式共识性问题,并探讨和论证了解决的方法。 16 | > 17 | > 在[分布式计算](https://zh.wikipedia.org/wiki/分布式計算)中,不同的节点通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候,系统中的节点可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论,从而破坏系统一致性。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。 18 | 19 | ## 问题描述 20 | 21 | 一群拜占庭将军各领一支军队共同围困一座城市。 22 | 23 | 为了简化问题,军队的行动策略只有两种:**进攻**(Attack,后面简称 A)或 **撤退**(Retreat,后面简称 R)。如果这些军队不是统一进攻或撤退,就可能因兵力不足导致失败。因此,**将军们通过投票来达成一致策略:同进或同退**。 24 | 25 | 因为将军们分别在城市的不同方位,所以他们只能**通过信使互相联系**。在投票过程中,**每位将军都将自己的投票信息(A 或 R)通知其他所有将军**,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以分析出共同的投票结果而决定行动策略。 26 | 27 | 这个抽象模型的问题在于:**将军中可能存在叛徒,他们不仅会发出误导性投票,还可能选择性地发送投票信息**。 28 | 29 | 由于将军之间需要通过信使通讯,叛变将军可能通过伪造信件来以其他将军的身份发送假投票。而即使在保证所有将军忠诚的情况下,也不能排除信使被敌人截杀,甚至被敌人间谍替换等情况。因此很难通过保证人员可靠性及通讯可靠性来解决问题。 30 | 31 | 假使那些忠诚(或是没有出错)的将军仍然能通过多数决定来决定他们的战略,便称达到了拜占庭容错。在此,票都会有一个默认值,若消息(票)没有被收到,则使用此默认值来投票。 32 | 33 | 上述的故事可以映射到分布式系统中,_将军代表分布式系统中的节点;信使代表通信系统;叛徒代表故障或异常_。 34 | 35 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20210704104211.png) 36 | 37 | ## 问题分析 38 | 39 | > 兰伯特针对拜占庭将军问题,给出了两个解决方案:口头协议和书面协议。 40 | > 41 | > 本文介绍一下口头协议。 42 | 43 | 在口头协议中,拜占庭将军问题被简化为**将军 - 副官**模型,其核心规则如下: 44 | 45 | - 忠诚的副官遵守同一命令。 46 | - 若将军是忠诚的,所有忠诚的副官都执行他的命令。 47 | - **如果叛徒人数为 m,将军人数不能少于 3m + 1** ,那么拜占庭将军问题就能解决了。——关于这个公式,可以不必深究,如果对推导过程感兴趣,可以参考论文。 48 | 49 | **示例一、叛徒人数为 1,将军人数为 3** 50 | 51 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202310200748580.png) 52 | 53 | 这个示例中,将军人数不满足 3m + 1,无法保证忠诚的副官都执行将军的命令。 54 | 55 | **示例二、叛徒人数为 1,将军人数为 4** 56 | 57 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202310200748488.png) 58 | 59 | 这个示例中,将军人数满足 3m + 1,无论是副官中有叛徒,还是将军是叛徒,都能保证忠诚的副官执行将军的命令。 60 | 61 | ## 参考资料 62 | 63 | - [Wiki - 拜占庭将军问题](https://zh.wikipedia.org/wiki/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98) 64 | - [拜占庭将军问题视频讲解](https://www.bilibili.com/video/av78588312/) - 李永乐老师讲解的通俗易懂 65 | - [The Byzantine Generals Problem](https://lamport.azurewebsites.net/pubs/byz.pdf) -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/00.综合/09.系统测试架构.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 系统测试架构 3 | date: 2019-12-10 17:00:00 4 | order: 09 5 | categories: 6 | - 设计 7 | - 架构 8 | - 综合 9 | tags: 10 | - 架构 11 | - 设计 12 | - 测试 13 | permalink: /pages/a32bd53e/ 14 | --- 15 | 16 | # 系统测试架构 17 | 18 | > 软件测试描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 19 | > 20 | > 现代软件开发项目中,分工明确,基本上都会有研发、测试、QA 等角色。不同角色由于关注的视角不同,测试目标和测试方法也不完全相同。本文主要从研发、测试的视角去考量软件测试技术。 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 | - **单元测试(Unit Test)** - 在最低粒度的功能/参数上验证程序的准确性,比如测试一个函数的正确性。【研发】 47 | - 常用技术:[**junit4**](https://github.com/junit-team/junit4)、[**junit5**](https://github.com/junit-team/junit5)、[**mockito**](https://github.com/mockito/mockito)、[**assertj-core**](https://github.com/joel-costigliola/assertj-core) 48 | - **功能测试(Functional Test)** - 验证模块的功能。【测试】 49 | - **集成测试(Integration Test)** - 验证几个互相有依赖关系的模块的功能。【测试】 50 | - **场景测试(Scenario Test)**- 验证几个模块是否能完成一个用户场景。【测试】 51 | - **系统测试(System Test)** - 对于整个系统功能的测试。【测试】 52 | - **Alpha 测试** - 软件测试人员在真实用户环境中对软件进行全面的测试。【测试】 53 | - **Beta 测试** - 也叫公测,是真实的用户在真实的环境中进行的测试。 54 | 55 | #### 非功能测试 56 | 57 | - **压力测试(Stress test)** - 验证软件在超过负载设计的情况下仍能返回正确的结果,没有崩溃 58 | - **负载测试(Load test)** - 测试软件在负载情况下能否正常工作 59 | - **性能测试(Performance test)** - 测试软件的效能,是否提供满意的服务质量。 60 | - 常用技术:[**JMeter**](https://jmeter.apache.org/)、JMH。 61 | - **软件辅助功能测试(Accessibility test**) - 测试软件是否向残疾用户提供足够的辅助功能 62 | - **本地化/全球化测试(Localization/Globalization**) 63 | - **兼容性测试(Compatibility Test)** 64 | - **配置测试(Configuration Test)** - 测试软件在各种配置下能否正常工作 65 | - **可用性测试(Usability Test)** – 测试软件是否好用 66 | - **安全性测试(Security Test)** 67 | 68 | ## 参考资料 69 | 70 | - [软件测试 (一) 软件测试方法大汇总](https://www.cnblogs.com/TankXiao/archive/2012/02/20/2347016.html) 71 | - [Java 微基准测试框架 JMH](https://www.xncoding.com/2018/01/07/java/jmh.html) -------------------------------------------------------------------------------- /source/_posts/15.分布式/11.分布式协同/02.ZooKeeper/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ZooKeeper 3 | date: 2020-09-09 17:53:08 4 | categories: 5 | - 分布式 6 | - 分布式协同 7 | - ZooKeeper 8 | tags: 9 | - 分布式 10 | - 协同 11 | - zookeeper 12 | permalink: /pages/886d8061/ 13 | hidden: true 14 | index: false 15 | --- 16 | 17 | # ZooKeeper 18 | 19 | > ZooKeeper 是 Apache 的顶级项目。**ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 ZAB 的一致性协议**。 20 | > 21 | > ZooKeeper 主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储。但是 ZooKeeper 并不是用来专门存储数据的,它的作用主要是用来**维护和监控存储数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理**。 22 | > 23 | > 很多大名鼎鼎的框架都基于 ZooKeeper 来实现分布式高可用,如:Dubbo、Kafka 等。 24 | > 25 | > ZooKeeper 官方支持 Java 和 C 的 Client API。ZooKeeper 社区为大多数语言(.NET,python 等)提供非官方 API。 26 | 27 | ## 📖 内容 28 | 29 | - [ZooKeeper 原理](ZooKeeper原理.md) 30 | - [ZooKeeper Java Api](ZooKeeperJavaApi.md) 31 | - [ZooKeeper 命令](ZooKeeper命令.md) 32 | - [ZooKeeper 运维](ZooKeeper运维.md) 33 | - [ZooKeeper Acl](ZooKeeperAcl.md) 34 | - [ZooKeeper 面试](ZooKeeper面试.md) 💯 35 | 36 | ## 📚 资料 37 | 38 | - **官方** 39 | - [ZooKeeper 官网](http://zookeeper.apache.org/) 40 | - [ZooKeeper 官方文档](https://cwiki.apache.org/confluence/display/ZOOKEEPER) 41 | - [ZooKeeper Github](https://github.com/apache/zookeeper) 42 | - [Apache Curator 官网](http://curator.apache.org/) 43 | - **书籍** 44 | - [《Hadoop 权威指南(第四版)》](https://book.douban.com/subject/27115351/) 45 | - [《从 Paxos 到 Zookeeper 分布式一致性原理与实践》](https://item.jd.com/11622772.html) 46 | - **文章** 47 | - [分布式服务框架 ZooKeeper -- 管理分布式环境中的数据](https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html) 48 | - [ZooKeeper 的功能以及工作原理](https://www.cnblogs.com/felixzh/p/5869212.html) 49 | - [ZooKeeper 简介及核心概念](https://github.com/heibaiying/BigData-Notes/blob/master/notes/ZooKeeper%E7%AE%80%E4%BB%8B%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5.md) 50 | - [详解分布式协调服务 ZooKeeper](https://draveness.me/zookeeper-chubby) 51 | - [深入浅出 Zookeeper(一) Zookeeper 架构及 FastLeaderElection 机制](http://www.jasongj.com/zookeeper/fastleaderelection/) 52 | - [Introduction to Apache ZooKeeper](https://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) 53 | - [Zookeeper 的优缺点](https://blog.csdn.net/wwwsq/article/details/7644445) 54 | 55 | ## 🚪 传送 56 | 57 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/06.JVM/Java_虚拟机_简介.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 虚拟机简介 3 | date: 2021-05-24 15:41:47 4 | order: 01 5 | categories: 6 | - Java 7 | - JavaCore 8 | - JVM 9 | tags: 10 | - Java 11 | - JavaCore 12 | - JVM 13 | permalink: /pages/09aa72ff/ 14 | --- 15 | 16 | # Java 虚拟机简介 17 | 18 | > JVM 能跨平台工作,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件、硬件之间的差异。 19 | 20 | ## JVM 简介 21 | 22 | ### 计算机体系结构 23 | 24 | 真实的计算机体系结构的核心部分包含: 25 | 26 | - 指令集 27 | - 计算单元(CPU) 28 | - 寻址方式 29 | - 寄存器 30 | - 存储单元 31 | 32 | ### JVM 体系结构简介 33 | 34 | JVM 体系结构与计算机体系结构相似,它的核心部分包含: 35 | 36 | - JVM 指令集 37 | - 类加载器 38 | - 执行引擎 - 相当于 JVM 的 CPU 39 | - 内存区 - JVM 的存储 40 | - 本地方法调用 - 调用 C/C++ 实现的本地方法 41 | 42 | ## Hotspot 架构 43 | 44 | Hotspot 是最流行的 JVM。 45 | 46 | Java 虚拟机的主要组件,包括**类加载器**、**运行时数据区**和**执行引擎**。 47 | 48 | Hotspot 虚拟机拥有一个架构,它支持强大特性和能力的基础平台,支持实现高性能和强大的可伸缩性的能力。举个例子,Hotspot 虚拟机 JIT 编译器生成动态的优化,换句话说,它们在 Java 应用执行期做出优化,为底层系统架构生成高性能的本地机器指令。另外,经过它的运行时环境和多线程垃圾回收成熟的进化和连续的设计, Hotspot 虚拟机在高可用计算系统上产出了高伸缩性。 49 | 50 |
51 | 52 |
53 | 54 | ### Hotspot 关键组件 55 | 56 | Java 虚拟机有三个组件关注着什么时候进行性能优化,堆空间是对象所存储的地方,这个区域被启动时选择的垃圾回收器管理,大部分调优选项与调整堆大小和根据你的情况选择最适当的垃圾收集器相关。即时编译器对性能也有很大的影响,但是使用新版本的 Java 虚拟机时很少需要调整。 57 | 58 |
59 | 60 |
61 | 62 | ### 性能指标 63 | 64 | Java 虚拟机的性能指标主要有两点: 65 | 66 | - **停顿时间** - 响应延迟是指一个应用回应一个请求的速度有多快。对关注响应能力的应用来说,长暂停时间是不可接受的,重点是在短的时间周期内能做出响应。 67 | - 桌面 UI 响应事件的速度 68 | - 网站返回网页的速度 69 | - 数据查询返回的速度 70 | - **吞吐量** - 吞吐量关注在特定的时间周期内一个应用的工作量的最大值。对关注吞吐量的应用来说长暂停时间是可以接受的。由于高吞吐量的应用关注的基准在更长周期时间上,所以快速响应时间不在考虑之内。 71 | - 给定时间内完成事务的数量 72 | - 一小时内批处理程序完成的工作数量 73 | - 一小时内数据查询完成的数量 74 | 75 | ## JVM 内存简介 76 | 77 | ### 物理内存和虚拟内存 78 | 79 | 所谓物理内存就是通常所说的 RAM(随机存储器)。 80 | 81 | 虚拟内存使得多个进程在同时运行时可以共享物理内存,这里的共享只是空间上共享,在逻辑上彼此仍然是隔离的。 82 | 83 | ### 内核空间和用户空间 84 | 85 | 一个计算通常有固定大小的内存空间,但是程序并不能使用全部的空间。因为这些空间被划分为内核空间和用户空间,而程序只能使用用户空间的内存。 86 | 87 | ### 使用内存的 Java 组件 88 | 89 | Java 启动后,作为一个进程运行在操作系统中。 90 | 91 | 有哪些 Java 组件需要占用内存呢? 92 | 93 | - 堆内存:Java 堆、类和类加载器 94 | - 栈内存:线程 95 | - 本地内存:NIO、JNI 96 | 97 | ## 参考资料 98 | 99 | - [《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/) -------------------------------------------------------------------------------- /source/_posts/11.算法/B+树.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: B+树 3 | date: 2022-03-13 22:37:27 4 | order: 03 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 树 10 | - 二叉树 11 | - B+ 树 12 | permalink: /pages/87c40d7c/ 13 | --- 14 | 15 | # B+树 16 | 17 | ## 什么是 B+树 18 | 19 | B+树是在二叉查找树的基础上进行了改造:树中的节点并不存储数据本身,而是只是作为索引。每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。 20 | 21 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220311092926.jpg) 22 | 23 | 改造之后,如果我们要求某个区间的数据。我们只需要拿区间的起始值,在树中进行查找,当查找到某个叶子节点之后,我们再顺着链表往后遍历,直到链表中的结点数据值大于区间的终止值为止。所有遍历到的数据,就是符合区间值的所有数据。 24 | 25 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220311092929.jpg) 26 | 27 | 但是,我们要为几千万、上亿的数据构建索引,如果将索引存储在内存中,尽管内存访问的速度非常快,查询的效率非常高,但是,占用的内存会非常多。 28 | 29 | 比如,我们给一亿个数据构建二叉查找树索引,那索引中会包含大约 1 亿个节点,每个节点假设占用 16 个字节,那就需要大约 1GB 的内存空间。给一张表建立索引,我们需要 1GB 的内存空间。如果我们要给 10 张表建立索引,那对内存的需求是无法满足的。如何解决这个索引占用太多内存的问题呢? 30 | 31 | 我们可以借助时间换空间的思路,把索引存储在硬盘中,而非内存中。我们都知道,硬盘是一个非常慢速的存储设备。通常内存的访问速度是纳秒级别的,而磁盘访问的速度是毫秒级别的。读取同样大小的数据,从磁盘中读取花费的时间,是从内存中读取所花费时间的上万倍,甚至几十万倍。 32 | 33 | 这种将索引存储在硬盘中的方案,尽管减少了内存消耗,但是在数据查找的过程中,需要读取磁盘中的索引,因此数据查询效率就相应降低很多。 34 | 35 | 二叉查找树,经过改造之后,支持区间查找的功能就实现了。不过,为了节省内存,如果把树存储在硬盘中,那么每个节点的读取(或者访问),都对应一次磁盘 IO 操作。树的高度就等于每次查询数据时磁盘 IO 操作的次数。 36 | 37 | 我们前面讲到,比起内存读写操作,磁盘 IO 操作非常耗时,所以我们优化的重点就是尽量减少磁盘 IO 操作,也就是,尽量降低树的高度。那如何降低树的高度呢? 38 | 39 | 我们来看下,如果我们把索引构建成 m 叉树,高度是不是比二叉树要小呢?如图所示,给 16 个数据构建二叉树索引,树的高度是 4,查找一个数据,就需要 4 个磁盘 IO 操作(如果根节点存储在内存中,其他结点存储在磁盘中),如果对 16 个数据构建五叉树索引,那高度只有 2,查找一个数据,对应只需要 2 次磁盘操作。如果 m 叉树中的 m 是 100,那对一亿个数据构建索引,树的高度也只是 3,最多只要 3 次磁盘 IO 就能获取到数据。磁盘 IO 变少了,查找数据的效率也就提高了。 40 | 41 | ## 为什么需要 B+树 42 | 43 | 关系型数据库中常用 B+ 树作为索引,这是为什么呢? 44 | 45 | 思考以下经典应用场景 46 | 47 | - 根据某个值查找数据,比如 `select * from user where id=1234`。 48 | - 根据区间值来查找某些数据,比如 `select * from user where id > 1234 and id < 2345`。 49 | 50 | 为了提高查询效率,需要使用索引。而对于索引的性能要求,主要考察**执行效率和存储空间**。如果让你选择一种数据结构去存储索引,你会如何考虑? 51 | 52 | 以一些常见数据结构为例: 53 | 54 | - **哈希表**:哈希表的查询性能很好,时间复杂度是 `O(1)`。但是,哈希表不能支持按照区间快速查找数据。所以,哈希表不能满足我们的需求。 55 | - **平衡二叉查找树**:尽管平衡二叉查找树查询的性能也很高,时间复杂度是 `O(logn)`。而且,对树进行中序遍历,我们还可以得到一个从小到大有序的数据序列,但这仍然不足以支持按照区间快速查找数据。 56 | - **跳表**:跳表是在链表之上加上多层索引构成的。它支持快速地插入、查找、删除数据,对应的时间复杂度是 `O(logn)`。并且,跳表也支持按照区间快速地查找数据。我们只需要定位到区间起点值对应在链表中的结点,然后从这个结点开始,顺序遍历链表,直到区间终点对应的结点为止,这期间遍历得到的数据就是满足区间值的数据。 57 | 58 | 实际上,数据库索引所用到的数据结构跟跳表非常相似,叫作 B+ 树。不过,它是通过二叉查找树演化过来的,而非跳表。B+树的应用场景 59 | 60 | ## 参考资料 61 | 62 | - [数据结构与算法之美](https://time.geekbang.org/column/intro/100017301) -------------------------------------------------------------------------------- /source/_posts/12.数据库/06.列式数据库/hbase/HBase_运维.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:hbase 3 | title: HBase 运维 4 | date: 2019-05-07 20:19:25 5 | categories: 6 | - 数据库 7 | - 列式数据库 8 | - hbase 9 | tags: 10 | - 数据库 11 | - 列式数据库 12 | - 大数据 13 | - hbase 14 | - 运维 15 | permalink: /pages/368271ca/ 16 | --- 17 | 18 | # HBase 运维 19 | 20 | ## 配置文件 21 | 22 | - `backup-masters` - 默认情况下不存在。列出主服务器应在其上启动备份主进程的主机,每行一个主机。 23 | - `hadoop-metrics2-hbase.properties` - 用于连接 HBase Hadoop 的 Metrics2 框架。 24 | - `hbase-env.cmd` and hbase-env.sh - 用于 Windows 和 Linux / Unix 环境的脚本,用于设置 HBase 的工作环境,包括 Java,Java 选项和其他环境变量的位置。 25 | - `hbase-policy.xml` - RPC 服务器用于对客户端请求进行授权决策的默认策略配置文件。仅在启用 HBase 安全性时使用。 26 | - `hbase-site.xml` - 主要的 HBase 配置文件。此文件指定覆盖 HBase 默认配置的配置选项。您可以在 docs / hbase-default.xml 中查看(但不要编辑)默认配置文件。您还可以在 HBase Web UI 的 HBase 配置选项卡中查看群集的整个有效配置(默认值和覆盖)。 27 | - `log4j.properties` - log4j 日志配置。 28 | - `regionservers` - 包含应在 HBase 集群中运行 RegionServer 的主机列表。默认情况下,此文件包含单个条目 localhost。它应包含主机名或 IP 地址列表,每行一个,并且如果群集中的每个节点将在其 localhost 接口上运行 RegionServer,则应仅包含 localhost。 29 | 30 | ## 环境要求 31 | 32 | - Java 33 | - HBase 2.0+ 要求 JDK8+ 34 | - HBase 1.2+ 要求 JDK7+ 35 | - SSH - 环境要支持 SSH 36 | - DNS - 环境中要在 hosts 配置本机 hostname 和本机 IP 37 | - NTP - HBase 集群的时间要同步,可以配置统一的 NTP 38 | - 平台 - 生产环境不推荐部署在 Windows 系统中 39 | - Hadoop - 依赖 Hadoop 配套版本 40 | - Zookeeper - 依赖 Zookeeper 配套版本 41 | 42 | ## 运行模式 43 | 44 | ### 单点 45 | 46 | hbase-site.xml 配置如下: 47 | 48 | ```xml 49 | 50 | 51 | hbase.rootdir 52 | hdfs://namenode.example.org:8020/hbase 53 | 54 | 55 | hbase.cluster.distributed 56 | false 57 | 58 | 59 | ``` 60 | 61 | ### 分布式 62 | 63 | hbase-site.xm 配置如下: 64 | 65 | ```xml 66 | 67 | 68 | hbase.rootdir 69 | hdfs://namenode.example.org:8020/hbase 70 | 71 | 72 | hbase.cluster.distributed 73 | true 74 | 75 | 76 | hbase.zookeeper.quorum 77 | node-a.example.com,node-b.example.com,node-c.example.com 78 | 79 | 80 | ``` 81 | 82 | ## 引用和引申 83 | 84 | ### 扩展阅读 85 | 86 | - [Apache HBase Configuration](http://hbase.apache.org/book.html#configuration) -------------------------------------------------------------------------------- /source/_posts/12.数据库/04.文档数据库/mongodb/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:mongodb 3 | title: MongoDB 4 | cover: https://raw.githubusercontent.com/dunwu/images/master/snap/202503062315356.webp 5 | date: 2020-09-09 20:47:14 6 | categories: 7 | - 数据库 8 | - 文档数据库 9 | - mongodb 10 | tags: 11 | - 数据库 12 | - 文档数据库 13 | - mongodb 14 | permalink: /pages/10d104dd/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # MongoDB 20 | 21 | ::: info 概述 22 | 23 | MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 24 | 25 | MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。 26 | 27 | MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 28 | 29 | ::: 30 | 31 | 32 | 33 | ## 📖 内容 34 | 35 | - [MongoDB 简介](MongoDB_简介.md) 36 | - [MongoDB CRUD](MongoDB_CRUD.md) 37 | - [MongoDB 聚合](MongoDB_聚合.md) 38 | - [MongoDB 索引](MongoDB_索引.md) 39 | - [MongoDB 事务](MongoDB_事务.md) 40 | - [MongoDB 建模](MongoDB_建模.md) 41 | - [MongoDB 复制](MongoDB_复制.md) 42 | - [MongoDB 分片](MongoDB_分片.md) 43 | - [MongoDB 运维](MongoDB_运维.md) 44 | - [MongoDB 面试](MongoDB_面试.md) 💯 45 | 46 | ## 📚 资料 47 | 48 | - **官方** 49 | - [MongoDB 官网](https://www.mongodb.com/) 50 | - [MongoDB Github](https://github.com/mongodb/mongo) 51 | - [MongoDB 官方免费教程](https://learn.mongodb.com/) 52 | - **书籍** 53 | - [《MongoDB 权威指南》](https://book.douban.com/subject/35688800/) 54 | - **教程** 55 | - [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.md) 56 | - [极客时间教程 - MongoDB 高手课](https://time.geekbang.org/course/intro/100040001) 57 | - **数据** 58 | - [mongodb-json-files](https://github.com/ozlerhakan/mongodb-json-files) 59 | - **文章** 60 | - [Introduction to MongoDB](https://www.slideshare.net/mdirolf/introduction-to-mongodb) 61 | - [eBay: Building Mission-Critical Multi-Data Center Applications with MongoDB](https://www.mongodb.com/blog/post/ebay-building-mission-critical-multi-data-center-applications-with-mongodb) 62 | - [The AWS and MongoDB Infrastructure of Parse: Lessons Learned](https://medium.baqend.com/parse-is-gone-a-few-secrets-about-their-infrastructure-91b3ab2fcf71) 63 | - [Migrating Mountains of Mongo Data](https://medium.com/build-addepar/migrating-mountains-of-mongo-data-63e530539952) 64 | - **更多资源** 65 | - [Github: Awesome MongoDB](https://github.com/ramnes/awesome-mongodb) 66 | 67 | ## 🚪 传送 68 | 69 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/03.容器/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 容器 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - 容器 8 | tags: 9 | - Java 10 | - JavaCore 11 | - 容器 12 | permalink: /pages/e335dfc2/ 13 | hidden: true 14 | index: false 15 | dir: 16 | order: 3 17 | link: true 18 | --- 19 | 20 | # Java 容器 21 | 22 | > Java 容器涉及许多数据结构知识点,所以设立专题进行总结。 23 | 24 | ## 📖 内容 25 | 26 | - [Java 容器简介](Java_容器_简介.md) - 关键词:`泛型`、`Iterable`、`Iterator`、`Comparable`、`Comparator`、`Cloneable`、`fail-fast` 27 | - [Java 容器之 List](Java_容器_List.md) - 关键词:`List`、`ArrayList`、`LinkedList` 28 | - [Java 容器之 Map](Java_容器_Map.md) - 关键词:`Map`、`HashMap`、`TreeMap`、`LinkedHashMap`、`WeakHashMap` 29 | - [Java 容器之 Set](Java_容器_Set.md) - 关键词:`Set`、`HashSet`、`TreeSet`、`LinkedHashSet`、`EnumSet` 30 | - [Java 容器之 Queue](Java_容器_Queue.md) - 关键词:`Queue`、`Deque`、`ArrayDeque`、`LinkedList`、`PriorityQueue` 31 | - [Java 容器之 Stream](Java_容器_Stream.md) 32 | 33 | ## 📚 资料 34 | 35 | - **书籍** 36 | - Java 四大名著 37 | - [《Java 编程思想(Thinking in java)》](https://book.douban.com/subject/2130190/) 38 | - [《Java 核心技术 卷 I 基础知识》](https://book.douban.com/subject/26880667/) 39 | - [《Java 核心技术 卷 II 高级特性》](https://book.douban.com/subject/27165931/) 40 | - [《Effective Java》](https://book.douban.com/subject/30412517/) 41 | - Java 入门 42 | - [《O'Reilly:Head First Java》](https://book.douban.com/subject/2000732/) 43 | - [《Java 从入门到精通》](https://item.jd.com/12555860.html) 44 | - [《疯狂 Java 讲义》](https://book.douban.com/subject/3246499/) 45 | - **教程、社区** 46 | - [Runoob Java 教程](https://www.runoob.com/java/java-tutorial.html) 47 | - [java-design-patterns](https://github.com/iluwatar/java-design-patterns) 48 | - [Java](https://github.com/TheAlgorithms/Java) 49 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 50 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) 51 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.geekbang.org/column/intro/100047701) 52 | - [极客时间教程 - 深入拆解 Java 虚拟机](https://time.geekbang.org/column/intro/100010301) 53 | - [极客时间教程 - Java 并发编程实战](https://time.geekbang.org/column/intro/100023901) 54 | - **面试** 55 | - [CS-Notes](https://github.com/CyC2018/CS-Notes) 56 | - [JavaGuide](https://github.com/Snailclimb/JavaGuide) 57 | - [advanced-java](https://github.com/doocs/advanced-java) 58 | 59 | ## 🚪 传送 60 | 61 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/13.网络/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 计算机网络 3 | date: 2020-02-03 10:56:00 4 | categories: 5 | - 网络 6 | tags: 7 | - 网络 8 | permalink: /pages/bb9ba184/ 9 | hidden: true 10 | index: false 11 | --- 12 | 13 | # 计算机网络 14 | 15 | > 如果你是做通信领域的开发,或者是 Web 应用的开发,那就或多或少需要了解一些计算机网络的知识 。 16 | 17 | ## 📖 内容 18 | 19 | ### 网络综合 20 | 21 | > 理解计算机网络,首先需要从宏观层面了解计算机网络通信的分层结构。最有代表性的是 OSI 七层结构模型,但现实中更流行的是五层结构模型。 22 | > 23 | > 了解网络分层结构,需要了解每个网络层级在网络通信中的定位,以及这个层级主要的通信设备、通信协议。 24 | 25 | - [计算机网络面试总结](01.网络综合/01.计算机网络面试.md) 26 | - [计算机网络指南](01.网络综合/02.计算机网络指南.md) - 关键词:核心概念、拓扑结构、作用范围、性能指标、体系结构 27 | - **网络分层** 28 | - [计算机网络之物理层](01.网络综合/11.物理层.md) - 关键词:调制、解调、数字信号、模拟信号、通信媒介、信道复用 29 | - [计算机网络之数据链路层](01.网络综合/12.数据链路层.md) - 关键词:点对点信道、广播信道、`PPP`、`CSMA/CD`、局域网、以太网、`MAC`、适配器、集线器、网桥、交换机 30 | - [计算机网络之网络层](01.网络综合/13.网络层.md) - 关键词:`IP`、`ICMP`、`ARP`、路由 31 | - [计算机网络之传输层](01.网络综合/14.传输层.md) - 关键词:`UDP`、`TCP`、滑动窗口、拥塞控制、三次握手 32 | - [计算机网络之应用层](01.网络综合/15.应用层.md) - 关键词:`HTTP`、`DNS`、`FTP`、`TELNET`、`DHCP` 33 | 34 | ### 网络协议 35 | 36 | - [超文本传输协议 HTTP](02.网络协议/01.HTTP.md) 37 | - [域名系统协议 DNS](02.网络协议/02.DNS) 38 | - [传输控制协议 TCP](02.网络协议/03.TCP.md) 39 | - [用户数据报协议 UDP](02.网络协议/04.UDP.md) 40 | - [ICMP](02.网络协议/05.ICMP.md) 41 | 42 | ### 网络技术 43 | 44 | - [WebSocket](03.网络技术/01.WebSocket.md) 45 | - [CDN](03.网络技术/02.CDN.md) 46 | - [VPN](03.网络技术/03.VPN.md) 47 | 48 | ## 📚 资料 49 | 50 | - **书籍** 51 | - [TCP/IP 详解 卷 1:协议](https://book.douban.com/subject/1088054/) - TCP/IP 红宝书,经典中的经典 52 | - [TCP/IP 详解 卷 2:实现](https://book.douban.com/subject/1087767/) - TCP/IP 红宝书,经典中的经典 53 | - [TCP/IP 详解 卷 3:TCP 事务协议、HTTP、NNTP 和 UNIX 域协议](https://book.douban.com/subject/1058634/) - TCP/IP 红宝书,经典中的经典 54 | - [Web 性能权威指南](https://book.douban.com/subject/25856314/) 55 | - [HTTP 权威指南](https://book.douban.com/subject/10746113/) 56 | - [图解 HTTP](https://book.douban.com/subject/25863515/) 57 | - [图解 TCP/IP](https://book.douban.com/subject/24737674/) 58 | - [计算机网络(第 7 版)](https://book.douban.com/subject/26960678/) - 国内大学计算机专业经典教材 59 | - **教程** 60 | - [Computer Network Tutorials](https://www.geeksforgeeks.org/computer-network-tutorials/) 61 | - **RFC** 62 | - https://www.rfc-editor.org/ - 在线查阅、下载 RFC 文档 63 | - **DNS** 64 | - [RFC 1034 DOMAIN NAMES - CONCEPTS AND FACILITIES](https://tools.ietf.org/html/rfc1034) - DNS 最核心 RFC 65 | - [RFC 1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION](https://tools.ietf.org/html/rfc1035) - DNS 最核心 RFC 66 | - **工具** 67 | - [WireShark](https://www.wireshark.org/) 68 | - [Postman](https://www.getpostman.com/) 69 | 70 | ## 🚪 传送 71 | 72 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/05.KV数据库/Memcached.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:memcached 3 | title: Memcached 快速入门 4 | date: 2022-02-17 22:34:30 5 | categories: 6 | - 数据库 7 | - KV数据库 8 | tags: 9 | - 数据库 10 | - KV数据库 11 | - memcached 12 | permalink: /pages/2af88d46/ 13 | --- 14 | 15 | # Memcached 快速入门 16 | 17 | ## Memcached 简介 18 | 19 | Memcached 是一个自由开源的,高性能,分布式内存对象缓存系统。 20 | 21 | Memcached 是一种基于内存的 key-value 存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API 调用或者是页面渲染的结果。 22 | 23 | Memcached 简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的 API 兼容大部分流行的开发语言。本质上,它是一个简洁的 key-value 存储系统。 24 | 25 | ### Memcached 特性 26 | 27 | memcached 作为高速运行的分布式缓存服务器,具有以下的特点。 28 | 29 | - 协议简单 30 | - 基于 libevent 的事件处理 31 | - 内置内存存储方式 32 | - memcached 不互相通信的分布式 33 | 34 | ## Memcached 命令 35 | 36 | 可以通过 telnet 命令并指定主机 ip 和端口来连接 Memcached 服务。 37 | 38 | ``` 39 | telnet 127.0.0.1 11211 40 | 41 | Trying 127.0.0.1... 42 | Connected to 127.0.0.1. 43 | Escape character is '^]'. 44 | set foo 0 0 3 保存命令 45 | bar 数据 46 | STORED 结果 47 | get foo 取得命令 48 | VALUE foo 0 3 数据 49 | bar 数据 50 | END 结束行 51 | quit 退出 52 | ``` 53 | 54 | ## Java 连接 Memcached 55 | 56 | 使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。 57 | 58 | 本站 jar 包下载地址:[spymemcached-2.10.3.jar](https://www.runoob.com/try/download/spymemcached-2.10.3.jar)。 59 | 60 | Google Code jar 包下载地址:[spymemcached-2.10.3.jar](http://code.google.com/p/spymemcached/downloads/list)(需要科学上网)。 61 | 62 | 以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。 63 | 64 | ```java 65 | import net.spy.memcached.MemcachedClient; 66 | import java.net.*; 67 | 68 | 69 | public class MemcachedJava { 70 | public static void main(String[] args) { 71 | try{ 72 | // 本地连接 Memcached 服务 73 | MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); 74 | System.out.println("Connection to server sucessful."); 75 | 76 | // 关闭连接 77 | mcc.shutdown(); 78 | 79 | }catch(Exception ex){ 80 | System.out.println( ex.getMessage() ); 81 | } 82 | } 83 | } 84 | ``` 85 | 86 | ## 参考资料 87 | 88 | - [Memcached 官网](https://memcached.org/) 89 | - [Memcached Github](https://github.com/memcached/memcached/) 90 | - [Memcached 教程](https://www.runoob.com/memcached/memcached-tutorial.html) -------------------------------------------------------------------------------- /source/_posts/01.Java/01.JavaCore/01.基础特性/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Java 基础 3 | date: 2020-06-04 13:51:01 4 | categories: 5 | - Java 6 | - JavaCore 7 | - 基础特性 8 | tags: 9 | - Java 10 | - JavaCore 11 | permalink: /pages/a7aa142d/ 12 | hidden: true 13 | index: false 14 | dir: 15 | order: 1 16 | link: true 17 | --- 18 | 19 | # Java 基础特性 20 | 21 | > Java 基础篇总结 Java 的一些基础特性。 22 | 23 | ## 📖 内容 24 | 25 | - [Java 基础语法特性](Java_基础语法.md) 26 | - [Java 基本数据类型](Java_数据类型.md) 27 | - [Java 面向对象](Java_面向对象.md) 28 | - [Java 方法](Java_方法.md) 29 | - [Java 数组](Java_数组.md) 30 | - [Java 枚举](Java_枚举.md) 31 | - [Java 控制语句](Java_控制语句.md) 32 | - [Java 异常](Java_异常.md) 33 | - [Java 泛型](Java_泛型.md) 34 | - [Java 反射](Java_反射.md) 35 | - [Java 注解](Java_注解.md) 36 | - [Java String 类型](Java_String.md) 37 | 38 | ## 📚 资料 39 | 40 | - **书籍** 41 | - Java 四大名著 42 | - [《Java 编程思想(Thinking in java)》](https://book.douban.com/subject/2130190/) 43 | - [《Java 核心技术 卷 I 基础知识》](https://book.douban.com/subject/26880667/) 44 | - [《Java 核心技术 卷 II 高级特性》](https://book.douban.com/subject/27165931/) 45 | - [《Effective Java》](https://book.douban.com/subject/30412517/) 46 | - Java 并发 47 | - [《Java 并发编程实战》](https://book.douban.com/subject/10484692/) 48 | - [《Java 并发编程的艺术》](https://book.douban.com/subject/26591326/) 49 | - Java 虚拟机 50 | - [《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/) 51 | - Java 入门 52 | - [《O'Reilly:Head First Java》](https://book.douban.com/subject/2000732/) 53 | - [《疯狂 Java 讲义》](https://book.douban.com/subject/3246499/) 54 | - 其他 55 | - [《Head First 设计模式》](https://book.douban.com/subject/2243615/) 56 | - [《Java 网络编程》](https://book.douban.com/subject/1438754/) 57 | - [《Java 加密与解密的艺术》](https://book.douban.com/subject/25861566/) 58 | - [《阿里巴巴 Java 开发手册》](https://book.douban.com/subject/27605355/) 59 | - **教程、社区** 60 | - [Runoob Java 教程](https://www.runoob.com/java/java-tutorial.html) 61 | - [java-design-patterns](https://github.com/iluwatar/java-design-patterns) 62 | - [Java](https://github.com/TheAlgorithms/Java) 63 | - [极客时间教程 - Java 核心技术面试精讲](https://time.geekbang.org/column/intro/82) 64 | - [极客时间教程 - Java 性能调优实战](https://time.geekbang.org/column/intro/100028001) 65 | - [极客时间教程 - Java 业务开发常见错误 100 例](https://time.geekbang.org/column/intro/100047701) 66 | - [极客时间教程 - 深入拆解 Java 虚拟机](https://time.geekbang.org/column/intro/100010301) 67 | - [极客时间教程 - Java 并发编程实战](https://time.geekbang.org/column/intro/100023901) 68 | - **面试** 69 | - [CS-Notes](https://github.com/CyC2018/CS-Notes) 70 | - [JavaGuide](https://github.com/Snailclimb/JavaGuide) 71 | - [advanced-java](https://github.com/doocs/advanced-java) 72 | 73 | ## 🚪 传送 74 | 75 | ◾ 🏠 [JAVACORE 首页](https://github.com/dunwu/javacore) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/14.中间件/02.缓存/06.Http缓存.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Http 缓存 3 | date: 2022-02-17 22:34:30 4 | order: 06 5 | categories: 6 | - Java 7 | - 中间件 8 | - 缓存 9 | tags: 10 | - 缓存 11 | - Http 12 | permalink: /pages/f5949220/ 13 | --- 14 | 15 | # Http 缓存 16 | 17 | HTTP 缓存分为 2 种,一种是强缓存,另一种是协商缓存。主要作用是可以加快资源获取速度,提升用户体验,减少网络传输,缓解服务端的压力。 18 | 19 | ## Http 强缓存 20 | 21 | 不需要发送请求到服务端,直接读取浏览器本地缓存,在 Chrome 的 Network 中显示的 HTTP 状态码是 200 ,在 Chrome 中,强缓存又分为 Disk Cache (存放在硬盘中)和 Memory Cache (存放在内存中),存放的位置是由浏览器控制的。是否强缓存由 `Expires`、`Cache-Control` 和 `Pragma` 3 个 Header 属性共同来控制。 22 | 23 | ### Expires 24 | 25 | `Expires` 的值是一个 HTTP 日期,在浏览器发起请求时,会根据系统时间和 Expires 的值进行比较,如果系统时间超过了 Expires 的值,缓存失效。由于和系统时间进行比较,所以当系统时间和服务器时间不一致的时候,会有缓存有效期不准的问题。Expires 的优先级在三个 Header 属性中是最低的。 26 | 27 | ### Cache-Control 28 | 29 | `Cache-Control` 是 HTTP/1.1 中新增的属性,在请求头和响应头中都可以使用,常用的属性值如有: 30 | 31 | - `max-age`:单位是秒,缓存时间计算的方式是距离发起的时间的秒数,超过间隔的秒数缓存失效 32 | - `no-cache`:不使用强缓存,需要与服务器验证缓存是否新鲜 33 | - `no-store`:禁止使用缓存(包括协商缓存),每次都向服务器请求最新的资源 34 | - `private`:专用于个人的缓存,中间代理、CDN 等不能缓存此响应 35 | - `public`:响应可以被中间代理、CDN 等缓存 36 | - `must-revalidate`:在缓存过期前可以使用,过期后必须向服务器验证 37 | 38 | ### Pragma 39 | 40 | `Pragma` 只有一个属性值,就是 no-cache ,效果和 Cache-Control 中的 no-cache 一致,不使用强缓存,需要与服务器验证缓存是否新鲜,在 3 个头部属性中的优先级最高。 41 | 42 | ## 协商缓存 43 | 44 | 当浏览器的强缓存失效的时候或者请求头中设置了不走强缓存,并且在请求头中设置了 If-Modified-Since 或者 If-None-Match 的时候,会将这两个属性值到服务端去验证是否命中协商缓存,如果命中了协商缓存,会返回 304 状态,加载浏览器缓存,并且响应头会设置 Last-Modified 或者 ETag 属性。 45 | 46 | ### ETag/If-None-Match 47 | 48 | Etag: 服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识(生成规则由服务器决定) 49 | 50 | If-None-Match: 再次请求服务器时,浏览器的请求报文头部会包含此字段,后面的值为在缓存中获取的标识。服务器接收到次报文后发现 If-None-Match 则与被请求资源的唯一标识进行对比。 51 | 52 | 1. 不同,说明资源被改动过,则响应整个资源内容,返回状态码 200。 53 | 2. 相同,说明资源无心修改,则响应 header,浏览器直接从缓存中获取数据信息。返回状态码 304. 54 | 55 | 但是实际应用中由于 Etag 的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用 Etag 了。 56 | 57 | ### Last-Modified/If-Modified-Since 58 | 59 | Last-Modified: 服务器在响应请求时,会告诉浏览器资源的最后修改时间。 60 | 61 | if-Modified-Since: 浏览器再次请求服务器的时候,请求头会包含此字段,后面跟着在缓存中获得的最后修改时间。服务端收到此请求头发现有 if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回 304 和响应报文头,浏览器只需要从缓存中获取信息即可。 从字面上看,就是说:从某个时间节点算起,是否文件被修改了 62 | 63 | 1. 如果真的被修改:那么开始传输响应一个整体,服务器返回:200 OK 64 | 2. 如果没有被修改:那么只需传输响应 header,服务器返回:304 Not Modified 65 | 66 | if-Unmodified-Since: 从字面上看, 就是说: 从某个时间点算起, 是否文件没有被修改 67 | 68 | 1. 如果没有被修改:则开始`继续'传送文件: 服务器返回: 200 OK 69 | 2. 如果文件被修改:则不传输,服务器返回: 412 Precondition failed (预处理错误) 70 | 71 | 这两个的区别是一个是修改了才下载一个是没修改才下载。 Last-Modified 说好却也不是特别好,因为如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为 Last-Modified 时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)。为了解决这个问题,HTTP1.1 推出了 Etag。 72 | 73 | ## 参考资料 74 | 75 | - [图解 HTTP 缓存](https://juejin.im/post/5eb7f811f265da7bbc7cc5bd) 76 | - [HTTP----HTTP 缓存机制](https://juejin.im/post/5a1d4e546fb9a0450f21af23) 77 | - [缓存详解](https://juejin.im/post/5a6c87c46fb9a01ca560b4d7) -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 架构 3 | date: 2019-03-08 13:16:53 4 | categories: 5 | - 设计 6 | - 架构 7 | tags: 8 | - 架构 9 | permalink: /pages/bad4b2c4/ 10 | hidden: true 11 | index: false 12 | --- 13 | 14 | # 架构 15 | 16 | 架构设计的目的是解决软件系统的复杂度带来的问题。架构即(重要)决策,是在一个有约束的盒子里去求解或接近最合适的解。这个有约束的盒子是团队经验、成本、资源、进度、业务所处阶段等所编织、掺杂在一起的综合体(人,财,物,时间,事情等)。架构无优劣,但是存在恰当的架构用在合适的软件系统中,而这些就是决策的结果。 17 | 18 | 架构设计原则:**合适原则、简单原则、演化原则**。合适优于先进 => 演化优于一步到位 => 简单优于复杂 19 | 20 | 架构设计有业务需求驱动,需要识别出主要问题,然后根据业务、技术、团队、成本等综合评估排序,优先解决当前面临的最主要的复杂度问题。 21 | 22 | 架构设计一般要给出多套备选方案(3 ~ 5 个最佳),并评估各方案利弊。 23 | 24 | 评估方案时,应该先列出关注的维度(如:功能性、性能、可用性、复杂度、硬件成本、运维成本等),然后根据这些维度去评估打分,再综合挑选最合适当时情况的方案。 25 | 26 | 架构失败的主因: 27 | 28 | - 没那么多人,却想干那么多活 29 | - 没有那么多积累,却想一步登天 30 | - 没有那么卓越的业务场景,却幻想灵光一闪成为天才 31 | 32 | ## 📖 内容 33 | 34 | ### 综合 35 | 36 | - [如何设计系统](00.综合/00.如何设计系统.md) 37 | - [系统架构面试总结](00.综合/01.系统架构面试.md) 38 | - [系统架构概述](00.综合/02.系统架构概述.md) 39 | - [系统高性能架构](00.综合/03.系统高性能架构.md) 40 | - [系统高可用架构](00.综合/04.系统高可用架构.md) 41 | - [系统伸缩性架构](00.综合/05.系统伸缩性架构.md) 42 | - [系统扩展性架构](00.综合/06.系统扩展性架构.md) 43 | - [系统安全性架构](00.综合/07.系统安全性架构.md) 44 | - [大型系统核心技术](00.综合/08.大型系统核心技术.md) 45 | - [系统测试架构](00.综合/09.系统测试架构.md) 46 | 47 | ### 微服务 48 | 49 | - [微服务简介](01.微服务/01.微服务简介.md) - 关键词:`定义`、`演进`、`利弊`、`如何拆分`、`容量规划`、`核心组件` 50 | - [微服务之注册和发现](01.微服务/02.微服务之注册和发现.md) - 关键词:`服务定义`、`注册中心`、`元数据`、`健康检查`、`服务订阅`、`一致性` 51 | - [微服务之服务调用](01.微服务/03.微服务之服务调用.md) - 关键词:`RPC`、`通信协议`、`传输方式`、`序列化` 52 | - [微服务基本原理](01.微服务/10.微服务基本原理.md) - 关键词:`微服务`、`序列化`、`动态代理`、`通信`、`服务注册发现`、`健康检查`、`路由`、`负载均衡`、`容错处理`、`优雅上线下线`、`限流`、`熔断`、`业务分组` 53 | 54 | ### 安全 55 | 56 | - [权限认证综述](02.安全/01.综述.md) 57 | - [认证设计](02.安全/02.认证.md) 58 | - [授权设计](02.安全/03.授权.md) 59 | - [安全漏洞](02.安全/05.安全漏洞.md) 60 | - [编码和加密](02.安全/06.编码和加密.md) 61 | 62 | ## 📚 资料 63 | 64 | - **书籍** 65 | - [《大型网站技术架构:核心原理与案例分析》](https://item.jd.com/11322972.html) - 浅显易懂的将解大型网站架构演进之路;简介了大型系统所面临的挑战以及核心技术点。 66 | - [《大型网站系统与 Java 中间件实践》](https://item.jd.com/11449803.html) 67 | - [《亿级流量网站架构核心技术:跟开涛学搭建高可用高并发系统》](https://item.jd.com/12153914.html) 68 | - [《企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战》](https://item.jd.com/12176278.html) - 阐述阿里巴巴中台系统发展,更多的是讲解应用场景和能力,没有讲解技术细节。 69 | - [《逆流而上:阿里巴巴技术成长之路》](https://item.jd.com/12238227.html) - 主要以运维的视角阐述系统运维中遇到的困难,定位思路以及解决方法。 70 | - **教程** 71 | - [system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md) 72 | - [从 0 开始学架构](https://time.geekbang.org/column/intro/100006601) 73 | - [从 0 开始学微服务](https://time.geekbang.org/column/intro/100014401) 74 | - [RPC 实战与核心原理](https://time.geekbang.org/column/intro/100046201) 75 | - [微服务架构核心 20 讲](https://time.geekbang.org/course/intro/100003901) 76 | - [DDD 实战课](https://time.geekbang.org/column/intro/100037301) 77 | 78 | ## 🚪 传送 79 | 80 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/99.解决方案/Cinchcast的架构.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Cinchcast 的架构 3 | date: 2021-11-08 08:15:33 4 | categories: 5 | - 设计 6 | - 架构 7 | - 解决方案 8 | tags: 9 | - 架构 10 | - 解决方案 11 | permalink: /pages/c0063bdf/ 12 | --- 13 | 14 | # Cinchcast 的架构 15 | 16 | Cinchcast 提供的解决方案允许公司创建、共享、衡量和货币化音频内容,以接触和吸引对其业务最重要的人。我们的技术将会议桥接器与实时音频流相结合,以简化在线活动并增强参与者的参与度。 Cinchcast 技术还用于为全球最大的音频社交网络 Blogtalkradio 提供动力。今天,我们的平台每天制作和分发超过 1,500 小时的原创内容。在本文中,我们描述了我们为扩展平台以支持这种规模的数据而做出的工程决策。 17 | 18 | ## 统计数据 19 | 20 | - 浏览量每月超过 5000 万 21 | - 创建了 50000 小时的音频内容 22 | - 1500 万个流媒体 23 | - 175,000,000 次广告展示 24 | - 峰值每秒 40000 并发请求 25 | - MSSQL、Redis、ElasticSearch 集群中存储的数据达到每天数 TB, 26 | - 10 人工程师团队 27 | - 生产环境大概有 100 左右的硬件节点 28 | 29 | ## 数据中心 30 | 31 | 线上网站部署在布鲁克林的数据中心。但 QA 和 Staging 环境则使用了 Amazon EC2 云实例。 32 | 33 | ——考虑到数据安全,大部分公司不愿意把真实数据部署在云端。 34 | 35 | ## 硬件 36 | 37 | - 大概有 50 台 Web 服务器 38 | - 15 台 MS SQL 数据库服务器 39 | - 2 台 Redis 的 NoSQL 的键值服务器 40 | - 2 台 NodeJS 服务器 41 | - 2 台 弹性搜索集群服务器 42 | 43 | ## 开发工具 44 | 45 | - NET 4 C#:ASP.NET 和 MVC3 46 | - IDE 用的是 Visual Studio 2010 Team Suite 47 | - 用 StyleCop、ReSharper 来强化代码标准 48 | - 使用敏捷。其中大的功能用 Scrum,小任务则通过看板任务墙管理 49 | - 测试和持续集成使用 Jenkins + Nunit 50 | - 自动化测试则是 Selenium 和 Sauce On Demand 51 | 52 | ## 软件和使用的技术 53 | 54 | - Windows Server 2008 R2 的 64 位操作系统 55 | - 基于微软 Windows Server 2008 Web 服务器下运行的 SQL Server 2005 56 | - 负载均衡是 EQL(Equalizer load balancers) 57 | - Redis 作为分布式缓存层和消息分发队列 58 | - NodeJS 用来进行实时分析和更新仪表盘 59 | - 搜索用得是 ElasticSearch,日志分析是通过 Sawmill+自定义分析器脚本 60 | 61 | ## 监测 62 | 63 | - NewRelic:性能监控 64 | - 性能对 KPI(转换率,页面浏览量)的影响:Chartbeat: 65 | - Gomez,WhatsupGold,Nagios 等用来各种预警和报警 66 | - SQL Server monitoring 的监控:来自 Red Gate 的 SQL Monitor 67 | 68 | ## 我们的原则 69 | 70 | - 尊重他人的时间。不要带着问题来,要拿出解决办法。 71 | - 不要去追逐当下的热点技术,先实现基本功能,然后再做锦上添花的。务实是最重要的。 72 | - 成为一个“如何做”的团队而不是总是说“不”的团队 73 | - 预先处理总比亡羊补牢要好,把安全植入到软件开发生命周期中,通过培训开发人员如何写出安全的软件并把它从一开始就作为业务优先考虑之处。 74 | 75 | ## 架构 76 | 77 | - 所有 Javascript、CSS 和图像都缓存在 CDN 级别。 DNS 指向一个 CDN,它将请求传递给源服务器。我们使用 Cotendo 是因为它允许在 CDN 上做出 L7 路由决策。 78 | - 单独的 Web 服务器集群用于为普通用户和广告用户的请求提供服务,通过 cookie 进行区分。 79 | - 我们正在转向面向服务的架构,其中系统的关键部分,例如搜索、身份验证、缓存,都是以各种语言实现的 RESTFUL 服务。这些服务还提供了一个缓存层。 80 | - REDIS NOSQL 键值存储(redis.io)用作数据库调用之前的缓存层。 81 | - Scaleout 用于在网络服务器集群中维护会话状态。但是,我们正在考虑切换到 REDIS。 82 | 83 | ## 经验教训 84 | 85 | - SQL Server 数据库中的文本搜索不好用,经常出现 CPU 阻塞,所以 Cinchcast 切换到 ElasticSearch,一个 Lucene 的衍生工具。 86 | - 微软内置的会话模块容易出现死锁,他们用 AngiesList 会话模块取代了它,并把数据存储到 Redis。 87 | - 日志是发现问题的关键。 88 | - 重新发明轮子,有时候也可以是一件好事。例如,在一个供应商的提供的 JS / CSS 的产品导致性能问题的时候,他们通过重写显著改善了网站的性能。 89 | - 并不是所有的数据都是关系型的。 90 | - 在开发中不使用指标检测就像在风暴中不参考高度表来降落飞机,因此整个开发过程中,一定要通过网站吞吐量,解决错误的时间、代码覆盖率,等指标来衡量你的效率。 总的来说,对于日 PV 百万级的网站来说,Cinchcast 的架构、研发、运维等层面的技术选型和经验值得学习和参考。 91 | 92 | ## 参考资料 93 | 94 | - [每天产生 1500 小时的音频](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html) -------------------------------------------------------------------------------- /source/_posts/03.设计/02.设计模式/18.解释器模式.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 设计模式之解释器模式 3 | date: 2015-01-20 18:44:00 4 | order: 18 5 | categories: 6 | - 设计 7 | - 设计模式 8 | tags: 9 | - 设计 10 | - 设计模式 11 | permalink: /pages/707ae8fa/ 12 | --- 13 | 14 | # 设计模式之解释器模式 15 | 16 | ## 简介 17 | 18 | **解释器模式 (Interpreter)** 定义一个语言,定义它的文法的一种表示。并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 19 | 20 | 解释器模式是一种**行为型模式**。 21 | 22 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200726112138.png) 23 | 24 | **Context** : 包含解释器之外的一些全局信息。 25 | 26 | ```java 27 | 28 | class Context { 29 | private String input; 30 | private String output; 31 | 32 | public void setInput(String input) { 33 | this.input = input; 34 | } 35 | 36 | public String getInput() { 37 | return this.input; 38 | } 39 | 40 | public void setOutput(String output) { 41 | this.output = output; 42 | } 43 | 44 | public String getOutput() { 45 | return this.output; 46 | } 47 | } 48 | ``` 49 | 50 | **AbstractExpression** : 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 51 | 52 | ```java 53 | abstract class AbstractExpression { 54 | public abstract void Interpret(Context context); 55 | } 56 | ``` 57 | 58 | **TerminalExpression** : 实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个 Interprete()方法。 59 | 60 | 文法中的每一个终结符都有一个具体终结表达式与之对应。 61 | 62 | ```java 63 | class TerminalExpression extends AbstractExpression { 64 | @Override 65 | public void Interpret(Context context) { 66 | context.setOutput("终端" + context.getInput()); 67 | System.out.println(context.getInput() + "经过终端解释器解释为:" + context.getOutput()); 68 | } 69 | } 70 | ``` 71 | 72 | **NonterminalExpression** : 实现与文法中的非终结符相关联的解释操作。对文法中的每一条规则 R1,R2......Rn 都需要一个具体的非终结符表达式类。通过实现抽象表达式的 Interpret 方法实现解释操作。 73 | 74 | ```java 75 | class NonterminalExpression extends AbstractExpression { 76 | @Override 77 | public void Interpret(Context context) { 78 | context.setOutput("非终端" + context.getInput()); 79 | System.out.println(context.getInput() + "经过非终端解释器解释为:" + context.getOutput()); 80 | } 81 | } 82 | ``` 83 | 84 | 客户端 85 | 86 | ```java 87 | public class InterpreterPattern { 88 | public static void main(String[] args) { 89 | Context context = new Context(); 90 | context.setInput("ABC"); 91 | 92 | AbstractExpression expression1 = new TerminalExpression(); 93 | expression1.Interpret(context); 94 | 95 | AbstractExpression expression2 = new NonterminalExpression(); 96 | expression2.Interpret(context); 97 | } 98 | } 99 | ``` 100 | 101 | 输出 102 | 103 | ``` 104 | ABC经过终端解释器解释为:终端ABC 105 | ABC经过非终端解释器解释为:非终端ABC 106 | ``` 107 | 108 | ## 实例 109 | 110 | ## 场景 111 | 112 | ## 参考资料 113 | 114 | - [《Head First 设计模式》](https://book.douban.com/subject/2243615/) 115 | - [《大话设计模式》](https://book.douban.com/subject/2334288/) -------------------------------------------------------------------------------- /source/_posts/03.设计/02.设计模式/00.设计模式概述.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 设计模式概述 3 | date: 2015-01-27 16:50:00 4 | order: 00 5 | categories: 6 | - 设计 7 | - 设计模式 8 | tags: 9 | - 设计 10 | - 设计模式 11 | permalink: /pages/5bc54df9/ 12 | --- 13 | 14 | # 设计模式概述 15 | 16 | > 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 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 | - [简单工厂模式 (Simple Factory)](01.简单工厂模式.md) 66 | - [工厂方法模式 (Factory Method)](02.工厂方法模式.md) 67 | - [抽象工厂模式 (Abstract Factory)](03.抽象工厂模式.md) 68 | - [建造者模式 (Builder)](04.建造者模式.md) 69 | - [原型模式 (Prototype)](05.原型模式.md) 70 | - [单例模式 (Singleton)](06.单例模式.md) 71 | 72 | ### 结构型模式 73 | 74 | > 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。 75 | 76 | - [适配器模式 (Adapter)](07.适配器模式.md) 77 | - [桥接模式 (Bridge)](08.桥接模式.md) 78 | - [组合模式 (Composite)](09.组合模式.md) 79 | - [装饰模式 (Decorator)](10.装饰模式.md) 80 | - [外观模式 (Facade)](11.外观模式.md) 81 | - [享元模式 (Flyweight)](12.享元模式.md) 82 | - [代理模式 (Proxy)](13.代理模式.md) 83 | 84 | ### 行为型模式 85 | 86 | > 行为模式负责对象间的高效沟通和职责委派。 87 | 88 | - [模板方法模式 (Template Method)](14.模板方法模式.md) 89 | - [命令模式 (Command)](15.命令模式.md) 90 | - [迭代器模式 (Iterator)](16.迭代器模式.md) 91 | - [观察者模式 (Observer)](17.观察者模式.md) 92 | - [解释器模式 (Interpreter)](18.解释器模式.md) 93 | - [中介者模式 (Mediator)](19.中介者模式.md) 94 | - [职责链模式 (Chain of Responsibility)](20.职责链模式.md) 95 | - [备忘录模式 (Memento)](21.备忘录模式.md) 96 | - [策略模式 (Strategy)](22.策略模式.md) 97 | - [访问者模式 (Visitor)](23.访问者模式.md) 98 | - [状态模式 (State)](24.状态模式.md) 99 | 100 | ## 📚 资料 101 | 102 | - [《Head First 设计模式》](https://book.douban.com/subject/2243615/) 103 | - [《大话设计模式》](https://book.douban.com/subject/2334288/) 104 | 105 | ## 🚪 传送 106 | 107 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/99.解决方案/秒杀系统设计.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 秒杀系统设计 3 | date: 2018-07-05 15:11:00 4 | categories: 5 | - 设计 6 | - 架构 7 | - 解决方案 8 | tags: 9 | - 架构 10 | - 解决方案 11 | permalink: /pages/0e6f048d/ 12 | --- 13 | 14 | # 秒杀系统设计 15 | 16 | 秒杀系统所要应对的场景就是:**瞬时海量请求**。 17 | 18 | ## 秒杀系统的难点 19 | 20 | - 高并发:秒杀系统是极致的高并场景发自不用说。其高并发可以细分为二: 21 | - 并发读:主要是读取剩余库存量以及商品信息 22 | - 并发写:主要是下单后,系统写入订单记录 23 | - 超卖:秒杀系统中售卖的商品一般都是性价比很高,不怎么赚钱,甚至赔钱赚哟喝的商品。一旦出现超卖现象,会给商家带来巨大的经济损失。从系统层面来看,比如某秒杀商品本来库存 100 件,但是在高并发场景下,瞬时下单量超过 100 件,处理不当,让这些下单都成功了,就会出现超卖。 24 | - 恶意请求:有些人为了低价购入秒杀商品,通过在多台机器上跑脚本,模拟大量用户抢商品的请求(走自己的路,让别人无路可走)。 25 | - 数据库崩溃:海量请求下,如果没有 MQ 削峰,没有过载保护,让所有请求都打到数据库,那么数据库基本就挂了。数据库如果挂了,也会波及其他业务,从而可能让整个系统、网站陷入瘫痪。 26 | - 对现有业务造成冲击 27 | 28 | ## 秒杀系统的思考 29 | 30 | ### 稳准快 31 | 32 | 秒杀系统架构的思考角度可以概括为:**稳、准、快** 33 | 34 | - **稳(高可用)**:系统架构要满足高可用,系统要能撑住活动。 35 | - **准(一致性)**:商品减库存方式非常关键,不能出现超卖。 36 | - **快(高性能)**:整个请求链路,从前端到后端,依赖组件都要做到协同优化。 37 | 38 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200720073346.png) 39 | 40 | ## 前端优化 41 | 42 | ### 静态页面 43 | 44 | 把秒杀商品页面静态化,减少查数据库的 IO 开销。然后,可以将这些静态页面做 CDN 缓存,如果项目是前后端分离的,还可以在反向代理服务器侧设置静态缓存。 45 | 46 | 如每个商品都由 ID 来标识,那么 http://item.xxx.com/item.htm?id=xxxx 就可以作为唯一的 URL 标识。相应的页面可以提前做前端缓存,这样就不需要向后台查询商品信息。 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 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200720094300.png) 88 | 89 | ### 减库存 90 | 91 | #### 恶意下单 92 | 93 | 恶意下单的解决方案还是要结合安全和反作弊措施来制止: 94 | 95 | - 识别频繁下单不付款或重复下单不付款的卖家,阻断其下单。 96 | - 限制个人购买数 97 | 98 | #### 避免超卖 99 | 100 | 减库存在数据一致性上,主要就是保证大并发请求时库存数据不能为负数,也就是要保证数据库中的库存字段值不能为负数,一般我们有多种解决方案:一种是在应用程序中通过事务来判断,即保证减后库存不能为负数,否则就回滚;另一种办法是直接设置数据库的字段数据为无符号整数,这样减后库存字段值小于零时会直接执行 SQL 语句来报错;再有一种就是使用 CASE WHEN 判断语句,例如这样的 SQL 语句: 101 | 102 | ``` 103 | UPDATE item SET inventory = CASE WHEN inventory >= xxx THEN inventory-xxx ELSE inventory END 104 | ``` 105 | 106 | 在交易环节中,“库存”是个关键数据,也是个热点数据,因为交易的各个环节中都可能涉及对库存的查询。但是,我在前面介绍分层过滤时提到过,秒杀中并不需要对库存有精确的一致性读,把库存数据放到缓存(Cache)中,可以大大提升读性能。 107 | 108 | ### URL 动态化 109 | 110 | 通过 MD5 之类的加密算法加密随机的字符串去做 url,然后通过前端代码获取 url 后台校验才能通过。 111 | 112 | ## 参考资料 113 | 114 | - [如何设计一个秒杀系统](https://time.geekbang.org/column/intro/127) 115 | - [一个秒杀系统的设计思考](https://segmentfault.com/a/1190000020970562) -------------------------------------------------------------------------------- /source/_posts/01.Java/13.框架/01.Spring/01.Spring核心/06.SpringBean作用域.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Spring Bean 作用域 3 | date: 2022-12-21 11:42:00 4 | order: 06 5 | categories: 6 | - Java 7 | - 框架 8 | - Spring 9 | - Spring核心 10 | tags: 11 | - Java 12 | - 框架 13 | - Spring 14 | - Bean 15 | permalink: /pages/28438bc8/ 16 | --- 17 | 18 | # Spring Bean 作用域 19 | 20 | ## Spring Bean 作用域 21 | 22 | | 来源 | 说明 | 23 | | ----------- | ---------------------------------------------------------- | 24 | | singleton | 默认 Spring Bean 作用域,一个 BeanFactory 有且仅有一个实例 | 25 | | prototype | 原型作用域,每次依赖查找和依赖注入生成新 Bean 对象 | 26 | | request | 将 Spring Bean 存储在 ServletRequest 上下文中 | 27 | | session | 将 Spring Bean 存储在 HttpSession 中 | 28 | | application | 将 Spring Bean 存储在 ServletContext 中 | 29 | 30 | ## "singleton" Bean 作用域 31 | 32 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/20221221170833.png) 33 | 34 | ## "prototype" Bean 作用域 35 | 36 | Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录实例的存在。销毁回调方法将不会执行,可以利用 `BeanPostProcessor` 进行清扫工作。 37 | 38 | ## "request" Bean 作用域 39 | 40 | - 配置 41 | - XML - `` 42 | - Java 注解 - `@RequestScope` 或 `@Scope(WebApplicationContext.SCOPE_REQUEST)` 43 | - 实现 44 | - API - RequestScope 45 | 46 | ## "session" Bean 作用域 47 | 48 | - 配置 49 | - XML - `` 50 | - Java 注解 - `@SessionScope` 或 `@Scope(WebApplicationContext.SCOPE_SESSION)` 51 | - 实现 52 | - API - SessionScope 53 | 54 | ## "application" Bean 作用域 55 | 56 | - 配置 57 | - XML - `` 58 | - Java 注解 - `@ApplicationScope` 或 `@Scope(WebApplicationContext.SCOPE_APPLICATION)` 59 | - 实现 60 | - API - ServletContextScope 61 | 62 | ## 自定义 Bean 作用域 63 | 64 | - 实现 Scope 65 | 66 | - `org.springframework.beans.factory.config.Scope` 67 | 68 | - 注册 Scope 69 | 70 | - API - `org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope` 71 | 72 | - 配置 73 | 74 | ```xml 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | ``` 84 | 85 | ## 问题 86 | 87 | Spring 內建的 Bean 作用域有几种? 88 | 89 | singleton、prototype、request、session、application 以及 websocket 90 | 91 | singleton Bean 是否在一个应用是唯一的? 92 | 93 | 否。singleton bean 仅在当前 Spring IoC 容器(BeanFactory)中是单例对象。 94 | 95 | application Bean 是否可以被其他方案替代? 96 | 97 | 可以的,实际上,“application” Bean 与“singleton” Bean 没有本质区别 98 | 99 | ## 参考资料 100 | 101 | - [Spring 官方文档之 Core Technologies](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans) 102 | - [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265) -------------------------------------------------------------------------------- /source/_posts/11.算法/LSM树.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: LSM树 3 | date: 2022-03-16 09:27:21 4 | order: 04 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 树 10 | - LSM 树 11 | permalink: /pages/f6311f27/ 12 | --- 13 | 14 | # LSM 树 15 | 16 | ## 什么是 LSM 树 17 | 18 | LSM 树具有以下 3 个特点: 19 | 20 | 1. 将索引分为内存和磁盘两部分,并在内存达到阈值时启动树合并(Merge Trees); 21 | 2. 用批量写入代替随机写入,并且用预写日志 WAL 技术(Write AheadLog,预写日志技术)保证内存数据,在系统崩溃后可以被恢复; 22 | 3. 数据采取类似日志追加写的方式写入(Log Structured)磁盘,以顺序写的方式提高写 23 | 入效率。 24 | 25 | LSM 树的这些特点,使得它相对于 B+ 树,在写入性能上有大幅提升。所以,许多 NoSQL 系统都使用 LSM 树作为检索引擎,而且还对 LSM 树进行了优化以提升检索性能。 26 | 27 | LSM 树就是根据这个思路设计了这样一个机制:当数据写入时,延迟写磁盘,将数据先存放在内存中的树里,进行常规的存储和查询。当内存中的树持续变大达到阈值时,再批量地以块为单位写入磁盘的树中。因此,LSM 树至少需要由两棵树组成,一棵是存储在内存中较小的 C0 树,另一棵是存储在磁盘中较大的 C1 树。 28 | 29 | ### 如何将内存数据与磁盘数据合并 30 | 31 | 可以参考两个有序链表归并排序的过程,将 C0 树和 C1 树的所有叶子节点中存储的数据,看作是两个有序链表,那滚动合并问题就变成了我们熟悉的两个有序链表的归并问题。不过由于涉及磁盘操作,那为了提高写入效率和检索效率,我们还需要针对磁盘的特性,在一些归并细节上进行优化。 32 | 33 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220316105440.png) 34 | 35 | 由于磁盘具有顺序读写效率高的特性,因此,为了提高 C1 树中节点的读写性能,除了根节点以外的节点都要尽可能地存放到连续的块中,让它们能作为一个整体单位来读写。这种包含多个节点的块就叫作多页块(Multi-Pages Block)。 36 | 37 | 第一步,以多页块为单位,将 C1 树的当前叶子节点从前往后读入内存。读入内存的多页块,叫作清空块(Emptying Block),意思是处理完以后会被清空。 38 | 39 | 第二步,将 C0 树的叶子节点和清空块中的数据进行归并排序,把归并的结果写入内存的一个新块中,叫作填充块(Filling Block)。 40 | 41 | 第三步,如果填充块写满了,我们就要将填充块作为新的叶节点集合顺序写入磁盘。这个时候,如果 C0 树的叶子节点和清空块都没有遍历完,我们就继续遍历归并,将数据写入新的填充块。如果清空块遍历完了,我们就去 C1 树中顺序读取新的多页块,加载到清空块中。 42 | 43 | 第四步,重复第三步,直到遍历完 C0 树和 C1 树的所有叶子节点,并将所有的归并结果写入到磁盘。这个时候,我们就可以同时删除 C0 树和 C1 树中被处理过的叶子节点。这样就完成了滚动归并的过程。 44 | 45 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220316110736.png) 46 | 47 | ### LSM 树是如何检索 48 | 49 | 因为同时存在 C0 和 C1 树,所以要查询一个 key 时,我们会先到 C0 树中查询。如果查询到了则直接返回;如过没有查询到,则查询 C1 树。 50 | 51 | 需要注意一种特殊情况:删除操作。假设某数据在 C0 树中被删除了,但是在 C1 树中仍存在。这此时查询时,可以在 C1 树中查到这个 key,这其实是过期数据了,如何应对这种情况呢?对于被删除的数据,可以将这些数据的 key 插入到 C0 树中,并标记一个删除标志。如果查到了一个带着删除标志的 key,就直接返回查询失败。 52 | 53 | ## 为什么需要 LSM 树 54 | 55 | 在关系型数据库中,通常使用 B+ 树作为索引。B+ 树的数据都存储在叶子节点中,而叶子节点一般都存储在磁盘中。因此,每次插入的新数据都需要随机写入磁盘,而随机写入的性能非常慢。如果是一个日志系统,每秒钟要写入上千条甚至上万条数据,这样的磁盘操作代价会使得系统性能急剧下降,甚至无法使用。 56 | 57 | 操作系统对磁盘的读写是以块为单位的,我们能否以块为单位写入,而不是每次插入一个数据都要随机写入磁盘呢?这样是不是就可以大幅度减少写入操作了呢?解决方案就是:**LSM 树**(Log Structured Merge Trees)。 58 | 59 | ## WAL 技术 60 | 61 | LSM 树至少需要由两棵树组成,一棵是存储在内存中较小的 C0 树,另一棵是存储在磁盘中较大的 C1 树。 62 | 63 | 如果机器断电或系统崩溃了,那内存中还未写入磁盘的数据岂不就永远丢失了?这种情况我们该如何解决呢? 64 | 65 | 为了保证内存中的数据在系统崩溃后能恢复,可以使用 WAL 技术(Write Ahead Log,预写日志技术)将数据第一时间高效写入磁盘进行备份。 66 | 67 | WAL 技术保存和恢复数据的具体步骤如下: 68 | 69 | 1. 内存中的程序在处理数据时,会先将对数据的修改作为一条记录,顺序写入磁盘的 log 文件作为备份。由于磁盘文件的顺序追加写入效率很高,因此许多应用场景都可以接受这种备份处理。 70 | 2. 在数据写入 log 文件后,备份就成功了。接下来,该数据就可以长期驻留在内存中了。 71 | 3. 系统会周期性地检查内存中的数据是否都被处理完了(比如,被删除或者写入磁盘),并且生成对应的检查点(Check Point)记录在磁盘中。然后,我们就可以随时删除被处理完的数据了。这样一来,log 文件就不会无限增长了。 72 | 4. 系统崩溃重启,我们只需要从磁盘中读取检查点,就能知道最后一次成功处理的数据在 log 文件中的位置。接下来,我们就可以把这个位置之后未被处理的数据,从 log 文件中读出,然后重新加载到内存中。 73 | 74 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220316104837.png) 75 | 76 | ## 参考资料 77 | 78 | - [检索技术核心 20 讲](https://time.geekbang.org/column/intro/100048401) -------------------------------------------------------------------------------- /source/_posts/02.编程/03.Python/01.基础特性/04.Python控制语句.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Python 控制语句 3 | date: 2024-03-28 08:20:21 4 | order: 04 5 | categories: 6 | - 编程 7 | - Python 8 | - 基础特性 9 | tags: 10 | - Python 11 | permalink: /pages/ae1e5524/ 12 | --- 13 | 14 | # Python 控制语句 15 | 16 | ## 选择语句 17 | 18 | Python 的选择语句的语法格式为:`if...elif...else` 语句。 19 | 20 | - `if` 语句至多有 1 个 `else` 语句,`else` 语句在所有的 `elif` 语句之后。 21 | - `if` 语句可以有若干个 `elif` 语句,它们必须在 `else` 语句之前。 22 | - 一旦其中一个 `elif` 语句检测为 `true`,其他的 `elif` 以及 `else` 语句都将跳过执行。 23 | 24 | ```python 25 | code = 3 26 | if code == 0: 27 | print("code == 0") 28 | elif code == 1: 29 | print("code == 1") 30 | else: 31 | print("code != 0 && code != 1") 32 | # 输出 33 | # code != 0 && code != 1 34 | ``` 35 | 36 | ## 循环语句 37 | 38 | ### while 循环 39 | 40 | 只要布尔表达式为 `true`,`while` 循环体会一直执行下去。 41 | 42 | ```python 43 | count = 1 44 | while (count <= 5): 45 | print('count = ', count) 46 | count = count + 1 47 | # 输出 48 | # count = 1 49 | # count = 2 50 | # count = 3 51 | # count = 4 52 | # count = 5 53 | ``` 54 | 55 | ### for 循环 56 | 57 | for 循环可以遍历任何的序列对象或可迭代对象。 58 | 59 | 【示例】遍历字符串字符 60 | 61 | ```python 62 | for letter in 'python': 63 | print("char: %s" % letter) 64 | # 输出 65 | # char: p 66 | # char: y 67 | # char: t 68 | # char: h 69 | # char: o 70 | # char: n 71 | ``` 72 | 73 | 【示例】遍历数组 74 | 75 | ```python 76 | colors = ['red', 'yellow', 'blue'] 77 | for color in colors: 78 | print('color: %s' % color) 79 | # 输出 80 | # color: red 81 | # color: yellow 82 | # color: blue 83 | ``` 84 | 85 | 【示例】遍历指定整数范围 86 | 87 | ```python 88 | for num in range(1, 10): 89 | if num % 2 == 0: 90 | print('num = ', num) 91 | # 输出 92 | # num = 2 93 | # num = 4 94 | # num = 6 95 | # num = 8 96 | ``` 97 | 98 | ## 中断语句 99 | 100 | ### break 语句 101 | 102 | `break` 语句用来终止循环语句,即循环条件没有 False 条件或者序列还没被完全递归完,也会停止执行循环语句。 103 | 104 | `break` 语句用在 `while` 和 `for` 循环中。 105 | 106 | 【示例】遍历字符串,找到指定字母的位置后退出 107 | 108 | ```python 109 | pos = 0 110 | for letter in 'python': 111 | if letter == 'h': 112 | print('h pos: ', pos) 113 | break 114 | else: 115 | pos += 1 116 | # 输出 117 | # h pos: 3 118 | ``` 119 | 120 | ### continue 语句 121 | 122 | 使用 `continue` 语句意味着跳过当前循环的剩余语句,然后继续进行下一轮循环。 123 | 124 | `continue` 语句用在 `while` 和 `for` 循环中。 125 | 126 | ```python 127 | num = 1 128 | for num in range(1, 10): 129 | if num % 2 == 0: 130 | continue 131 | else: 132 | print(f'num = {num}') 133 | # 输出 134 | # num = 1 135 | # num = 3 136 | # num = 5 137 | # num = 7 138 | # num = 9 139 | ``` 140 | 141 | ### pass 语句 142 | 143 | Python pass 是空语句,是为了保持程序结构的完整性。 144 | 145 | `pass` 不做任何事情,一般用做占位语句。 146 | 147 | ```python 148 | # pass 语句 149 | age = 65 150 | if age < 18: 151 | print("未成年") 152 | elif age >= 18 and age < 30: 153 | print("成年人") 154 | elif age >= 30 and age < 65: 155 | pass 156 | else: 157 | print("老年人") 158 | ``` 159 | 160 | ## 参考资料 161 | 162 | - [菜鸟-基础教程](https://www.runoob.com/python/python-tutorial.html) -------------------------------------------------------------------------------- /source/_posts/12.数据库/05.KV数据库/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: KV 数据库 3 | date: 2023-09-08 15:52:57 4 | categories: 5 | - 数据库 6 | - KV数据库 7 | tags: 8 | - 数据库 9 | - KV数据库 10 | permalink: /pages/c6629edb/ 11 | hidden: true 12 | index: false 13 | --- 14 | 15 | # KV 数据库 16 | 17 | ## 📖 内容 18 | 19 | ### [Redis](redis) 20 | 21 | - [Redis 基本数据类型](redis/Redis_数据类型.md) - 关键词:`String`、`Hash`、`List`、`Set`、`Zset` 22 | - [Redis 高级数据类型](redis/Redis_数据类型二.md) - 关键词:`BitMap`、`HyperLogLog`、`Geo`、`Stream` 23 | - [Redis 数据结构](redis/Redis_数据结构.md) - 关键词:`对象`、`SDS`、`链表`、`字典`、`跳表`、`整数集合`、`压缩列表` 24 | - [Redis 内存管理](redis/Redis_内存管理.md) - 关键词:`定时删除`、`惰性删除`、`定期删除`、`LRU`、`LFU` 25 | - [Redis 持久化](redis/Redis_持久化.md) - 关键词:`RDB`、`AOF`、`SAVE`、`BGSAVE`、`appendfsync` 26 | - [Redis 事件](redis/Redis_事件.md) - 关键词:`文件事件`、`时间事件` 27 | - [Redis 复制](redis/Redis_复制.md) - 关键词:`SLAVEOF`、`SYNC`、`PSYNC`、`命令传播`、`心跳` 28 | - [Redis 哨兵](redis/Redis_哨兵.md) - 关键词:`高可用`、`监控`、`选主`、`故障转移`、`Raft` 29 | - [Redis 集群](redis/Redis_集群.md) - 关键词:`高可用`、`监控`、`选主`、`故障转移`、`分区`、`Raft`、`Gossip` 30 | - [Redis 订阅](redis/Redis_订阅.md) - 关键词:`订阅`、`SUBSCRIBE`、`PSUBSCRIBE`、`PUBLISH`、`观察者模式` 31 | - [Redis 独立功能](redis/Redis_事务.md) - 关键词:`事务`、`ACID`、`MULTI`、`EXEC`、`DISCARD`、`WATCH` 32 | - [Redis 管道](redis/Redis_管道.md) - 关键词:`Pipeline` 33 | - [Redis 脚本](redis/Redis_脚本.md) - 关键词:`Lua` 34 | - [Redis 运维](redis/Redis_运维.md) - 关键词:`安装`、`配置`、`命令`、`集群`、`客户端` 35 | - [Redis 实战](redis/Redis_实战.md) - 关键词:`缓存`、`分布式锁`、`布隆过滤器` 36 | - [Redis 面试](redis/Redis_面试.md) - 关键词:`面试` 37 | - [Redis 面试之数据类型篇](redis/Redis_面试_数据类型.md) - 关键词:`面试` 38 | - [Redis 面试之应用篇](redis/Redis_面试_应用.md) - 关键词:`面试` 39 | 40 | ### [Memcached](Memcached) 41 | 42 | ## 📚 资料 43 | 44 | ### Redis 资料 45 | 46 | - **官网** 47 | - [Redis 官网](https://redis.io/) 48 | - [Redis Github](https://github.com/antirez/redis) 49 | - [Redis 官方文档中文版](http://redis.cn/) 50 | - [Redis 在线环境](https://try.redis.io/) 51 | - **书籍** 52 | - [《Redis 实战》](https://item.jd.com/11791607.html) 53 | - [《Redis 设计与实现》](https://item.jd.com/11486101.html) 54 | - **教程** 55 | - [Redis 命令参考](http://redisdoc.com/) 56 | - **文章** 57 | - [Introduction to Redis](https://www.slideshare.net/dvirsky/introduction-to-redis) 58 | - [《我们一起进大厂》系列- Redis 基础](https://juejin.im/post/5db66ed9e51d452a2f15d833) 59 | - **源码** 60 | - [《Redis 实战》配套 Python 源码](https://github.com/josiahcarlson/redis-in-action) 61 | - **资源汇总** 62 | - [awesome-redis](https://github.com/JamzyWang/awesome-redis) 63 | - **Redis Client** 64 | - [spring-data-redis 官方文档](https://docs.spring.io/spring-data/redis/docs/1.8.13.RELEASE/reference/html/) 65 | - [Redisson 官方文档(中文,略有滞后)](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) 66 | - [Redisson 官方文档(英文)](https://github.com/redisson/redisson/wiki/Table-of-Content) 67 | - [CRUG | Redisson PRO vs. Jedis: Which Is Faster? 翻译](https://www.jianshu.com/p/82f0d5abb002) 68 | - [redis 分布锁 Redisson 性能测试](https://blog.csdn.net/everlasting_188/article/details/51073505) 69 | - [RedisDesktopManager](https://github.com/uglide/RedisDesktopManager) 70 | 71 | ## 🚪 传送 72 | 73 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/01.Java/12.工具/99.其他/07.Zxing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ZXing 快速入门 3 | date: 2022-02-17 22:34:30 4 | order: 07 5 | categories: 6 | - Java 7 | - 工具 8 | - 其他 9 | tags: 10 | - Java 11 | - 条形码 12 | - ZXing 13 | permalink: /pages/c0f3f9b8/ 14 | --- 15 | 16 | # ZXing 快速入门 17 | 18 | ## 简介 19 | 20 | `ZXing` 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码。目标是能够对 QR 编码、Data Matrix、UPC 的 1D 条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE 和 Android。 21 | 22 | 官网:[ZXing github 仓库](https://github.com/zxing/zxing) 23 | 24 | ## 实战 25 | 26 | **_本例演示如何在一个非 android 的 Java 项目中使用 ZXing 来生成、解析二维码图片。_** 27 | 28 | ### 安装 29 | 30 | maven 项目只需引入依赖: 31 | 32 | ```xml 33 | 34 | com.google.zxing 35 | core 36 | 3.3.0 37 | 38 | 39 | com.google.zxing 40 | javase 41 | 3.3.0 42 | 43 | ``` 44 | 45 | 如果非 maven 项目,就去官网下载发布版本:[下载地址](https://github.com/zxing/zxing/releases) 46 | 47 | ### 生成二维码图片 48 | 49 | ZXing 生成二维码图片有以下步骤: 50 | 51 | 1. `com.google.zxing.MultiFormatWriter` 根据内容以及图像编码参数生成图像 2D 矩阵。 52 | 2. ​ `com.google.zxing.client.j2se.MatrixToImageWriter` 根据图像矩阵生成图片文件或图片缓存 `BufferedImage` 。 53 | 54 | ```java 55 | public void encode(String content, String filepath) throws WriterException, IOException { 56 | int width = 100; 57 | int height = 100; 58 | Map encodeHints = new HashMap(); 59 | encodeHints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 60 | BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, encodeHints); 61 | Path path = FileSystems.getDefault().getPath(filepath); 62 | MatrixToImageWriter.writeToPath(bitMatrix, "png", path); 63 | } 64 | ``` 65 | 66 | ### 解析二维码图片 67 | 68 | ZXing 解析二维码图片有以下步骤: 69 | 70 | 1. 使用 `javax.imageio.ImageIO` 读取图片文件,并存为一个 `java.awt.image.BufferedImage` 对象。 71 | 72 | 2. 将 `java.awt.image.BufferedImage` 转换为 ZXing 能识别的 `com.google.zxing.BinaryBitmap` 对象。 73 | 74 | 3. `com.google.zxing.MultiFormatReader` 根据图像解码参数来解析 `com.google.zxing.BinaryBitmap` 。 75 | 76 | ```java 77 | public String decode(String filepath) throws IOException, NotFoundException { 78 | BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filepath)); 79 | LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); 80 | Binarizer binarizer = new HybridBinarizer(source); 81 | BinaryBitmap bitmap = new BinaryBitmap(binarizer); 82 | HashMap decodeHints = new HashMap(); 83 | decodeHints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); 84 | Result result = new MultiFormatReader().decode(bitmap, decodeHints); 85 | return result.getText(); 86 | } 87 | ``` 88 | 89 | 完整参考示例:[测试例代码](https://github.com/dunwu/JavaParty/blob/master/toolbox/image/src/test/java/org/zp/image/QRCodeUtilTest.java) 90 | 91 | 以下是一个生成的二维码图片示例: 92 | 93 | ![img](http://upload-images.jianshu.io/upload_images/3101171-26b73730088f0ab8.png) 94 | 95 | ## 参考 96 | 97 | [ZXing github 仓库](https://github.com/zxing/zxing) -------------------------------------------------------------------------------- /source/_posts/11.算法/栈和队列.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 栈和队列 3 | date: 2014-01-25 16:46:13 4 | order: 02 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 线性表 10 | - 栈 11 | - 队列 12 | permalink: /pages/4f160a46/ 13 | --- 14 | 15 | # 栈和队列 16 | 17 | > **队列**和**栈**都是**操作受限**的**线性表**:前者先进先出,后者先进后出。 18 | 19 | ## 栈 20 | 21 | ### 栈是什么 22 | 23 | 在 **LIFO(后进先出)** 数据结构中,将首先处理添加到队列中的最新元素。 24 | 25 | **栈是一个 LIFO(后进先出) 数据结构**。**栈是一种“操作受限”的线性表**,只允许在一端插入和删除数据。通常,插入操作在栈中被称作入栈 push 。与队列类似,总是在堆栈的末尾添加一个新元素。但是,删除操作,退栈 pop ,将始终删除队列中相对于它的最后一个元素。 26 | 27 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220320200148.png) 28 | 29 | **当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构**。 30 | 31 | 从栈的定义可以看出,栈只支持两个基本操作:**入栈 `push()`** 和 **出栈 `pop()`** ,也就是在栈顶插入一个数据和从栈顶删除一个数据。在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 `O(1)`。 32 | 33 | 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作**顺序栈**,用链表实现的栈,我们叫作**链式栈**。 34 | 35 | ### 为什么需要栈 36 | 37 | 相比数组和链表,栈只是对操作进行了限制,似乎并没有任何优势。为什么不直接使用数组或者链表?为什么还要用这个“操作受限”的“栈”呢? 38 | 39 | 特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。 40 | 41 | ### 栈的应用场景 42 | 43 | (1)**函数调用栈** 44 | 45 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220310091000.jpg) 46 | 47 | (2)**表达式求值** 48 | 49 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220310091100.jpg) 50 | 51 | (3)**表达式匹配** 52 | 53 | 可以借助栈来检查表达式中的括号是否匹配 54 | 55 | ## 队列 56 | 57 | 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素。 58 | 59 | 队列是典型的 FIFO 数据结构。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾。 删除(delete)操作也被称为出队(dequeue)。 你只能移除第一个元素。 60 | 61 | ### 什么是队列 62 | 63 | **队列:先进先出的线性表**。 64 | 65 | **队列是一种“操作受限”的线性表**,只允许在一端插入数据,在另一端删除数据。 66 | 67 | 队列的最基本操作:**入队 `enqueue()`**,放一个数据到队列尾部;**出队 `dequeue()`**,从队列头部取一个元素。 68 | 69 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220320200213.png) 70 | 71 | 队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作**顺序队列**,用链表实现的队列叫作**链式队列**。 72 | 73 | 队满的判断条件是 `tail == n`,队空的判断条件是 `head == tail`。 74 | 75 | ### 循环队列 76 | 77 | 循环队列是一种较为特殊的队列。 78 | 79 | 循环队列的要点是确定好 **队空和队满的判定条件**。 80 | 81 | 在用数组实现的非循环队列中,队满的判断条件是 `(tail+1) % n == head`,队空的判断条件是 `head == tail`。 82 | 83 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220322214822.png) 84 | 85 | ### 为什么需要队列 86 | 87 | 为什么需要队列和为什么需要栈,是同样的道理,参考 为什么需要栈 88 | 89 | ### 队列的应用场景 90 | 91 | (1)**阻塞队列** 92 | 93 | **阻塞队列**其实就是在队列基础上增加了阻塞操作。简单来说,就是: 94 | 95 | - 在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回; 96 | - 如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回。 97 | 98 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220310092908.jpg) 99 | 100 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220310093026.jpg) 101 | 102 | (2)**并发队列** 103 | 104 | 线程安全的队列我们叫作**并发队列**。最简单直接的实现方式是直接在 enqueue()、dequeue() 方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作。实际上,基于数组的循环队列,利用 CAS 原子操作,可以实现非常高效的并发队列。这也是循环队列比链式队列应用更加广泛的原因。 105 | 106 | ## 参考资料 107 | 108 | - [数据结构与算法之美](https://time.geekbang.org/column/intro/100017301) 109 | - [Leetcode:栈和队列](https://leetcode-cn.com/leetbook/detail/queue-stack/) -------------------------------------------------------------------------------- /source/_posts/12.数据库/05.KV数据库/redis/Redis_脚本.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:redis 3 | title: Redis 脚本 4 | date: 2020-01-30 21:48:57 5 | categories: 6 | - 数据库 7 | - KV数据库 8 | - redis 9 | tags: 10 | - 数据库 11 | - KV数据库 12 | - redis 13 | - lua 14 | permalink: /pages/e524b647/ 15 | --- 16 | 17 | # Redis 脚本 18 | 19 | > Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。 20 | > 21 | > 关键词:`Lua` 22 | 23 | ## 为什么使用 Lua 24 | 25 | Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 26 | 27 | 在 Redis 中,执行单一命令是原子性操作,所以不会出现并发问题。但有的业务场景下,需要执行多个命令,同时确保不出现并发问题,这就需要用到 Lua 脚本了。 28 | 29 | **Redis 执行 Lua 是原子操作**。因为 Redis 使用串行化的方式来执行 Redis 命令, 所以在任何特定时间里, 最多都只会有一个脚本能够被放进 Lua 环境里面运行, 因此, 整个 Redis 服务器只需要创建一个 Lua 环境即可。 30 | 31 | 由于,Redis 执行 Lua 具有原子性,所以常被用于需要原子性执行多命令的场景。 32 | 33 | ## Redis 脚本命令 34 | 35 | | 命令 | 说明 | 36 | | --------------- | -------------------------------------------------------------------------------------------------------------------- | 37 | | `EVAL` | `EVAL` 命令为客户端输入的脚本在 Lua 环境中定义一个函数, 并通过调用这个函数来执行脚本。 | 38 | | `EVALSHA` | `EVALSHA` 命令通过直接调用 Lua 环境中已定义的函数来执行脚本。 | 39 | | `SCRIPT_FLUSH` | `SCRIPT_FLUSH` 命令会清空服务器 `lua_scripts` 字典中保存的脚本, 并重置 Lua 环境。 | 40 | | `SCRIPT_EXISTS` | `SCRIPT_EXISTS` 命令接受一个或多个 SHA1 校验和为参数, 并通过检查 `lua_scripts` 字典来确认校验和对应的脚本是否存在。 | 41 | | `SCRIPT_LOAD` | `SCRIPT_LOAD` 命令接受一个 Lua 脚本为参数, 为该脚本在 Lua 环境中创建函数, 并将脚本保存到 `lua_scripts` 字典中。 | 42 | | `SCRIPT_KILL` | `SCRIPT_KILL` 命令用于停止正在执行的脚本。 | 43 | 44 | ## Redis 执行 Lua 的工作流程 45 | 46 | 为了在 Redis 服务器中执行 Lua 脚本, Redis 在服务器内嵌了一个 Lua 环境(environment), 并对这个 Lua 环境进行了一系列修改, 从而确保这个 Lua 环境可以满足 Redis 服务器的需要。 47 | 48 | Redis 服务器创建并修改 Lua 环境的整个过程由以下步骤组成: 49 | 50 | 1. 创建一个基础的 Lua 环境, 之后的所有修改都是针对这个环境进行的。 51 | 2. 载入多个函数库到 Lua 环境里面, 让 Lua 脚本可以使用这些函数库来进行数据操作。 52 | 3. 创建全局表格 `redis` , 这个表格包含了对 Redis 进行操作的函数, 比如用于在 Lua 脚本中执行 Redis 命令的 `redis.call` 函数。 53 | 4. 使用 Redis 自制的随机函数来替换 Lua 原有的带有副作用的随机函数, 从而避免在脚本中引入副作用。 54 | 5. 创建排序辅助函数, Lua 环境使用这个辅佐函数来对一部分 Redis 命令的结果进行排序, 从而消除这些命令的不确定性。 55 | 6. 创建 `redis.pcall` 函数的错误报告辅助函数, 这个函数可以提供更详细的出错信息。 56 | 7. 对 Lua 环境里面的全局环境进行保护, 防止用户在执行 Lua 脚本的过程中, 将额外的全局变量添加到了 Lua 环境里面。 57 | 8. 将完成修改的 Lua 环境保存到服务器状态的 `lua` 属性里面, 等待执行服务器传来的 Lua 脚本。 58 | 59 | ## Redis 执行 Lua 的要点 60 | 61 | - Redis 服务器专门使用一个伪客户端来执行 Lua 脚本中包含的 Redis 命令。 62 | - Redis 使用脚本字典来保存所有被 `EVAL` 命令执行过, 或者被 `SCRIPT_LOAD` 命令载入过的 Lua 脚本, 这些脚本可以用于实现 `SCRIPT_EXISTS` 命令, 以及实现脚本复制功能。 63 | - 服务器在执行脚本之前, 会为 Lua 环境设置一个超时处理钩子, 当脚本出现超时运行情况时, 客户端可以通过向服务器发送 `SCRIPT_KILL` 命令来让钩子停止正在执行的脚本, 或者发送 `SHUTDOWN nosave` 命令来让钩子关闭整个服务器。 64 | - 主服务器复制 `EVAL` 、 `SCRIPT_FLUSH` 、 `SCRIPT_LOAD` 三个命令的方法和复制普通 Redis 命令一样 —— 只要将相同的命令传播给从服务器就可以了。 65 | - 主服务器在复制 `EVALSHA` 命令时, 必须确保所有从服务器都已经载入了 `EVALSHA` 命令指定的 SHA1 校验和所对应的 Lua 脚本, 如果不能确保这一点的话, 主服务器会将 `EVALSHA` 命令转换成等效的 `EVAL` 命令, 并通过传播 `EVAL` 命令来获得相同的脚本执行效果。 66 | 67 | ## 参考资料 68 | 69 | - [《Redis 设计与实现》](https://item.jd.com/11486101.html) -------------------------------------------------------------------------------- /source/_posts/11.算法/字典树.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 字典树 3 | date: 2022-03-13 22:37:27 4 | order: 05 5 | categories: 6 | - 算法 7 | tags: 8 | - 数据结构 9 | - 树 10 | - 字典树 11 | permalink: /pages/0b76f5e5/ 12 | --- 13 | 14 | # 字典树 15 | 16 | ## 什么是字典树 17 | 18 | Trie 树(又叫“前缀树”或“字典树”)是一种用于快速查询“某个字符串/字符前缀”是否存在的数据结构。 19 | 20 | - 根节点(Root)不包含字符,除根节点外的每一个节点都仅包含一个字符; 21 | - 从根节点到某一节点路径上所经过的字符连接起来,即为该节点对应的字符串; 22 | - 任意节点的所有子节点所包含的字符都不相同; 23 | 24 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220313181057.jpg) 25 | 26 | ### 字典树的构造 27 | 28 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220313181243.jpg) 29 | 30 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220313181425.jpg) 31 | 32 | 构建 Trie 树的过程,需要扫描所有的字符串,时间复杂度是 O(n)(n 表示所有字符串的长度和)。 33 | 34 | **字典树非常耗费内存**。 35 | 36 | 用数组来存储一个节点的子节点的指针。如果字符串中包含从 a 到 z 这 26 个字符,那每个节点都要存储一个长度为 26 的数组,并且每个数组存储一个 8 字节指针(或者是 4 字节,这个大小跟 CPU、操作系统、编译器等有关)。而且,即便一个节点只有很少的子节点,远小于 26 个,比如 3、4 个,我们也要维护一个长度为 26 的数组。 37 | 38 | 用数组来存储一个节点的子节点的指针。如果字符串中包含从 a 到 z 这 26 个字符,那每个节点都要存储一个长度为 26 的数组,并且每个数组存储一个 8 字节指针(或者是 4 字节,这个大小跟 CPU、操作系统、编译器等有关)。而且,即便一个节点只有很少的子节点,远小于 26 个,比如 3、4 个,我们也要维护一个长度为 26 的数组。 39 | 40 | 用数组来存储一个节点的子节点的指针。如果字符串中包含从 a 到 z 这 26 个字符,那每个节点都要存储一个长度为 26 的数组,并且每个数组存储一个 8 字节指针(或者是 4 字节,这个大小跟 CPU、操作系统、编译器等有关)。而且,即便一个节点只有很少的子节点,远小于 26 个,比如 3、4 个,我们也要维护一个长度为 26 的数组。 41 | 42 | ### 字典树的查找 43 | 44 | 1. 每次从根结点开始搜索; 45 | 2. 获取关键词的第一个字符,根据该字符选择对应的子节点,转到该子节点继续检索; 46 | 3. 在相应的子节点上,获取关键词的第二个字符,进一步选择对应的子节点进行检索; 47 | 4. 以此类推,进行迭代过程; 48 | 5. 在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,查找完成。 49 | 50 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220313181305.jpg) 51 | 52 | 每次查询时,如果要查询的字符串长度是 k,那我们只需要比对大约 k 个节点,就能完成查询操作。跟原本那组字符串的长度和个数没有任何关系。所以说,构建好 Trie 树后,在其中查找字符串的时间复杂度是 O(k),k 表示要查找的字符串的长度。 53 | 54 | ## 字典树的应用场景 55 | 56 | 在一组字符串中查找字符串,Trie 树实际上表现得并不好。它对要处理的字符串有及其严苛的要求。 57 | 58 | 第一,字符串中包含的字符集不能太大。我们前面讲到,如果字符集太大,那存储空间可能就会浪费很多。即便可以优化,但也要付出牺牲查询、插入效率的代价。 59 | 60 | 第二,要求字符串的前缀重合比较多,不然空间消耗会变大很多。 61 | 62 | 第三,如果要用 Trie 树解决问题,那我们就要自己从零开始实现一个 Trie 树,还要保证没有 bug,这个在工程上是将简单问题复杂化,除非必须,一般不建议这样做。 63 | 64 | 第四,我们知道,通过指针串起来的数据块是不连续的,而 Trie 树中用到了指针,所以,对缓存并不友好,性能上会打个折扣。 65 | 66 | 在一组字符串中查找字符串,Trie 树实际上表现得并不好。它对要处理的字符串有及其严苛的要求。 67 | 68 | 在一组字符串中查找字符串,Trie 树实际上表现得并不好。它对要处理的字符串有及其严苛的要求。 69 | 70 | (1)自动补全 71 | 72 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200305095300.png) 73 | 74 | (2)拼写检查 75 | 76 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200305101637.png) 77 | 78 | (3)IP 路由 (最长前缀匹配) 79 | 80 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200305102959.gif) 81 | 82 | 图 3. 使用 Trie 树的最长前缀匹配算法,Internet 协议(IP)路由中利用转发表选择路径。 83 | 84 | (4)T9 (九宫格) 打字预测 85 | 86 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200305103047.jpg) 87 | 88 | (5)单词游戏 89 | 90 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200305103052.png) 91 | 92 | Trie 树可通过剪枝搜索空间来高效解决 Boggle 单词游戏 93 | 94 | ## 参考资料 95 | 96 | - [数据结构与算法之美](https://time.geekbang.org/column/intro/100017301) 97 | - https://leetcode-cn.com/problems/implement-trie-prefix-tree/solution/shi-xian-trie-qian-zhui-shu-by-leetcode/ -------------------------------------------------------------------------------- /source/_posts/01.Java/11.软件/03.监控诊断/02.CAT.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CAT 快速入门 3 | date: 2020-02-11 17:48:32 4 | order: 02 5 | categories: 6 | - Java 7 | - 软件 8 | - 监控诊断 9 | tags: 10 | - Java 11 | - 监控 12 | - CAT 13 | permalink: /pages/48726db7/ 14 | --- 15 | 16 | # CAT 快速入门 17 | 18 | ## CAT 简介 19 | 20 | CAT(Central Application Tracking),是基于 Java 开发的分布式实时监控系统。CAT 在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案。CAT 目前在美团的产品定位是应用层的统一监控组件,基本接入了美团所有核心应用,在中间件(RPC、数据库、缓存、MQ 等)框架中得到广泛应用,为各业务线提供系统的性能指标、健康状况、实时告警等。 21 | 22 | ### CAT 的优势 23 | 24 | - 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中 25 | - 全量数据:最开始的设计目标就是全量采集,全量的好处有很多 26 | - 高可用:所有应用都倒下了,需要监控还站着,并告诉工程师发生了什么,做到故障还原和问题定位 27 | - 故障容忍:CAT 本身故障不应该影响业务正常运转,CAT 挂了,应用不该受影响,只是监控能力暂时减弱 28 | - 高吞吐:要想还原真相,需要全方位地监控和度量,必须要有超强的处理吞吐能力 29 | - 可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统 30 | 31 | ### 支持的消息类型 32 | 33 | CAT 监控系统将每次 URL、Service 的请求内部执行情况都封装为一个完整的消息树、消息树可能包括 Transaction、Event、Heartbeat、Metric 等信息。 34 | 35 | - **Transaction** 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction 用来记录一段代码的执行时间和次数 36 | - **Event** 用来记录一件事发生的次数,比如记录系统异常,它和 transaction 相比缺少了时间的统计,开销比 transaction 要小 37 | - **Heartbeat** 表示程序内定期产生的统计信息, 如 CPU 利用率, 内存利用率, 连接池状态, 系统负载等 38 | - **Metric** 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为 1 分钟 39 | 40 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211174235.png) 41 | 42 | ## CAT 部署 43 | 44 | Cat 部署可以参考 [官方 Wiki - 服务端部署](https://github.com/dianping/cat/wiki/readme_server) ,非常详细,不赘述。 45 | 46 | ## CAT 报表 47 | 48 | 与其他监控工具(如 Zipkin、SkyWalking)相比,CAT 的报表功能最丰富。支持以下报表类型: 49 | 50 | - **[Transaction 报表](https://github.com/dianping/cat/wiki/transaction)** - 一段代码运行时间、次数,比如 URL、Cache、SQL 执行次数和响应时间 51 | - **[Event 报表](https://github.com/dianping/cat/wiki/event)** - 一行代码运行次数,比如出现一个异常 52 | - **[Problem 报表](https://github.com/dianping/cat/wiki/problem)** - 根据 Transaction/Event 数据分析出来系统可能出现的异常,包括访问较慢的程序等 53 | - **[Heartbeat 报表](https://github.com/dianping/cat/wiki/heartbeat)** - JVM 内部一些状态信息,比如 Memory,Thread 等 54 | - **[Business 报表](https://github.com/dianping/cat/wiki/business)** - 业务监控报表,比如订单指标,支付等业务指标 55 | 56 | ## CAT 配置 57 | 58 | CAT 提供了以下配置: 59 | 60 | - **[项目配置](https://github.com/dianping/cat/wiki/project)** 包括项目基本信息、机器分组配置 61 | - **[告警配置](https://github.com/dianping/cat/wiki/alarm)** 包括基本告警配置、告警规则、以及具体告警配置 62 | - **[全局配置](https://github.com/dianping/cat/wiki/global)** 包括服务端配置、消息采样配置、客户端路由 63 | - **[业务指标](https://github.com/dianping/cat/wiki/business)** 包括业务监控配置、业务标签配置 64 | 65 | ## CAT 架构 66 | 67 | CAT 主要分为三个模块: 68 | 69 | - **cat-client** - 提供给业务以及中间层埋点的底层 SDK。 70 | - **cat-consumer** - 用于实时分析从客户端的提供的数据。 71 | - **cat-home** - 作为用户提供给用户的展示的控制端。 72 | 73 | 在实际开发和部署中,cat-consumer 和 cat-home 是部署在一个 jvm 内部,每个 CAT 服务端都可以作为 consumer 也可以作为 home,这样既能减少整个 CAT 层级结构,也可以增加整个系统稳定性。 74 | 75 | ![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200211174001.png) 76 | 77 | 上图是 CAT 目前多机房的整体结构图: 78 | 79 | - 路由中心是根据应用所在机房信息来决定客户端上报的 CAT 服务端地址 80 | - 每个机房内部都有的独立的原始信息存储集群 HDFS 81 | - cat-home 可以部署在一个机房也可以部署在多个机房,在做报表展示的时候,cat-home 会从 cat-consumer 中进行跨机房的调用,将所有的数据合并展示给用户 82 | - 实际过程中,cat-consumer、cat-home 以及路由中心都是部署在一起,每个服务端节点都可以充当任何一个角色 83 | 84 | ## 参考资料 85 | 86 | - [CAT Github](https://github.com/dianping/cat) -------------------------------------------------------------------------------- /source/_posts/12.数据库/07.搜索引擎数据库/elasticsearch/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:elasticsearch 3 | title: Elasticsearch 4 | cover: https://raw.githubusercontent.com/dunwu/images/master/snap/202503110800267.webp 5 | date: 2022-04-11 16:52:35 6 | categories: 7 | - 数据库 8 | - 搜索引擎数据库 9 | - elasticsearch 10 | tags: 11 | - 数据库 12 | - 搜索引擎数据库 13 | - elasticsearch 14 | permalink: /pages/7639aa15/ 15 | hidden: true 16 | index: false 17 | --- 18 | 19 | # Elasticsearch 20 | 21 | ::: info 概述 22 | 23 | Elasticsearch 是一个基于 Lucene 的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch 是遵从 Apache 开源条款的一款开源产品,是当前主流的企业级搜索引擎。 24 | 25 | ::: 26 | 27 | 28 | 29 | ## 📖 内容 30 | 31 | - [Elasticsearch 简介](Elasticsearch_简介.md) 32 | - [Elasticsearch CRUD](Elasticsearch_CRUD.md) 33 | - [Elasticsearch Mapping](Elasticsearch_Mapping.md) 34 | - [Elasticsearch 存储](Elasticsearch_存储.md) 35 | - [Elasticsearch 搜索(上)](Elasticsearch_搜索上.md) 36 | - [Elasticsearch 搜索(下)](Elasticsearch_搜索下.md) 37 | - [Elasticsearch 聚合](Elasticsearch_聚合.md) 38 | - [Elasticsearch 分析](Elasticsearch_分析.md) 39 | - [Elasticsearch 集群](Elasticsearch_集群.md) 40 | - [Elasticsearch 架构](Elasticsearch_架构.md) 41 | - [Elasticsearch 优化](Elasticsearch_优化.md) 42 | - [Elasticsearch 运维](Elasticsearch_运维.md) 43 | - [Elasticsearch API](Elasticsearch_API.md) 44 | - [ElasticSearch API 之 High Level REST Client](Elasticsearch_API_HighLevelRest.md) 45 | - [Elasticsearch 面试](Elasticsearch_面试.md) 💯 46 | 47 | ## 📚 资料 48 | 49 | - **官方** 50 | - [Elasticsearch 官网](https://www.elastic.co/cn/products/elasticsearch) 51 | - [Elasticsearch Github](https://github.com/elastic/elasticsearch) 52 | - [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) 53 | - [Elasticsearch: The Definitive Guide](https://www.elastic.co/guide/en/elasticsearch/guide/master/index.html) - ElasticSearch 官方学习资料 54 | - **书籍** 55 | - [《Elasticsearch 实战》](https://book.douban.com/subject/30380439/) 56 | - **教程** 57 | - [ELK Stack 权威指南](https://github.com/chenryn/logstash-best-practice-cn) 58 | - [极客时间教程 - Elasticsearch 核心技术与实战](https://time.geekbang.org/course/detail/100030501-102659) 59 | - [Elasticsearch 教程](https://www.knowledgedict.com/tutorial/elasticsearch-intro.html) 60 | - [Elasticsearch 从入门到实践](https://www.itshujia.com/books/elasticsearch) 61 | - **文章** 62 | - [Elasticsearch+Logstash+Kibana 教程](https://www.cnblogs.com/xing901022/p/4704319.html) 63 | - [ELK(Elasticsearch、Logstash、Kibana)安装和配置](https://github.com/judasn/Linux-Tutorial/blob/master/ELK-Install-And-Settings.md) 64 | - [Elasticsearch Performance Tuning Practice at eBay](https://www.ebayinc.com/stories/blogs/tech/elasticsearch-performance-tuning-practice-at-ebay/) 65 | - [Elasticsearch at Kickstarter](https://kickstarter.engineering/elasticsearch-at-kickstarter-db3c487887fc) 66 | - [9 tips on ElasticSearch configuration for high performance](https://www.loggly.com/blog/nine-tips-configuring-elasticsearch-for-high-performance/) 67 | - [Elasticsearch In Production - Deployment Best Practices](https://medium.com/@abhidrona/elasticsearch-deployment-best-practices-d6c1323b25d7) 68 | - **更多资源** 69 | - [GitHub: Awesome ElasticSearch](https://github.com/dzharii/awesome-elasticsearch) 70 | 71 | ## 🚪 传送 72 | 73 | ◾ 💧 [钝悟的 IT 知识图谱](https://dunwu.github.io/waterdrop/) ◾ -------------------------------------------------------------------------------- /source/_posts/12.数据库/05.KV数据库/redis/Redis_订阅.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: logos:redis 3 | title: Redis 发布订阅 4 | date: 2023-09-11 22:22:30 5 | categories: 6 | - 数据库 7 | - KV数据库 8 | - redis 9 | tags: 10 | - 数据库 11 | - KV数据库 12 | - redis 13 | - 订阅 14 | - 观察者模式 15 | permalink: /pages/f8784ef0/ 16 | --- 17 | 18 | # Redis 发布订阅 19 | 20 | > Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 21 | > 22 | > Redis 有两种发布订阅模式 23 | > 24 | > - 基于频道(Channel)的发布订阅 25 | > - 基于模式(Pattern)的发布订阅 26 | > 27 | > 关键词:`订阅`、`SUBSCRIBE`、`PSUBSCRIBE`、`PUBLISH`、`观察者模式` 28 | 29 | ## 观察者模式 30 | 31 | Redis 发布订阅应用了设计模式中经典的“观察者模式”。 32 | 33 | **观察者模式**(Observer)是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。 34 | 35 | - 当一个对象状态的改变需要改变其他对象,或实际对象是事先未知的或动态变化的时,可使用观察者模式。 36 | - 当应用中的一些对象必须观察其他对象时,可使用该模式。但仅能在有限时间内或特定情况下使用。 37 | 38 | ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202503272225857.png) 39 | 40 | ## Redis 订阅模式 41 | 42 | Redis 有两种发布订阅模式: 43 | 44 | (1)**基于频道(Channel)的发布订阅** 45 | 46 | 服务器状态在 `pubsub_channels` 字典保存了所有频道的订阅关系: `SUBSCRIBE` 命令负责将客户端和被订阅的频道关联到这个字典里面, 而 `UNSUBSCRIBE` 命令则负责解除客户端和被退订频道之间的关联。 47 | 48 | 【示例】订阅指定频道示例 49 | 50 | 打开客户端一,执行以下命令 51 | 52 | ```shell 53 | > SUBSCRIBE first second 54 | Reading messages... (press Ctrl-C to quit) 55 | 1) "subscribe" 56 | 2) "first" 57 | 3) (integer) 1 58 | 1) "subscribe" 59 | 2) "second" 60 | 3) (integer) 2 61 | ``` 62 | 63 | 打开客户端二,执行以下命令 64 | 65 | ```shell 66 | > PUBLISH second Hello 67 | 1) "1" 68 | ``` 69 | 70 | 此时,客户端一会收到以下内容 71 | 72 | ```shell 73 | 1) "message" 74 | 2) "second" 75 | 3) "Hello" 76 | ``` 77 | 78 | (2)**基于模式(Pattern)的发布订阅** 79 | 80 | 服务器状态在 `pubsub_patterns` 链表保存了所有模式的订阅关系: `PSUBSCRIBE` 命令负责将客户端和被订阅的模式记录到这个链表中, 而 `UNSUBSCRIBE` 命令则负责移除客户端和被退订模式在链表中的记录。 81 | 82 | 【示例】订阅符合指定模式的频道 83 | 84 | 打开客户端一,执行以下命令 85 | 86 | ```shell 87 | > PSUBSCRIBE news.* 88 | Reading messages... (press Ctrl-C to quit) 89 | 1) "psubscribe" 90 | 2) "news.*" 91 | 3) (integer) 1 92 | ``` 93 | 94 | 打开客户端二,执行以下命令 95 | 96 | ```shell 97 | > PUBLISH news.A Hello 98 | 1) "1" 99 | ``` 100 | 101 | 打开客户端三,执行以下命令 102 | 103 | ```shell 104 | > PUBLISH news.B World 105 | 1) "1" 106 | ``` 107 | 108 | 此时,客户端一会收到以下内容 109 | 110 | ```shell 111 | 1) "pmessage" 112 | 2) "news.*" 113 | 3) "news.A" 114 | 4) "Hello" 115 | 1) "pmessage" 116 | 2) "news.*" 117 | 3) "news.B" 118 | 4) "World" 119 | ``` 120 | 121 | ## 发布订阅命令 122 | 123 | Redis 提供了以下与订阅发布有关的命令: 124 | 125 | | 命令 | 描述 | 126 | | -------------------------------------------------------- | -------------------------- | 127 | | [`SUBSCRIBE`](https://redis.io/commands/subscribe/) | 订阅指定频道 | 128 | | [`UNSUBSCRIBE`](https://redis.io/commands/unsubscribe) | 取消订阅指定频道 | 129 | | [`PSUBSCRIBE`](https://redis.io/commands/psubscribe) | 订阅符合指定模式的频道 | 130 | | [`PUNSUBSCRIBE`](https://redis.io/commands/punsubscribe) | 取消订阅符合指定模式的频道 | 131 | | [`PUBLISH`](https://redis.io/commands/publish/) | 发送信息到指定的频道 | 132 | | [`PUBSUB`](https://redis.io/commands/pubsub/) | 查看发布订阅状态 | 133 | 134 | ## 参考资料 135 | 136 | - [《Redis 设计与实现》](https://item.jd.com/11486101.html) -------------------------------------------------------------------------------- /source/_posts/03.设计/01.架构/00.综合/00.如何设计系统.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 如何设计系统 3 | date: 2021-11-08 08:15:33 4 | order: 00 5 | categories: 6 | - 设计 7 | - 架构 8 | - 综合 9 | tags: 10 | - 架构 11 | - 设计 12 | permalink: /pages/5f2fa796/ 13 | --- 14 | 15 | # 如何设计系统 16 | 17 | ## 系统设计过程 18 | 19 | ### 步骤一、约束和用例 20 | 21 | 对于任何系统设计,第一件应该做的事是:阐明系统的约束并确定系统需要满足哪些用例。 22 | 23 | 永远不要假设没有明确说明的事情。一定要尽力收集、理解需求,并设计一个很好地涵盖这些要求的解决方案。 24 | 25 | 例如,URL 缩短服务可能只为几千个用户提供服务,但每个用户都可能共享数百万个 URL。它可能旨在处理对缩短的 URL 的数百万次点击或数十次点击。该服务可能必须提供有关每个缩短的 URL 的大量统计信息(这会增加您的数据大小),或者可能根本不需要统计信息。 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 | - NoSql 57 | 58 | 在系统设计方面,回顾现实中的架构非常有用。注意使用了哪些技术。继续研究每一项新技术,看看它解决了什么问题,它的替代品是什么,它擅长的地方,以及失败的地方。 59 | 60 | 一切都是权衡的结果——这是系统设计中最基本的概念之一。 61 | 62 | 一些推荐的学习资料 63 | 64 | - [生产中的深度学习](http://highscalability.com/blog/2017/10/23/one-model-at-a-time-integrating-and-running-deep-learning-mo.html):关于 EyeEm 如何构建在大量图像上运行多个深度学习模型的生产系统的精彩故事 65 | - [Uber](http://highscalability.com/blog/2016/10/12/lessons-learned-from-scaling-uber-to-2000-engineers-1000-ser.html):一篇关于 Uber 如何快速扩展的好文章,关于将您的服务分解为分布在许多存储库中的许多微服务。 66 | - [Facebook](http://highscalability.com/blog/2016/6/27/how-facebook-live-streams-to-800000-simultaneous-viewers.html):Facebook 如何在直播中同时处理 800,000 名观众 67 | - [Kraken.io](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html):如何大规模缩放图像优化,本文将更详细地看一些具体使用的硬件方案,以及部署、监控等重要方面 68 | - [Twitter](http://highscalability.com/blog/2016/4/20/how-twitter-handles-3000-images-per-second.html):Twitter 如何处理每秒 3,000 张图片上传以及为什么它使用的旧方式现在行不通 69 | - 最后,Twitter 子组件的一些很好的例子:存储数据([video](https://www.youtube.com/watch?v=5cKTP36HVgI) | [text](http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html))和时间轴([video](http://www.infoq.com/presentations/Twitter-Timeline-Scalability) | [text](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html))。 70 | - 有关更高级的示例,请查看 Google、Youtube([video](https://www.youtube.com/watch?v=w5WVu624fY8) | [text](http://highscalability.com/youtube-architecture))、[Tumblr](http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html)、[StackOverflow](http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html) 和 [Datashift](http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html) 上的这些帖子。 71 | 72 | ## 参考资料 73 | 74 | - [system-design-primer](https://github.com/donnemartin/system-design-primer) 75 | - [System Design for Tech Interviews](https://www.hiredintech.com/courses/system-design) -------------------------------------------------------------------------------- /source/_posts/04.DevOps/99.工具/01.Git/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: README 3 | date: 2022-04-27 19:47:18 4 | categories: 5 | - DevOps 6 | - 工具 7 | - Git 8 | tags: 9 | - DevOps 10 | - Git 11 | permalink: /pages/7f7a45cf/ 12 | hidden: true 13 | index: false 14 | --- 15 | 16 | # Git 教程 17 | 18 | ![git脑图](https://raw.githubusercontent.com/dunwu/images/master/cs/web/git/git-summary.png) 19 | 20 | ## 📖 内容 21 | 22 | - [如何优雅的玩转 Git](01.如何优雅的玩转Git.md) 23 | - [Git 帮助手册](02.Git帮助手册.md) 24 | 25 | ## 📚 资料 26 | 27 | - **官方资源** 28 | - [Git 官网](https://git-scm.com/) 29 | - [Git Github](https://github.com/git/git) 30 | - **模板** 31 | - [gitignore 模板](https://github.com/github/gitignore) - .gitignore 文件模板 32 | - [gitattributes 模板](https://github.com/alexkaratarakis/gitattributes) - .gitattributes 文件模板 33 | - [github-cheat-sheet](https://github.com/tiimgreen/github-cheat-sheet) - git 命令简略图表 34 | - **Git 教程** 35 | - [Learn Git branching](https://learngitbranching.js.org/) - 交互式教程 36 | - [Git 官方推荐教程](https://git-scm.com/book/zh/v2) - Scott Chacon 的 Git 书。 37 | - [git-flight-rules](https://github.com/k88hudson/git-flight-rules) 38 | - [git-tips](https://github.com/521xueweihan/git-tips) 39 | - [Git 中文教程](https://github.com/geeeeeeeeek/git-recipes) 40 | - [廖雪峰的 Git 教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) 41 | - [有关 git 的学习资源](https://github.com/xirong/my-git) 42 | - **文章** 43 | - [Git Cookbook](https://github.com/k88hudson/git-flight-rules/blob/master/README_zh-CN.md) 44 | - [Git 奇技淫巧](https://github.com/521xueweihan/git-tips) 45 | - [Git 风格指南](https://github.com/aseaday/git-style-guide) 46 | - [Git 在团队中的最佳实践--如何正确使用 Git Flow](http://www.cnblogs.com/cnblogsfans/p/5075073.html) 47 | - **Git 工具** 48 | - [guis](https://git-scm.com/downloads/guis) - Git 官网展示的客户端工具列表。 49 | - [gogs](https://github.com/gogits/gogs) - 极易搭建的自助 Git 服务。 50 | - [gitflow](https://github.com/nvie/gitflow) - 应用 [fit-flow](http://nvie.com/posts/a-successful-git-branching-model/) 模型的工具。 51 | - [firstaidgit.io](http://firstaidgit.io/) 一个可搜索的最常被问到的 Git 的问题 52 | - [git-extra-commands](https://github.com/unixorn/git-extra-commands) - 一堆有用的额外的 Git 脚本 53 | - [git-extras](https://github.com/tj/git-extras) - GIT 工具集 -- repo summary, repl, changelog population, author commit percentages and more 54 | - [git-fire](https://github.com/qw3rtman/git-fire) - git-fire 是一个 Git 插件,用于帮助在紧急情况下添加所有当前文件, 做提交(committing), 和推(push)到一个新分支(阻止合并冲突)。 55 | - [git-tips](https://github.com/git-tips/tips) - Git 小提示 56 | - [git-town](https://github.com/Originate/git-town) - 通用,高级 Git 工作流支持! 57 | - **GUI 客户端** 58 | - [GitKraken](https://www.gitkraken.com/) - 豪华的 Git 客户端 Windows, Mac & Linux 59 | - [git-cola](https://git-cola.github.io/) - 另外一个 Git 客户端 Windows & OS X 60 | - [GitUp](https://github.com/git-up/GitUp) - 一个新的 Git 客户端,在处理 Git 的复杂性上有自己的特点 61 | - [gitx-dev](https://rowanj.github.io/gitx/) - 图形化的 Git 客户端 OS X 62 | - [Source Tree](https://www.sourcetreeapp.com/) - 免费的图形化 Git 客户端 Windows & OS X 63 | - [Tower](http://www.git-tower.com/) - 图形化 Git 客户端 OS X(付费) 64 | - **git cheat sheet** 65 | - [github-git-cheat-sheet](https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf) 66 | 67 | ## 🚪 传送 68 | 69 | ◾ 🏠 [dunwu.github.io 首页](https://dunwu.github.io/) ◾ 🎯 [钝悟的博客](https://dunwu.github.io/waterdrop/) ◾ --------------------------------------------------------------------------------