docs: 整理文档
184
README.md
|
@ -5,8 +5,23 @@
|
|||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://badgen.net/github/license/dunwu/db-tutorial" alt="license">
|
||||
<img src="https://travis-ci.com/dunwu/db-tutorial.svg?branch=master" alt="build">
|
||||
|
||||
<a href="https://github.com/dunwu/db-tutorial">
|
||||
<img alt="star" class="no-zoom" src="https://img.shields.io/github/stars/dunwu/db-tutorial?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/dunwu/db-tutorial">
|
||||
<img alt="fork" class="no-zoom" src="https://img.shields.io/github/forks/dunwu/db-tutorial?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/dunwu/db-tutorial/commits/master">
|
||||
<img alt="commit" class="no-zoom" src="https://img.shields.io/github/workflow/status/dunwu/db-tutorial/CI?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
<a href="https://www.apache.org/licenses/LICENSE-2.0">
|
||||
<img alt="code style" class="no-zoom" src="https://img.shields.io/github/license/dunwu/db-tutorial?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
</p>
|
||||
|
||||
<h1 align="center">DB-TUTORIAL</h1>
|
||||
|
@ -16,13 +31,9 @@
|
|||
> - 🔁 项目同步维护:[Github](https://github.com/dunwu/db-tutorial/) | [Gitee](https://gitee.com/turnon/db-tutorial/)
|
||||
> - 📖 电子书阅读:[Github Pages](https://dunwu.github.io/db-tutorial/) | [Gitee Pages](https://turnon.gitee.io/db-tutorial/)
|
||||
|
||||
## 数据库原理
|
||||
## 数据库综合
|
||||
|
||||
### 数据结构
|
||||
|
||||
TODO...
|
||||
|
||||
### 分布式
|
||||
### 分布式存储原理
|
||||
|
||||
- [分布式简介](https://dunwu.github.io/design/distributed/分布式简介.html)
|
||||
- [分布式基础理论](https://dunwu.github.io/design/distributed/分布式理论.html) - 关键词:`拜占庭将军`、`CAP`、`BASE`
|
||||
|
@ -38,32 +49,83 @@ TODO...
|
|||
- [分布式会话](https://dunwu.github.io/design/distributed/分布式会话.html) - 关键词:`粘性 Session`、`Session 复制共享`、`基于缓存的 session 共享`
|
||||
- [流量控制](https://dunwu.github.io/design/distributed/流量控制.html) - 关键词:`计数器法`、`时间窗口法`、`令牌桶法`、`漏桶法`
|
||||
|
||||
### 其他
|
||||
|
||||
- [Nosql 技术选型](docs/01.数据库综合/01.Nosql技术选型.md)
|
||||
- [数据结构与数据库索引](docs/01.数据库综合/02.数据结构与数据库索引.md)
|
||||
|
||||
## 数据库中间件
|
||||
|
||||
- [ShardingSphere 简介](docs/02.数据库中间件/01.Shardingsphere/01.ShardingSphere简介.md)
|
||||
- [ShardingSphere Jdbc](docs/02.数据库中间件/01.Shardingsphere/02.ShardingSphereJdbc.md)
|
||||
- [版本管理中间件 Flyway](docs/02.数据库中间件/02.Flyway.md)
|
||||
|
||||
## 关系型数据库
|
||||
|
||||
> [关系型数据库](docs/sql) 整理主流关系型数据库知识点。
|
||||
> [关系型数据库](docs/03.关系型数据库) 整理主流关系型数据库知识点。
|
||||
|
||||
- [关系型数据库面试总结](docs/sql/common/sql-interview.md) 💯
|
||||
- [SQL Cheat Sheet](docs/sql/common/sql-cheat-sheet.md) 是一个 SQL 入门教程。
|
||||
### 公共知识
|
||||
|
||||
### [Mysql](docs/sql/mysql)
|
||||
- [关系型数据库面试总结](docs/03.关系型数据库/01.综合/01.关系型数据库面试.md) 💯
|
||||
- [SQL Cheat Sheet](docs/03.关系型数据库/01.综合/02.SqlCheatSheet.md) 是一个 SQL 入门教程。
|
||||
- [扩展 SQL](docs/03.关系型数据库/01.综合/03.扩展SQL.md) 是一个 SQL 入门教程。
|
||||
|
||||
### Mysql
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716103611.png)
|
||||
|
||||
- [Mysql 应用指南](docs/sql/mysql/mysql-quickstart.md) ⚡
|
||||
- [Mysql 工作流](docs/sql/mysql/mysql-workflow.md) - 关键词:`连接`、`缓存`、`语法分析`、`优化`、`执行引擎`、`redo log`、`bin log`、`两阶段提交`
|
||||
- [Mysql 索引](docs/sql/mysql/mysql-index.md) - 关键词:`Hash`、`B 树`、`聚簇索引`、`回表`
|
||||
- [Mysql 锁](docs/sql/mysql/mysql-lock.md) - 关键词:`乐观锁`、`表级锁`、`行级锁`、`意向锁`、`MVCC`、`Next-key 锁`
|
||||
- [Mysql 事务](docs/sql/mysql/mysql-transaction.md) - 关键词:`ACID`、`AUTOCOMMIT`、`事务隔离级别`、`死锁`、`分布式事务`
|
||||
- [Mysql 性能优化](docs/sql/mysql/mysql-optimization.md)
|
||||
- [Mysql 运维](docs/sql/mysql/mysql-ops.md) 🔨
|
||||
- [Mysql 配置](docs/sql/mysql/mysql-config.md)
|
||||
- [Mysql 问题](docs/sql/mysql/mysql-faq.md)
|
||||
- [Mysql 应用指南](docs/03.关系型数据库/02.Mysql/01.Mysql应用指南.md) ⚡
|
||||
- [Mysql 工作流](docs/03.关系型数据库/02.Mysql/02.MySQL工作流.md) - 关键词:`连接`、`缓存`、`语法分析`、`优化`、`执行引擎`、`redo log`、`bin log`、`两阶段提交`
|
||||
- [Mysql 事务](docs/03.关系型数据库/02.Mysql/03.Mysql事务.md) - 关键词:`ACID`、`AUTOCOMMIT`、`事务隔离级别`、`死锁`、`分布式事务`
|
||||
- [Mysql 锁](docs/03.关系型数据库/02.Mysql/04.Mysql锁.md) - 关键词:`乐观锁`、`表级锁`、`行级锁`、`意向锁`、`MVCC`、`Next-key 锁`
|
||||
- [Mysql 索引](docs/03.关系型数据库/02.Mysql/05.Mysql索引.md) - 关键词:`Hash`、`B 树`、`聚簇索引`、`回表`
|
||||
- [Mysql 性能优化](docs/03.关系型数据库/02.Mysql/06.Mysql性能优化.md)
|
||||
- [Mysql 运维](docs/03.关系型数据库/02.Mysql/20.Mysql运维.md) 🔨
|
||||
- [Mysql 配置](docs/03.关系型数据库/02.Mysql/21.Mysql配置.md) 🔨
|
||||
- [Mysql 问题](docs/03.关系型数据库/02.Mysql/99.Mysql常见问题.md)
|
||||
|
||||
### 其他
|
||||
|
||||
- [H2 应用指南](docs/sql/h2.md)
|
||||
- [SqLite 应用指南](docs/sql/sqlite.md)
|
||||
- [PostgreSQL 应用指南](docs/sql/postgresql.md)
|
||||
- [PostgreSQL 应用指南](docs/03.关系型数据库/99.其他/01.PostgreSQL.md)
|
||||
- [H2 应用指南](docs/03.关系型数据库/99.其他/02.H2.md)
|
||||
- [SqLite 应用指南](docs/03.关系型数据库/99.其他/03.Sqlite.md)
|
||||
|
||||
## 文档数据库
|
||||
|
||||
### MongoDB
|
||||
|
||||
> MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
|
||||
>
|
||||
> MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。
|
||||
>
|
||||
> MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
|
||||
|
||||
- [MongoDB 应用指南](docs/04.文档数据库/01.MongoDB/01.MongoDB应用指南.md)
|
||||
- [MongoDB 的 CRUD 操作](docs/04.文档数据库/01.MongoDB/02.MongoDB的CRUD操作.md)
|
||||
- [MongoDB 聚合操作](docs/04.文档数据库/01.MongoDB/03.MongoDB的聚合操作.md)
|
||||
- [MongoDB 事务](docs/04.文档数据库/01.MongoDB/04.MongoDB事务.md)
|
||||
- [MongoDB 建模](docs/04.文档数据库/01.MongoDB/05.MongoDB建模.md)
|
||||
- [MongoDB 建模示例](docs/04.文档数据库/01.MongoDB/06.MongoDB建模示例.md)
|
||||
- [MongoDB 索引](docs/04.文档数据库/01.MongoDB/07.MongoDB索引.md)
|
||||
- [MongoDB 复制](docs/04.文档数据库/01.MongoDB/08.MongoDB复制.md)
|
||||
- [MongoDB 分片](docs/04.文档数据库/01.MongoDB/09.MongoDB分片.md)
|
||||
- [MongoDB 运维](docs/04.文档数据库/01.MongoDB/20.MongoDB运维.md)
|
||||
|
||||
## KV 数据库
|
||||
|
||||
### Redis
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713105627.png)
|
||||
|
||||
- [Redis 面试总结](docs/05.KV数据库/01.Redis/01.Redis面试总结.md) 💯
|
||||
- [Redis 应用指南](docs/05.KV数据库/01.Redis/02.Redis应用指南.md) ⚡ - 关键词:`内存淘汰`、`事件`、`事务`、`管道`、`发布与订阅`
|
||||
- [Redis 数据类型和应用](docs/05.KV数据库/01.Redis/03.Redis数据类型和应用.md) - 关键词:`STRING`、`HASH`、`LIST`、`SET`、`ZSET`、`BitMap`、`HyperLogLog`、`Geo`
|
||||
- [Redis 持久化](docs/05.KV数据库/01.Redis/04.Redis持久化.md) - 关键词:`RDB`、`AOF`、`SAVE`、`BGSAVE`、`appendfsync`
|
||||
- [Redis 复制](docs/05.KV数据库/01.Redis/05.Redis复制.md) - 关键词:`SLAVEOF`、`SYNC`、`PSYNC`、`REPLCONF ACK`
|
||||
- [Redis 哨兵](docs/05.KV数据库/01.Redis/06.Redis哨兵.md) - 关键词:`Sentinel`、`PING`、`INFO`、`Raft`
|
||||
- [Redis 集群](docs/05.KV数据库/01.Redis/07.Redis集群.md) - 关键词:`CLUSTER MEET`、`Hash slot`、`MOVED`、`ASK`、`SLAVEOF no one`、`redis-trib`
|
||||
- [Redis 实战](docs/05.KV数据库/01.Redis/08.Redis实战.md) - 关键词:`缓存`、`分布式锁`、`布隆过滤器`
|
||||
- [Redis 运维](docs/05.KV数据库/01.Redis/20.Redis运维.md) 🔨 - 关键词:`安装`、`命令`、`集群`、`客户端`
|
||||
|
||||
## 列式数据库
|
||||
|
||||
|
@ -76,65 +138,25 @@ TODO...
|
|||
- [HBase 应用](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase应用.md)
|
||||
- [HBase 运维](https://github.com/dunwu/bigdata-tutorial/blob/master/docs/hbase/HBase运维.md)
|
||||
|
||||
## KV 数据库
|
||||
|
||||
### Redis
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713105627.png)
|
||||
|
||||
- [Redis 面试总结](docs/nosql/redis/redis-interview.md) 💯
|
||||
- [Redis 应用指南](docs/nosql/redis/redis-quickstart.md) ⚡ - 关键词:`内存淘汰`、`事件`、`事务`、`管道`、`发布与订阅`
|
||||
- [Redis 数据类型和应用](docs/nosql/redis/redis-datatype.md) - 关键词:`STRING`、`HASH`、`LIST`、`SET`、`ZSET`、`BitMap`、`HyperLogLog`、`Geo`
|
||||
- [Redis 持久化](docs/nosql/redis/redis-persistence.md) - 关键词:`RDB`、`AOF`、`SAVE`、`BGSAVE`、`appendfsync`
|
||||
- [Redis 复制](docs/nosql/redis/redis-replication.md) - 关键词:`SLAVEOF`、`SYNC`、`PSYNC`、`REPLCONF ACK`
|
||||
- [Redis 哨兵](docs/nosql/redis/redis-sentinel.md) - 关键词:`Sentinel`、`PING`、`INFO`、`Raft`
|
||||
- [Redis 集群](docs/nosql/redis/redis-cluster.md) - 关键词:`CLUSTER MEET`、`Hash slot`、`MOVED`、`ASK`、`SLAVEOF no one`、`redis-trib`
|
||||
- [Redis 实战](docs/nosql/redis/redis-action.md) - 关键词:`缓存`、`分布式锁`、`布隆过滤器`
|
||||
- [Redis 运维](docs/nosql/redis/redis-ops.md) 🔨 - 关键词:`安装`、`命令`、`集群`、`客户端`
|
||||
|
||||
## 文档数据库
|
||||
|
||||
### MongoDB
|
||||
|
||||
> MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
|
||||
>
|
||||
> MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。
|
||||
>
|
||||
> MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
|
||||
|
||||
- [MongoDB 应用指南](docs/nosql/mongodb/mongodb-quickstart.md)
|
||||
- [MongoDB 聚合操作](docs/nosql/mongodb/mongodb-aggregation.md)
|
||||
- [MongoDB 建模](docs/nosql/mongodb/mongodb-model.md)
|
||||
- [MongoDB 建模示例](docs/nosql/mongodb/mongodb-model-example.md)
|
||||
- [MongoDB 索引](docs/nosql/mongodb/mongodb-index.md)
|
||||
- [MongoDB 复制](docs/nosql/mongodb/mongodb-replication.md)
|
||||
- [MongoDB 分片](docs/nosql/mongodb/mongodb-sharding.md)
|
||||
- [MongoDB 运维](docs/nosql/mongodb/mongodb-ops.md)
|
||||
|
||||
## 搜索引擎数据库
|
||||
|
||||
### Elasticsearch
|
||||
|
||||
> Elasticsearch 是一个基于 Lucene 的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch 是遵从 Apache 开源条款的一款开源产品,是当前主流的企业级搜索引擎。
|
||||
|
||||
- [Elasticsearch 面试总结](docs/nosql/elasticsearch/elasticsearch-interview.md) 💯
|
||||
- [Elasticsearch 快速入门](docs/nosql/elasticsearch/Elasticsearch快速入门.md)
|
||||
- [Elasticsearch 简介](docs/nosql/elasticsearch/Elasticsearch简介.md)
|
||||
- [Elasticsearch Rest API](docs/nosql/elasticsearch/ElasticsearchRestApi.md)
|
||||
- [ElasticSearch Java API 之 High Level REST Client](docs/nosql/elasticsearch/ElasticsearchHighLevelRestJavaApi.md)
|
||||
- [Elasticsearch 索引管理](docs/nosql/elasticsearch/Elasticsearch索引管理.md)
|
||||
- [Elasticsearch 查询](docs/nosql/elasticsearch/Elasticsearch查询.md)
|
||||
- [Elasticsearch 高亮](docs/nosql/elasticsearch/Elasticsearch高亮.md)
|
||||
- [Elasticsearch 排序](docs/nosql/elasticsearch/Elasticsearch排序.md)
|
||||
- [Elasticsearch 聚合](docs/nosql/elasticsearch/Elasticsearch聚合.md)
|
||||
- [Elasticsearch 分析器](docs/nosql/elasticsearch/Elasticsearch分析器.md)
|
||||
- [Elasticsearch 运维](docs/nosql/elasticsearch/Elasticsearch运维.md)
|
||||
- [Elasticsearch 性能优化](docs/nosql/elasticsearch/Elasticsearch性能优化.md)
|
||||
|
||||
## 中间件
|
||||
|
||||
- [版本管理中间件 flyway](docs/middleware/flyway.md)
|
||||
- [分库分表中间件 ShardingSphere](docs/middleware/shardingsphere.md)
|
||||
- [Elasticsearch 面试总结](docs/07.搜索引擎数据库/01.Elasticsearch/01.Elasticsearch面试总结.md) 💯
|
||||
- [Elasticsearch 快速入门](docs/07.搜索引擎数据库/01.Elasticsearch/02.Elasticsearch快速入门.md)
|
||||
- [Elasticsearch 简介](docs/07.搜索引擎数据库/01.Elasticsearch/03.Elasticsearch简介.md)
|
||||
- [Elasticsearch 索引](docs/07.搜索引擎数据库/01.Elasticsearch/04.Elasticsearch索引.md)
|
||||
- [Elasticsearch 查询](docs/07.搜索引擎数据库/01.Elasticsearch/05.Elasticsearch查询.md)
|
||||
- [Elasticsearch 高亮](docs/07.搜索引擎数据库/01.Elasticsearch/06.Elasticsearch高亮.md)
|
||||
- [Elasticsearch 排序](docs/07.搜索引擎数据库/01.Elasticsearch/07.Elasticsearch排序.md)
|
||||
- [Elasticsearch 聚合](docs/07.搜索引擎数据库/01.Elasticsearch/08.Elasticsearch聚合.md)
|
||||
- [Elasticsearch 分析器](docs/07.搜索引擎数据库/01.Elasticsearch/09.Elasticsearch分析器.md)
|
||||
- [Elasticsearch 性能优化](docs/07.搜索引擎数据库/01.Elasticsearch/10.Elasticsearch性能优化.md)
|
||||
- [Elasticsearch Rest API](docs/07.搜索引擎数据库/01.Elasticsearch/11.ElasticsearchRestApi.md)
|
||||
- [ElasticSearch Java API 之 High Level REST Client](docs/07.搜索引擎数据库/01.Elasticsearch/12.ElasticsearchHighLevelRestJavaApi.md)
|
||||
- [Elasticsearch 运维](docs/07.搜索引擎数据库/01.Elasticsearch/20.Elasticsearch运维.md)
|
||||
|
||||
## 资料 📚
|
||||
|
||||
|
@ -147,7 +169,7 @@ TODO...
|
|||
- [CMU 15445 数据库基础课程](https://15445.courses.cs.cmu.edu/fall2019/schedule.html)
|
||||
- [CMU 15721 数据库高级课程](https://15721.courses.cs.cmu.edu/spring2020/schedule.html)
|
||||
- [检索技术核心 20 讲](https://time.geekbang.org/column/intro/100048401) - 极客教程【进阶】
|
||||
- [后端存储实战课](https://time.geekbang.org/column/intro/100046801) - 极客教程【进阶】
|
||||
- [后端存储实战课](https://time.geekbang.org/column/intro/100046801) - 极客教程【入门】:讲解存储在电商领域的种种应用和一些基本特性
|
||||
- **论文**
|
||||
- [Efficiency in the Columbia Database Query Optimizer](https://15721.courses.cs.cmu.edu/spring2018/papers/15-optimizer1/xu-columbia-thesis1998.pdf)
|
||||
- [How Good Are Query Optimizers, Really?](http://www.vldb.org/pvldb/vol9/p204-leis.pdf)
|
||||
|
@ -201,8 +223,7 @@ TODO...
|
|||
- [Better Parallel Replication for MySQL](https://medium.com/booking-com-infrastructure/better-parallel-replication-for-mysql-14e2d7857813)
|
||||
- [Evaluating MySQL Parallel Replication Part 2: Slave Group Commit](https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-2-slave-group-commit-459026a141d2)
|
||||
- [Evaluating MySQL Parallel Replication Part 3: Benchmarks in Production](https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-3-benchmarks-in-production-db5811058d74)
|
||||
- [Evaluating MySQL Parallel Replication Part 4: More Benchmarks in Production
|
||||
](https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-4-more-benchmarks-in-production-49ee255043ab)
|
||||
- [Evaluating MySQL Parallel Replication Part 4: More Benchmarks in Production](https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-4-more-benchmarks-in-production-49ee255043ab)
|
||||
- [Evaluating MySQL Parallel Replication Part 4, Annex: Under the Hood](https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-4-annex-under-the-hood-eb456cf8b2fb)
|
||||
- Mysql 数据分区
|
||||
- [StackOverflow: MySQL sharding approaches?](https://stackoverflow.com/questions/5541421/mysql-sharding-approaches)
|
||||
|
@ -210,8 +231,7 @@ TODO...
|
|||
- [How to Scale Big Data Applications](https://www.percona.com/sites/default/files/presentations/How to Scale Big Data Applications.pdf)
|
||||
- [MySQL Sharding with ProxySQL](https://www.percona.com/blog/2016/08/30/mysql-sharding-with-proxysql/)
|
||||
- 各公司的 Mysql 数据分区经验分享
|
||||
- [MailChimp: Using Shards to Accommodate Millions of Users
|
||||
](https://devs.mailchimp.com/blog/using-shards-to-accommodate-millions-of-users/)
|
||||
- [MailChimp: Using Shards to Accommodate Millions of Users](https://devs.mailchimp.com/blog/using-shards-to-accommodate-millions-of-users/)
|
||||
- [Uber: Code Migration in Production: Rewriting the Sharding Layer of Uber’s Schemaless Datastore](https://eng.uber.com/schemaless-rewrite/)
|
||||
- [Sharding & IDs at Instagram](https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c)
|
||||
- [Airbnb: How We Partitioned Airbnb’s Main Database in Two Weeks](https://medium.com/airbnb-engineering/how-we-partitioned-airbnb-s-main-database-in-two-weeks-55f7e006ff21)
|
||||
|
|
|
@ -1,114 +1,199 @@
|
|||
/**
|
||||
* @see https://vuepress.vuejs.org/zh/
|
||||
*/
|
||||
const htmlModules = require('./config/htmlModules.js')
|
||||
|
||||
module.exports = {
|
||||
port: '4000',
|
||||
dest: 'dist',
|
||||
base: '/db-tutorial/',
|
||||
dest: 'docs/.temp',
|
||||
base: '/db-tutorial/', // 默认'/'。如果你想将你的网站部署到如 https://foo.github.io/bar/,那么 base 应该被设置成 "/bar/",(否则页面将失去样式等文件)
|
||||
title: 'DB-TUTORIAL',
|
||||
description: '数据库教程',
|
||||
head: [['link', { rel: 'icon', href: `/favicon.ico` }]],
|
||||
description: '☕ db-tutorial 是一个数据库教程。',
|
||||
theme: 'vdoing', // 使用依赖包主题
|
||||
// theme: require.resolve('../../vdoing'), // 使用本地主题
|
||||
head: [
|
||||
// 注入到页面<head> 中的标签,格式[tagName, { attrName: attrValue }, innerHTML?]
|
||||
['link', { rel: 'icon', href: '/img/favicon.ico' }], //favicons,资源放在public文件夹
|
||||
['meta', { name: 'keywords', content: 'vuepress,theme,blog,vdoing' }],
|
||||
['meta', { name: 'theme-color', content: '#11a8cd' }], // 移动浏览器主题颜色
|
||||
],
|
||||
markdown: {
|
||||
// lineNumbers: true,
|
||||
extractHeaders: ['h2', 'h3', 'h4', 'h5', 'h6'], // 提取标题到侧边栏的级别,默认['h2', 'h3']
|
||||
externalLinks: {
|
||||
target: '_blank',
|
||||
rel: 'noopener noreferrer',
|
||||
},
|
||||
},
|
||||
// 主题配置
|
||||
themeConfig: {
|
||||
logo: 'https://raw.githubusercontent.com/dunwu/images/dev/common/dunwu-logo-200.png',
|
||||
repo: 'dunwu/db-tutorial',
|
||||
repoLabel: 'Github',
|
||||
docsDir: 'docs',
|
||||
docsBranch: 'master',
|
||||
editLinks: true,
|
||||
smoothScroll: true,
|
||||
locales: {
|
||||
'/': {
|
||||
label: '简体中文',
|
||||
selectText: 'Languages',
|
||||
editLinkText: '帮助我们改善此页面!',
|
||||
lastUpdated: '上次更新',
|
||||
nav: [
|
||||
{ text: '数据库综合', link: '/01.数据库综合/' },
|
||||
{ text: '数据库中间件', link: '/02.数据库中间件/' },
|
||||
{
|
||||
text: 'SQL',
|
||||
link: '/sql/',
|
||||
text: '关系型数据库',
|
||||
link: '/03.关系型数据库/',
|
||||
items: [
|
||||
{ text: '综合', link: '/03.关系型数据库/01.综合/' },
|
||||
{ text: 'Mysql', link: '/03.关系型数据库/02.Mysql/' },
|
||||
{ text: '其他', link: '/03.关系型数据库/99.其他/' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'NOSQL',
|
||||
link: '/nosql/',
|
||||
text: '文档数据库',
|
||||
items: [{ text: 'MongoDB', link: '/04.文档数据库/01.MongoDB/' }],
|
||||
},
|
||||
{
|
||||
text: 'Mysql',
|
||||
link: '/sql/mysql/',
|
||||
text: 'KV数据库',
|
||||
items: [{ text: 'Redis', link: '/05.KV数据库/01.Redis/' }],
|
||||
},
|
||||
{
|
||||
text: 'Redis',
|
||||
link: '/nosql/redis/',
|
||||
},
|
||||
{
|
||||
text: 'Elasticsearch',
|
||||
link: '/nosql/elasticsearch/',
|
||||
},
|
||||
{
|
||||
text: 'MongoDB',
|
||||
link: '/nosql/mongodb/',
|
||||
},
|
||||
{
|
||||
text: '🎯 博客',
|
||||
link: 'https://github.com/dunwu/blog',
|
||||
target: '_blank',
|
||||
rel: '',
|
||||
text: '搜索引擎数据库',
|
||||
items: [
|
||||
{ text: 'Elasticsearch', link: '/07.搜索引擎数据库/01.Elasticsearch/' },
|
||||
{ text: 'Elastic技术栈', link: '/07.搜索引擎数据库/02.Elastic/' },
|
||||
],
|
||||
},
|
||||
],
|
||||
sidebar: 'auto',
|
||||
sidebarDepth: 2,
|
||||
sidebarDepth: 2, // 侧边栏显示深度,默认1,最大2(显示到h3标题)
|
||||
logo: 'https://raw.githubusercontent.com/dunwu/images/dev/common/dunwu-logo-200.png', // 导航栏logo
|
||||
repo: 'dunwu/db-tutorial', // 导航栏右侧生成Github链接
|
||||
searchMaxSuggestions: 10, // 搜索结果显示最大数
|
||||
lastUpdated: '上次更新', // 更新的时间,及前缀文字 string | boolean (取值为git提交时间)
|
||||
|
||||
docsDir: 'docs', // 编辑的文件夹
|
||||
editLinks: true, // 编辑链接
|
||||
editLinkText: '📝 帮助改善此页面!',
|
||||
|
||||
// 以下配置是Vdoing主题改动的和新增的配置
|
||||
sidebar: { mode: 'structuring', collapsable: false }, // 侧边栏 'structuring' | { mode: 'structuring', collapsable: Boolean} | 'auto' | 自定义 温馨提示:目录页数据依赖于结构化的侧边栏数据,如果你不设置为'structuring',将无法使用目录页
|
||||
|
||||
// sidebarOpen: false, // 初始状态是否打开侧边栏,默认true
|
||||
updateBar: {
|
||||
// 最近更新栏
|
||||
showToArticle: true, // 显示到文章页底部,默认true
|
||||
// moreArticle: '/archives' // “更多文章”跳转的页面,默认'/archives'
|
||||
},
|
||||
// titleBadge: false, // 文章标题前的图标是否显示,默认true
|
||||
// titleBadgeIcons: [ // 文章标题前图标的地址,默认主题内置图标
|
||||
// '图标地址1',
|
||||
// '图标地址2'
|
||||
// ],
|
||||
// bodyBgImg: [
|
||||
// 'https://cdn.jsdelivr.net/gh/xugaoyi/image_store/blog/20200507175828.jpeg',
|
||||
// 'https://cdn.jsdelivr.net/gh/xugaoyi/image_store/blog/20200507175845.jpeg',
|
||||
// 'https://cdn.jsdelivr.net/gh/xugaoyi/image_store/blog/20200507175846.jpeg'
|
||||
// ], // body背景大图,默认无。 单张图片 String || 多张图片 Array, 多张图片时每隔15秒换一张。
|
||||
|
||||
// categoryText: '随笔', // 碎片化文章(_posts文件夹的文章)预设生成的分类值,默认'随笔'
|
||||
|
||||
// contentBgStyle: 1,
|
||||
|
||||
category: false, // 是否打开分类功能,默认true。 如打开,会做的事情有:1. 自动生成的frontmatter包含分类字段 2.页面中显示与分类相关的信息和模块 3.自动生成分类页面(在@pages文件夹)。如关闭,则反之。
|
||||
tag: false, // 是否打开标签功能,默认true。 如打开,会做的事情有:1. 自动生成的frontmatter包含标签字段 2.页面中显示与标签相关的信息和模块 3.自动生成标签页面(在@pages文件夹)。如关闭,则反之。
|
||||
archive: true, // 是否打开归档功能,默认true。 如打开,会做的事情有:1.自动生成归档页面(在@pages文件夹)。如关闭,则反之。
|
||||
|
||||
author: {
|
||||
// 文章默认的作者信息,可在md文件中单独配置此信息 String | {name: String, href: String}
|
||||
name: 'dunwu', // 必需
|
||||
href: 'https://github.com/dunwu', // 可选的
|
||||
},
|
||||
social: {
|
||||
// 社交图标,显示于博主信息栏和页脚栏
|
||||
// iconfontCssFile: '//at.alicdn.com/t/font_1678482_u4nrnp8xp6g.css', // 可选,阿里图标库在线css文件地址,对于主题没有的图标可自由添加
|
||||
icons: [
|
||||
{
|
||||
iconClass: 'icon-youjian',
|
||||
title: '发邮件',
|
||||
link: 'mailto:forbreak@163.com',
|
||||
},
|
||||
{
|
||||
iconClass: 'icon-github',
|
||||
title: 'GitHub',
|
||||
link: 'https://github.com/dunwu',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
// 页脚信息
|
||||
createYear: 2019, // 博客创建年份
|
||||
copyrightInfo: '钝悟(dunwu) | CC-BY-SA-4.0', // 博客版权信息,支持a标签
|
||||
},
|
||||
htmlModules,
|
||||
},
|
||||
|
||||
// 插件
|
||||
plugins: [
|
||||
[
|
||||
'@vuepress/active-header-links',
|
||||
require('./plugins/love-me'),
|
||||
{
|
||||
sidebarLinkSelector: '.sidebar-link',
|
||||
headerAnchorSelector: '.header-anchor',
|
||||
// 鼠标点击爱心特效
|
||||
color: '#11a8cd', // 爱心颜色,默认随机色
|
||||
excludeClassName: 'theme-vdoing-content', // 要排除元素的class, 默认空''
|
||||
},
|
||||
],
|
||||
['@vuepress/back-to-top', true],
|
||||
|
||||
['fulltext-search'], // 全文搜索
|
||||
|
||||
// ['thirdparty-search', { // 可以添加第三方搜索链接的搜索框(原官方搜索框的参数仍可用)
|
||||
// thirdparty: [ // 可选,默认 []
|
||||
// {
|
||||
// title: '在GitHub中搜索',
|
||||
// frontUrl: 'https://github.com/search?q=', // 搜索链接的前面部分
|
||||
// behindUrl: '' // 搜索链接的后面部分,可选,默认 ''
|
||||
// },
|
||||
// {
|
||||
// title: '在npm中搜索',
|
||||
// frontUrl: 'https://www.npmjs.com/search?q=',
|
||||
// },
|
||||
// {
|
||||
// title: '在Bing中搜索',
|
||||
// frontUrl: 'https://cn.bing.com/search?q='
|
||||
// }
|
||||
// ]
|
||||
// }],
|
||||
|
||||
[
|
||||
'@vuepress/pwa',
|
||||
'one-click-copy',
|
||||
{
|
||||
serviceWorker: true,
|
||||
updatePopup: true,
|
||||
// 代码块复制按钮
|
||||
copySelector: ['div[class*="language-"] pre', 'div[class*="aside-code"] aside'], // String or Array
|
||||
copyMessage: '复制成功', // default is 'Copy successfully and then paste it for use.'
|
||||
duration: 1000, // prompt message display time.
|
||||
showInMobile: false, // whether to display on the mobile side, default: false.
|
||||
},
|
||||
],
|
||||
[
|
||||
'@vuepress/last-updated',
|
||||
'demo-block',
|
||||
{
|
||||
// demo演示模块 https://github.com/xiguaxigua/vuepress-plugin-demo-block
|
||||
settings: {
|
||||
// jsLib: ['http://xxx'], // 在线示例(jsfiddle, codepen)中的js依赖
|
||||
// cssLib: ['http://xxx'], // 在线示例中的css依赖
|
||||
// vue: 'https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js', // 在线示例中的vue依赖
|
||||
jsfiddle: false, // 是否显示 jsfiddle 链接
|
||||
codepen: true, // 是否显示 codepen 链接
|
||||
horizontal: false, // 是否展示为横向样式
|
||||
},
|
||||
},
|
||||
],
|
||||
[
|
||||
'vuepress-plugin-zooming', // 放大图片
|
||||
{
|
||||
selector: '.theme-vdoing-content img:not(.no-zoom)',
|
||||
options: {
|
||||
bgColor: 'rgba(0,0,0,0.6)',
|
||||
},
|
||||
},
|
||||
],
|
||||
[
|
||||
'@vuepress/last-updated', // "上次更新"时间格式
|
||||
{
|
||||
transformer: (timestamp, lang) => {
|
||||
// 不要忘了安装 moment
|
||||
const moment = require('moment')
|
||||
moment.locale(lang)
|
||||
return moment(timestamp).fromNow()
|
||||
const dayjs = require('dayjs') // https://day.js.org/
|
||||
return dayjs(timestamp).format('YYYY/MM/DD, HH:mm:ss')
|
||||
},
|
||||
},
|
||||
],
|
||||
['@vuepress/medium-zoom', true],
|
||||
[
|
||||
'container',
|
||||
{
|
||||
type: 'vue',
|
||||
before: '<pre class="vue-container"><code>',
|
||||
after: '</code></pre>',
|
||||
},
|
||||
],
|
||||
[
|
||||
'container',
|
||||
{
|
||||
type: 'upgrade',
|
||||
before: (info) => `<UpgradePath title="${info}">`,
|
||||
after: '</UpgradePath>',
|
||||
},
|
||||
],
|
||||
['flowchart'],
|
||||
],
|
||||
|
||||
// 监听文件变化并重新构建
|
||||
extraWatchFiles: ['.vuepress/config.js', '.vuepress/config/htmlModules.js'],
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
module.exports = '';
|
|
@ -0,0 +1,52 @@
|
|||
/** 插入自定义html模块 (可用于插入广告模块等)
|
||||
* {
|
||||
* homeSidebarB: htmlString, 首页侧边栏底部
|
||||
*
|
||||
* sidebarT: htmlString, 全局左侧边栏顶部
|
||||
* sidebarB: htmlString, 全局左侧边栏底部
|
||||
*
|
||||
* pageT: htmlString, 全局页面顶部
|
||||
* pageB: htmlString, 全局页面底部
|
||||
* pageTshowMode: string, 页面顶部-显示方式:未配置默认全局;'article' => 仅文章页①; 'custom' => 仅自定义页①
|
||||
* pageBshowMode: string, 页面底部-显示方式:未配置默认全局;'article' => 仅文章页①; 'custom' => 仅自定义页①
|
||||
*
|
||||
* windowLB: htmlString, 全局左下角②
|
||||
* windowRB: htmlString, 全局右下角②
|
||||
* }
|
||||
*
|
||||
* ①注:在.md文件front matter配置`article: false`的页面是自定义页,未配置的默认是文章页(首页除外)。
|
||||
* ②注:windowLB 和 windowRB:1.展示区块最大宽高200px*400px。2.请给自定义元素定一个不超过200px*400px的宽高。3.在屏幕宽度小于960px时无论如何都不会显示。
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
// 万维广告
|
||||
pageB: `
|
||||
<div class="wwads-cn wwads-horizontal pageB" data-id="136" style="width:100%;max-height:80px;min-height:auto;"></div>
|
||||
<style>
|
||||
.pageB img{width:80px!important;}
|
||||
.wwads-horizontal .wwads-text, .wwads-content .wwads-text{line-height:1;}
|
||||
</style>
|
||||
`,
|
||||
windowRB: `
|
||||
<div class="wwads-cn wwads-vertical windowRB" data-id="136" style="max-width:160px;
|
||||
min-width: auto;min-height:auto;"></div>
|
||||
<style>
|
||||
.windowRB{ padding: 0;}
|
||||
.windowRB .wwads-img{margin-top: 10px;}
|
||||
.windowRB .wwads-content{margin: 0 10px 10px 10px;}
|
||||
.custom-html-window-rb .close-but{
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
`,
|
||||
}
|
||||
|
||||
// module.exports = {
|
||||
// homeSidebarB: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// sidebarT: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// sidebarB: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// pageT: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// pageB: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// windowLB: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// windowRB: `<div style="width:100%;height:100px;color:#fff;background: #eee;">自定义模块测试</div>`,
|
||||
// }
|
|
@ -1,7 +1,55 @@
|
|||
export default ({ Vue, isServer }) => {
|
||||
/**
|
||||
* to主题使用者:你可以去掉本文件的所有代码
|
||||
*/
|
||||
export default ({
|
||||
Vue, // VuePress 正在使用的 Vue 构造函数
|
||||
options, // 附加到根实例的一些选项
|
||||
router, // 当前应用的路由实例
|
||||
siteData, // 站点元数据
|
||||
isServer, // 当前应用配置是处于 服务端渲染 还是 客户端
|
||||
}) => {
|
||||
// 用于监控在路由变化时检查广告拦截器 (to主题使用者:你可以去掉本文件的所有代码)
|
||||
if (!isServer) {
|
||||
import('vue-toasted' /* webpackChunkName: "notification" */).then(module => {
|
||||
Vue.use(module.default)
|
||||
router.afterEach(() => {
|
||||
//check if wwads' fire function was blocked after document is ready with 3s timeout (waiting the ad loading)
|
||||
docReady(function () {
|
||||
// setTimeout(function () {
|
||||
// if (window._AdBlockInit === undefined) {
|
||||
// ABDetected()
|
||||
// }
|
||||
// }, 3000)
|
||||
})
|
||||
|
||||
// 删除事件改为隐藏事件
|
||||
setTimeout(() => {
|
||||
const pageB = document.querySelector('.pageB')
|
||||
if (!pageB) return
|
||||
const btnEl = pageB.querySelector('.wwads-hide')
|
||||
if (btnEl) {
|
||||
btnEl.onclick = () => {
|
||||
pageB.style.display = 'none'
|
||||
}
|
||||
}
|
||||
// 显示广告模块
|
||||
pageB.style.display = 'flex'
|
||||
}, 0)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function ABDetected() {
|
||||
const h =
|
||||
"<style>.wwads-horizontal,.wwads-vertical{background-color:#f4f8fa;padding:5px;min-height:120px;margin-top:20px;box-sizing:border-box;border-radius:3px;font-family:sans-serif;display:flex;min-width:150px;position:relative;overflow:hidden;}.wwads-horizontal{flex-wrap:wrap;justify-content:center}.wwads-vertical{flex-direction:column;align-items:center;padding-bottom:32px}.wwads-horizontal a,.wwads-vertical a{text-decoration:none}.wwads-horizontal .wwads-img,.wwads-vertical .wwads-img{margin:5px}.wwads-horizontal .wwads-content,.wwads-vertical .wwads-content{margin:5px}.wwads-horizontal .wwads-content{flex:130px}.wwads-vertical .wwads-content{margin-top:10px}.wwads-horizontal .wwads-text,.wwads-content .wwads-text{font-size:14px;line-height:1.4;color:#0e1011;-webkit-font-smoothing:antialiased}.wwads-horizontal .wwads-poweredby,.wwads-vertical .wwads-poweredby{display:block;font-size:11px;color:#a6b7bf;margin-top:1em}.wwads-vertical .wwads-poweredby{position:absolute;left:10px;bottom:10px}.wwads-horizontal .wwads-poweredby span,.wwads-vertical .wwads-poweredby span{transition:all 0.2s ease-in-out;margin-left:-1em}.wwads-horizontal .wwads-poweredby span:first-child,.wwads-vertical .wwads-poweredby span:first-child{opacity:0}.wwads-horizontal:hover .wwads-poweredby span,.wwads-vertical:hover .wwads-poweredby span{opacity:1;margin-left:0}.wwads-horizontal .wwads-hide,.wwads-vertical .wwads-hide{position:absolute;right:-23px;bottom:-23px;width:46px;height:46px;border-radius:23px;transition:all 0.3s ease-in-out;cursor:pointer;}.wwads-horizontal .wwads-hide:hover,.wwads-vertical .wwads-hide:hover{background:rgb(0 0 0 /0.05)}.wwads-horizontal .wwads-hide svg,.wwads-vertical .wwads-hide svg{position:absolute;left:10px;top:10px;fill:#a6b7bf}.wwads-horizontal .wwads-hide:hover svg,.wwads-vertical .wwads-hide:hover svg{fill:#3E4546}</style><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-img' target='_blank' rel='nofollow'><img src='https://cdn.jsdelivr.net/gh/xugaoyi/image_store@master/blog/wwads.2a3pidhlh4ys.webp' width='130'></a><div class='wwads-content'><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-text' target='_blank' rel='nofollow'>为了本站的长期运营,请将我们的网站加入广告拦截器的白名单,感谢您的支持!<span style='color: #11a8cd'>如何添加白名单?</span></a><a href='https://wwads.cn/page/end-user-privacy' class='wwads-poweredby' title='万维广告 ~ 让广告更优雅,且有用' target='_blank'><span>万维</span><span>广告</span></a></div><a class='wwads-hide' onclick='parentNode.remove()' title='隐藏广告'><svg xmlns='http://www.w3.org/2000/svg' width='6' height='7'><path d='M.879.672L3 2.793 5.121.672a.5.5 0 11.707.707L3.708 3.5l2.12 2.121a.5.5 0 11-.707.707l-2.12-2.12-2.122 2.12a.5.5 0 11-.707-.707l2.121-2.12L.172 1.378A.5.5 0 01.879.672z'></path></svg></a>"
|
||||
const wwadsEl = document.getElementsByClassName('wwads-cn')
|
||||
const wwadsContentEl = document.querySelector('.wwads-content')
|
||||
if (wwadsEl[0] && !wwadsContentEl) {
|
||||
wwadsEl[0].innerHTML = h
|
||||
}
|
||||
}
|
||||
|
||||
//check document ready
|
||||
function docReady(t) {
|
||||
'complete' === document.readyState || 'interactive' === document.readyState
|
||||
? setTimeout(t, 1)
|
||||
: document.addEventListener('DOMContentLoaded', t)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
const path = require('path')
|
||||
const LoveMyPlugin = (options = {}) => ({
|
||||
define() {
|
||||
const COLOR =
|
||||
options.color ||
|
||||
'rgb(' + ~~(255 * Math.random()) + ',' + ~~(255 * Math.random()) + ',' + ~~(255 * Math.random()) + ')'
|
||||
const EXCLUDECLASS = options.excludeClassName || ''
|
||||
return { COLOR, EXCLUDECLASS }
|
||||
},
|
||||
enhanceAppFiles: [path.resolve(__dirname, 'love-me.js')],
|
||||
})
|
||||
module.exports = LoveMyPlugin
|
|
@ -0,0 +1,62 @@
|
|||
export default () => {
|
||||
if (typeof window !== "undefined") {
|
||||
(function(e, t, a) {
|
||||
function r() {
|
||||
for (var e = 0; e < s.length; e++) s[e].alpha <= 0 ? (t.body.removeChild(s[e].el), s.splice(e, 1)) : (s[e].y--, s[e].scale += .004, s[e].alpha -= .013, s[e].el.style.cssText = "left:" + s[e].x + "px;top:" + s[e].y + "px;opacity:" + s[e].alpha + ";transform:scale(" + s[e].scale + "," + s[e].scale + ") rotate(45deg);background:" + s[e].color + ";z-index:99999");
|
||||
requestAnimationFrame(r)
|
||||
}
|
||||
function n() {
|
||||
var t = "function" == typeof e.onclick && e.onclick;
|
||||
|
||||
e.onclick = function(e) {
|
||||
// 过滤指定元素
|
||||
let mark = true;
|
||||
EXCLUDECLASS && e.path && e.path.forEach((item) =>{
|
||||
if(item.nodeType === 1) {
|
||||
typeof item.className === 'string' && item.className.indexOf(EXCLUDECLASS) > -1 ? mark = false : ''
|
||||
}
|
||||
})
|
||||
|
||||
if(mark) {
|
||||
t && t(),
|
||||
o(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
function o(e) {
|
||||
var a = t.createElement("div");
|
||||
a.className = "heart",
|
||||
s.push({
|
||||
el: a,
|
||||
x: e.clientX - 5,
|
||||
y: e.clientY - 5,
|
||||
scale: 1,
|
||||
alpha: 1,
|
||||
color: COLOR
|
||||
}),
|
||||
t.body.appendChild(a)
|
||||
}
|
||||
function i(e) {
|
||||
var a = t.createElement("style");
|
||||
a.type = "text/css";
|
||||
try {
|
||||
a.appendChild(t.createTextNode(e))
|
||||
} catch(t) {
|
||||
a.styleSheet.cssText = e
|
||||
}
|
||||
t.getElementsByTagName("head")[0].appendChild(a)
|
||||
}
|
||||
// function c() {
|
||||
// return "rgb(" + ~~ (255 * Math.random()) + "," + ~~ (255 * Math.random()) + "," + ~~ (255 * Math.random()) + ")"
|
||||
// }
|
||||
var s = [];
|
||||
e.requestAnimationFrame = e.requestAnimationFrame || e.webkitRequestAnimationFrame || e.mozRequestAnimationFrame || e.oRequestAnimationFrame || e.msRequestAnimationFrame ||
|
||||
function(e) {
|
||||
setTimeout(e, 1e3 / 60)
|
||||
},
|
||||
i(".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"),
|
||||
n(),
|
||||
r()
|
||||
})(window, document)
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 195 KiB |
After Width: | Height: | Size: 1.2 MiB |
After Width: | Height: | Size: 241 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 166 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 511 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 306 KiB |
After Width: | Height: | Size: 771 B |
After Width: | Height: | Size: 816 B |
After Width: | Height: | Size: 834 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 667 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 726 B |
After Width: | Height: | Size: 655 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 706 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 38 KiB |
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>Markmap</title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#mindmap {
|
||||
display: block;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<svg id="mindmap"></svg>
|
||||
<script src="https://cdn.jsdelivr.net/npm/d3@5"></script><script src="https://cdn.jsdelivr.net/npm/markmap-lib@0.8.0/dist/browser/view.min.js"></script><script>((a,t,e,n)=>{const{Markmap:s,loadPlugins:o}=window.markmap;(t?t(o,e,n):Promise.resolve()).then(()=>{window.mm=s.create("svg#mindmap",null,a)})})({"t":"heading","d":1,"p":{},"v":"markmap-lib","c":[{"t":"heading","d":2,"p":{},"v":"Links","c":[{"t":"list_item","d":3,"p":{},"v":"<a href=\"https://markmap.js.org/\" target=\"_blank\" rel=\"noopener noreferrer\">https://markmap.js.org/</a>"},{"t":"list_item","d":3,"p":{},"v":"<a href=\"https://github.com/gera2ld/markmap-lib\" title=\"\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub</a>"}]},{"t":"heading","d":2,"p":{},"v":"Related","c":[{"t":"list_item","d":3,"p":{},"v":"<a href=\"https://github.com/gera2ld/coc-markmap\" title=\"\" target=\"_blank\" rel=\"noopener noreferrer\">coc-markmap</a>"},{"t":"list_item","d":3,"p":{},"v":"<a href=\"https://github.com/gera2ld/gatsby-remark-markmap\" title=\"\" target=\"_blank\" rel=\"noopener noreferrer\">gatsby-remark-markmap</a>"}]},{"t":"heading","d":2,"p":{},"v":"Features","c":[{"t":"list_item","d":3,"p":{},"v":"links"},{"t":"list_item","d":3,"p":{},"v":"<strong>inline</strong> <del>text</del> <em>styles</em>"},{"t":"list_item","d":3,"p":{},"v":"multiline<br/>text"},{"t":"list_item","d":3,"p":{},"v":"<code>inline code</code>"},{"t":"list_item","d":3,"p":{},"v":"<pre><code class=\"language-js\">console.log('code block');\n</code></pre>"},{"t":"list_item","d":3,"p":{},"v":"MathJax - <code>\\(x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}\\)</code>"}]}]},(a,t,e)=>a(t,e),["mathJax","prism"],{"mathJax":true,"prism":true})</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,93 @@
|
|||
.home-wrapper .banner .banner-conent .hero h1{
|
||||
font-size 2.8rem!important
|
||||
}
|
||||
// 文档中适配
|
||||
table
|
||||
width auto
|
||||
.page >*:not(.footer),.card-box
|
||||
box-shadow: none!important
|
||||
|
||||
.page
|
||||
@media (min-width $contentWidth + 80)
|
||||
padding-top $navbarHeight!important
|
||||
.home-wrapper .banner .banner-conent
|
||||
padding 0 2.9rem
|
||||
box-sizing border-box
|
||||
.home-wrapper .banner .slide-banner .slide-banner-wrapper .slide-item a
|
||||
h2
|
||||
margin-top 2rem
|
||||
font-size 1.2rem!important
|
||||
p
|
||||
padding 0 1rem
|
||||
|
||||
// 评论区颜色重置
|
||||
.gt-container
|
||||
.gt-ico-tip
|
||||
&::after
|
||||
content: '。( Win + . ) or ( ⌃ + ⌘ + ␣ ) open Emoji'
|
||||
color: #999
|
||||
.gt-meta
|
||||
border-color var(--borderColor)!important
|
||||
.gt-comments-null
|
||||
color var(--textColor)
|
||||
opacity .5
|
||||
.gt-header-textarea
|
||||
color var(--textColor)
|
||||
background rgba(180,180,180,0.1)!important
|
||||
.gt-btn
|
||||
border-color $accentColor!important
|
||||
background-color $accentColor!important
|
||||
.gt-btn-preview
|
||||
background-color rgba(255,255,255,0)!important
|
||||
color $accentColor!important
|
||||
a
|
||||
color $accentColor!important
|
||||
.gt-svg svg
|
||||
fill $accentColor!important
|
||||
.gt-comment-content,.gt-comment-admin .gt-comment-content
|
||||
background-color rgba(150,150,150,0.1)!important
|
||||
&:hover
|
||||
box-shadow 0 0 25px rgba(150,150,150,.5)!important
|
||||
.gt-comment-body
|
||||
color var(--textColor)!important
|
||||
|
||||
|
||||
// qq徽章
|
||||
.qq
|
||||
position: relative;
|
||||
.qq::after
|
||||
content: "可撩";
|
||||
background: $accentColor;
|
||||
color:#fff;
|
||||
padding: 0 5px;
|
||||
border-radius: 10px;
|
||||
font-size:12px;
|
||||
position: absolute;
|
||||
top: -4px;
|
||||
right: -35px;
|
||||
transform:scale(0.85);
|
||||
|
||||
// demo模块图标颜色
|
||||
body .vuepress-plugin-demo-block__wrapper
|
||||
&,.vuepress-plugin-demo-block__display
|
||||
border-color rgba(160,160,160,.3)
|
||||
.vuepress-plugin-demo-block__footer:hover
|
||||
.vuepress-plugin-demo-block__expand::before
|
||||
border-top-color: $accentColor !important;
|
||||
border-bottom-color: $accentColor !important;
|
||||
svg
|
||||
fill: $accentColor !important;
|
||||
|
||||
|
||||
// 全文搜索框
|
||||
.suggestions
|
||||
overflow: auto
|
||||
max-height: calc(100vh - 6rem)
|
||||
@media (max-width: 719px) {
|
||||
width: 90vw;
|
||||
min-width: 90vw!important;
|
||||
margin-right: -20px;
|
||||
}
|
||||
.highlight
|
||||
color: $accentColor
|
||||
font-weight: bold
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
// 原主题变量已弃用,以下是vdoing使用的变量,你可以在这个文件内修改它们。
|
||||
|
||||
//***vdoing主题-变量***//
|
||||
|
||||
// // 颜色
|
||||
|
||||
// $bannerTextColor = #fff // 首页banner区(博客标题)文本颜色
|
||||
// $accentColor = #11A8CD
|
||||
// $arrowBgColor = #ccc
|
||||
// $badgeTipColor = #42b983
|
||||
// $badgeWarningColor = darken(#ffe564, 35%)
|
||||
// $badgeErrorColor = #DA5961
|
||||
|
||||
// // 布局
|
||||
// $navbarHeight = 3.6rem
|
||||
// $sidebarWidth = 18rem
|
||||
// $contentWidth = 860px
|
||||
// $homePageWidth = 1100px
|
||||
// $rightMenuWidth = 230px // 右侧菜单
|
||||
|
||||
// // 代码块
|
||||
// $lineNumbersWrapperWidth = 2.5rem
|
||||
|
||||
// 浅色模式
|
||||
.theme-mode-light
|
||||
--bodyBg: rgba(255,255,255,1)
|
||||
--mainBg: rgba(255,255,255,1)
|
||||
--sidebarBg: rgba(255,255,255,.8)
|
||||
--blurBg: rgba(255,255,255,.9)
|
||||
--textColor: #004050
|
||||
--textLightenColor: #0085AD
|
||||
--borderColor: rgba(0,0,0,.15)
|
||||
--codeBg: #f6f6f6
|
||||
--codeColor: #525252
|
||||
codeThemeLight()
|
||||
|
||||
// 深色模式
|
||||
.theme-mode-dark
|
||||
--bodyBg: rgba(30,30,34,1)
|
||||
--mainBg: rgba(30,30,34,1)
|
||||
--sidebarBg: rgba(30,30,34,.8)
|
||||
--blurBg: rgba(30,30,34,.8)
|
||||
--textColor: rgb(140,140,150)
|
||||
--textLightenColor: #0085AD
|
||||
--borderColor: #2C2C3A
|
||||
--codeBg: #252526
|
||||
--codeColor: #fff
|
||||
codeThemeDark()
|
||||
|
||||
// 阅读模式
|
||||
.theme-mode-read
|
||||
--bodyBg: rgba(245,245,213,1)
|
||||
--mainBg: rgba(245,245,213,1)
|
||||
--sidebarBg: rgba(245,245,213,.8)
|
||||
--blurBg: rgba(245,245,213,.9)
|
||||
--textColor: #004050
|
||||
--textLightenColor: #0085AD
|
||||
--borderColor: rgba(0,0,0,.15)
|
||||
--codeBg: #282c34
|
||||
--codeColor: #fff
|
||||
codeThemeDark()
|
|
@ -1,9 +1,13 @@
|
|||
---
|
||||
title: Nosql技术选型
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/75af9b/
|
||||
---
|
||||
|
||||
# Nosql 技术选型
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209020702.png)
|
||||
|
||||
[TOC]
|
||||
|
||||
## 一、Nosql 简介
|
||||
|
||||
传统的关系型数据库存在以下缺点:
|
||||
|
@ -367,7 +371,7 @@ Neo4j 中,存储节点时使用了”index-free adjacency”,即每个节点
|
|||
- **大流量系统** - 如电商单品页,后台考虑选关系型数据库,前台考虑选内存型数据库。
|
||||
- **日志型系统** - 原始数据考虑选列式数据库,日志搜索考虑选搜索引擎。
|
||||
- **搜索型系统** - 例如站内搜索,非通用搜索,如商品搜索,后台考虑选关系型数据库,前台考虑选搜索引擎。
|
||||
- **事务型系统** - 如库存,交易,记账,考虑选关系型数据库+K-V数据库(作为缓存)+分布式事务。
|
||||
- **事务型系统** - 如库存,交易,记账,考虑选关系型数据库+K-V 数据库(作为缓存)+分布式事务。
|
||||
- **离线计算** - 如大量数据分析,考虑选列式数据库或关系型数据。
|
||||
- **实时计算** - 如实时监控,可以考虑选内存型数据库或者列式数据库。
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: 数据结构与数据库索引
|
||||
date: 2022-04-01 20:08:41
|
||||
permalink: /pages/875f28/
|
||||
---
|
||||
|
||||
# 数据结构与数据库索引
|
||||
|
||||
> 关键词:链表、数组、散列表、红黑树、B+ 树、LSM 树、跳表
|
||||
|
@ -116,7 +122,7 @@ B+ 树索引适用于**全键值查找**、**键值范围查找**和**键前缀
|
|||
|
||||
由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。这时候我们就要优先考虑上一段提到的“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。
|
||||
|
||||
------
|
||||
---
|
||||
|
||||
内存是半导体元件。对于内存而言,只要给出了内存地址,我们就可以直接访问该地址取出数据。这个过程具有高效的随机访问特性,因此内存也叫随机访问存储器(Random Access Memory,即 RAM)。内存的访问速度很快,但是价格相对较昂贵,因此一般的计算机内存空间都相对较小。
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
title: 数据库综合
|
||||
date: 2022-04-11 11:08:47
|
||||
permalink: /pages/84f411/
|
||||
---
|
||||
|
||||
# 数据库综合
|
||||
|
||||
## 📖 内容
|
||||
|
||||
### 分布式存储原理
|
||||
|
||||
- [分布式简介](https://dunwu.github.io/design/distributed/分布式简介.html)
|
||||
- [分布式基础理论](https://dunwu.github.io/design/distributed/分布式理论.html) - 关键词:`拜占庭将军`、`CAP`、`BASE`
|
||||
- [分布式算法 Paxos](https://dunwu.github.io/design/distributed/分布式算法Paxos.html) - 关键词:`共识性算法`
|
||||
- [分布式算法 Raft](https://dunwu.github.io/design/distributed/分布式算法Raft.html) - 关键词:`共识性算法`
|
||||
- [负载均衡](https://dunwu.github.io/design/distributed/负载均衡.html) - 关键词:`轮询`、`随机`、`最少连接`、`源地址哈希`、`一致性哈希`、`虚拟 hash 槽`
|
||||
- [消息队列](https://dunwu.github.io/design/distributed/消息队列.html) - 关键词:`重复消费`、`消息丢失`、`消息顺序性`、`消息积压`
|
||||
- [分布式存储](https://dunwu.github.io/design/distributed/分布式存储.html) - 关键词:`读写分离`、`分库分表`、`迁移`、`扩容`
|
||||
- [分布式缓存](https://dunwu.github.io/design/distributed/分布式缓存.html) - 关键词:`进程内缓存`、`分布式缓存`、`缓存雪崩`、`缓存穿透`、`缓存击穿`、`缓存更新`、`缓存预热`、`缓存降级`
|
||||
- [分布式锁](https://dunwu.github.io/design/distributed/分布式锁.html) - 关键词:`数据库`、`Redis`、`ZooKeeper`、`互斥`、`可重入`、`死锁`、`容错`、`自旋尝试`
|
||||
- [分布式 ID](https://dunwu.github.io/design/distributed/分布式ID.html) - 关键词:`UUID`、`自增序列`、`雪花算法`、`Leaf`
|
||||
- [分布式事务](https://dunwu.github.io/design/distributed/分布式事务.html) - 关键词:`2PC`、`3PC`、`TCC`、`本地消息表`、`MQ 消息`、`SAGA`
|
||||
- [分布式会话](https://dunwu.github.io/design/distributed/分布式会话.html) - 关键词:`粘性 Session`、`Session 复制共享`、`基于缓存的 session 共享`
|
||||
- [流量控制](https://dunwu.github.io/design/distributed/流量控制.html) - 关键词:`计数器法`、`时间窗口法`、`令牌桶法`、`漏桶法`
|
||||
|
||||
### 其他
|
||||
|
||||
- [Nosql 技术选型](01.Nosql技术选型.md)
|
||||
- [数据结构与数据库索引](02.数据结构与数据库索引.md)
|
||||
|
||||
## 📚 资料
|
||||
|
||||
## 🚪 传送
|
||||
|
||||
◾ 🏠 [DB-TUTORIAL 首页](https://github.com/dunwu/db-tutorial) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾
|
|
@ -1,4 +1,10 @@
|
|||
# ShardingSphere
|
||||
---
|
||||
title: ShardingSphere 简介
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/283bf8/
|
||||
---
|
||||
|
||||
# ShardingSphere 简介
|
||||
|
||||
## 简介
|
||||
|
||||
|
@ -6,7 +12,7 @@
|
|||
|
||||
ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这 3 款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151613.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151613.png)
|
||||
|
||||
#### ShardingSphere-JDBC
|
||||
|
||||
|
@ -16,7 +22,7 @@ ShardingSphere 是一套开源的分布式数据库中间件解决方案组成
|
|||
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
|
||||
- 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
|
||||
|
||||
#### Sharding-Proxy
|
||||
|
||||
|
@ -25,7 +31,7 @@ ShardingSphere 是一套开源的分布式数据库中间件解决方案组成
|
|||
- 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用。
|
||||
- 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151434.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151434.png)
|
||||
|
||||
#### Sharding-Sidecar(TODO)
|
||||
|
||||
|
@ -33,7 +39,7 @@ ShardingSphere 是一套开源的分布式数据库中间件解决方案组成
|
|||
|
||||
Database Mesh 的关注重点在于如何将分布式的数据访问应用与数据库有机串联起来,它更加关注的是交互,是将杂乱无章的应用与数据库之间的交互进行有效地梳理。 使用 Database Mesh,访问数据库的应用和数据库终将形成一个巨大的网格体系,应用和数据库只需在网格体系中对号入座即可,它们都是被啮合层所治理的对象。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151557.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151557.png)
|
||||
|
||||
| _Sharding-JDBC_ | _Sharding-Proxy_ | _Sharding-Sidecar_ | |
|
||||
| :-------------- | :--------------- | :----------------- | ------ |
|
||||
|
@ -50,7 +56,7 @@ ShardingSphere-JDBC 采用无中心化架构,适用于 Java 开发的高性能
|
|||
|
||||
Apache ShardingSphere 是多接入端共同组成的生态圈。 通过混合使用 ShardingSphere-JDBC 和 ShardingSphere-Proxy,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,使得架构师更加自由地调整适合与当前业务的最佳系统架构。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151658.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151658.png)
|
||||
|
||||
### 功能列表
|
||||
|
|
@ -1,4 +1,10 @@
|
|||
# shardingsphere-jdbc
|
||||
---
|
||||
title: ShardingSphere Jdbc
|
||||
date: 2020-10-08 15:20:54
|
||||
permalink: /pages/77e49a/
|
||||
---
|
||||
|
||||
# ShardingSphere Jdbc
|
||||
|
||||
## 简介
|
||||
|
||||
|
@ -8,7 +14,7 @@ shardingsphere-jdbc 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供
|
|||
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
|
||||
- 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
|
||||
|
||||
## 快速入门
|
||||
|
||||
|
@ -74,7 +80,7 @@ DataSource dataSource = ShardingSphereDataSourceFactory.createDataSource(dataSou
|
|||
|
||||
ShardingSphere 的 3 个产品的数据分片主要流程是完全一致的。 核心由 `SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并`的流程组成。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008153551.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008153551.png)
|
||||
|
||||
- QL 解析:分为词法解析和语法解析。 先通过词法解析器将 SQL 拆分为一个个不可再分的单词。再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。 解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记。
|
||||
- 执行器优化:合并和优化分片条件,如 OR 等。
|
|
@ -1,8 +1,12 @@
|
|||
# Flyway
|
||||
---
|
||||
title: 版本管理中间件 Flyway
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/6adeea/
|
||||
---
|
||||
|
||||
# 版本管理中间件 Flyway
|
||||
|
||||
> Flyway 是一个数据迁移工具。
|
||||
>
|
||||
> 关键词:
|
||||
|
||||
## 简介
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
title: 数据库中间件
|
||||
date: 2022-04-11 11:31:18
|
||||
permalink: /pages/057a1d/
|
||||
---
|
||||
|
||||
# 数据库中间件
|
||||
|
||||
## 📖 内容
|
||||
|
||||
- [ShardingSphere 简介](01.Shardingsphere/01.ShardingSphere简介.md)
|
||||
- [ShardingSphere Jdbc](01.Shardingsphere/02.ShardingSphereJdbc.md)
|
||||
- [版本管理中间件 Flyway](02.Flyway.md)
|
||||
|
||||
## 📚 资料
|
||||
|
||||
## 🚪 传送
|
||||
|
||||
◾ 🏠 [DB-TUTORIAL 首页](https://github.com/dunwu/db-tutorial) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾
|
|
@ -1,4 +1,10 @@
|
|||
# 关系型数据库面试题
|
||||
---
|
||||
title: 关系型数据库面试
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/2696ef/
|
||||
---
|
||||
|
||||
# 关系型数据库面试
|
||||
|
||||
## 一、索引和约束
|
||||
|
||||
|
@ -869,7 +875,6 @@ SQL 关键字尽量大写,如:Oracle 默认会将 SQL 语句中的关键字
|
|||
<img src="https://raw.githubusercontent.com/dunwu/images/dev/cs/database/RDB/数据库范式.png"/>
|
||||
</div>
|
||||
|
||||
|
||||
#### 第一范式 (1NF)
|
||||
|
||||
属性不可分。
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: sql-cheat-sheet
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/91ff1a/
|
||||
---
|
||||
# SQL Cheat Sheet
|
||||
|
||||
> 本文针对关系型数据库的基本语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。
|
|
@ -1,6 +1,12 @@
|
|||
# 高级 SQL
|
||||
---
|
||||
title: 扩展 SQL
|
||||
date: 2020-10-09 09:31:05
|
||||
permalink: /pages/34648b/
|
||||
---
|
||||
|
||||
> 不同于 [SQL Cheat Sheet](sql-cheat-sheet.md) 中的一般语法,本文主要整理收集一些高级但是很有用的 SQL
|
||||
# 扩展 SQL
|
||||
|
||||
> 不同于 [SQL Cheat Sheet](02.SqlCheatSheet.md) 中的一般语法,本文主要整理收集一些高级但是很有用的 SQL
|
||||
|
||||
## 数据库
|
||||
|
|
@ -1,10 +1,16 @@
|
|||
# 关系型数据库共性知识
|
||||
---
|
||||
title: 关系型数据库综合知识
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/35fa72/
|
||||
---
|
||||
|
||||
# 关系型数据库综合知识
|
||||
|
||||
## 📖 内容
|
||||
|
||||
### [关系型数据库面试题 💯](sql-interview.md)
|
||||
### [关系型数据库面试题 💯](01.关系型数据库面试.md)
|
||||
|
||||
### [SQL Cheat Sheet](sql-cheat-sheet.md)
|
||||
### [SQL Cheat Sheet](02.SqlCheatSheet.md)
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200115160512.png)
|
||||
|
|
@ -1,34 +1,11 @@
|
|||
---
|
||||
title: Mysql 应用指南
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/08cbb1/
|
||||
---
|
||||
|
||||
# Mysql 应用指南
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. SQL 执行过程](#1-sql-执行过程)
|
||||
- [2. 存储引擎](#2-存储引擎)
|
||||
- [2.1. 选择存储引擎](#21-选择存储引擎)
|
||||
- [2.2. MyISAM](#22-myisam)
|
||||
- [2.3. InnoDB](#23-innodb)
|
||||
- [3. 数据类型](#3-数据类型)
|
||||
- [3.1. 整型](#31-整型)
|
||||
- [3.2. 浮点型](#32-浮点型)
|
||||
- [3.3. 字符串](#33-字符串)
|
||||
- [3.4. 时间和日期](#34-时间和日期)
|
||||
- [3.5. BLOB 和 TEXT](#35-blob-和-text)
|
||||
- [3.6. 枚举类型](#36-枚举类型)
|
||||
- [3.7. 类型的选择](#37-类型的选择)
|
||||
- [4. 索引](#4-索引)
|
||||
- [5. 锁](#5-锁)
|
||||
- [6. 事务](#6-事务)
|
||||
- [7. 性能优化](#7-性能优化)
|
||||
- [8. 复制](#8-复制)
|
||||
- [8.1. 主从复制](#81-主从复制)
|
||||
- [8.2. 读写分离](#82-读写分离)
|
||||
- [9. 分布式事务](#9-分布式事务)
|
||||
- [10. 分库分表](#10-分库分表)
|
||||
- [11. 参考资料](#11-参考资料)
|
||||
- [12. 传送门](#12-传送门)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. SQL 执行过程
|
||||
|
||||
学习 Mysql,最好是先从宏观上了解 Mysql 工作原理。
|
||||
|
@ -180,19 +157,19 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提
|
|||
|
||||
## 4. 索引
|
||||
|
||||
> 详见:[Mysql 索引](mysql-index.md)
|
||||
> 详见:[Mysql 索引](05.Mysql索引.md)
|
||||
|
||||
## 5. 锁
|
||||
|
||||
> 详见:[Mysql 锁](mysql-lock.md)
|
||||
> 详见:[Mysql 锁](04.Mysql锁.md)
|
||||
|
||||
## 6. 事务
|
||||
|
||||
> 详见:[Mysql 事务](mysql-transaction.md)
|
||||
> 详见:[Mysql 事务](03.Mysql事务.md)
|
||||
|
||||
## 7. 性能优化
|
||||
|
||||
> 详见:[Mysql 性能优化](mysql-optimization.md)
|
||||
> 详见:[Mysql 性能优化](06.Mysql性能优化.md)
|
||||
|
||||
## 8. 复制
|
||||
|
|
@ -1,24 +1,11 @@
|
|||
---
|
||||
title: MySQL 工作流
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/58c61a/
|
||||
---
|
||||
|
||||
# MySQL 工作流
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 基础架构](#1-基础架构)
|
||||
- [2. 查询过程](#2-查询过程)
|
||||
- [2.1. (一)连接](#21-一连接)
|
||||
- [2.2. (二)查询缓存](#22-二查询缓存)
|
||||
- [2.3. (三)语法分析](#23-三语法分析)
|
||||
- [2.4. (四)查询优化](#24-四查询优化)
|
||||
- [2.5. (五)查询执行引擎](#25-五查询执行引擎)
|
||||
- [2.6. (六)返回结果](#26-六返回结果)
|
||||
- [3. 更新过程](#3-更新过程)
|
||||
- [3.1. redo log](#31-redo-log)
|
||||
- [3.2. bin log](#32-bin-log)
|
||||
- [3.3. redo log vs. bin log](#33-redo-log-vs-bin-log)
|
||||
- [3.4. 两阶段提交](#34-两阶段提交)
|
||||
- [4. 参考资料](#4-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 基础架构
|
||||
|
||||
大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Mysql 事务
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/d0add6/
|
||||
---
|
||||
|
||||
# Mysql 事务
|
||||
|
||||
> 不是所有的 Mysql 存储引擎都实现了事务处理。支持事务的存储引擎有:`InnoDB` 和 `NDB Cluster`。不支持事务的存储引擎,代表有:`MyISAM`。
|
||||
|
@ -6,33 +12,6 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716074533.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 事务简介](#1-事务简介)
|
||||
- [2. 事务用法](#2-事务用法)
|
||||
- [2.1. 事务处理指令](#21-事务处理指令)
|
||||
- [2.2. AUTOCOMMIT](#22-autocommit)
|
||||
- [3. ACID](#3-acid)
|
||||
- [4. 事务隔离级别](#4-事务隔离级别)
|
||||
- [4.1. 事务隔离简介](#41-事务隔离简介)
|
||||
- [4.2. 未提交读](#42-未提交读)
|
||||
- [4.3. 提交读](#43-提交读)
|
||||
- [4.4. 可重复读](#44-可重复读)
|
||||
- [4.5. 串行化](#45-串行化)
|
||||
- [4.6. 隔离级别小结](#46-隔离级别小结)
|
||||
- [5. 死锁](#5-死锁)
|
||||
- [5.1. 死锁的原因](#51-死锁的原因)
|
||||
- [5.2. 避免死锁](#52-避免死锁)
|
||||
- [5.3. 解决死锁](#53-解决死锁)
|
||||
- [6. 分布式事务](#6-分布式事务)
|
||||
- [7. 事务最佳实践](#7-事务最佳实践)
|
||||
- [7.1. 尽量使用低级别事务隔离](#71-尽量使用低级别事务隔离)
|
||||
- [7.2. 避免行锁升级表锁](#72-避免行锁升级表锁)
|
||||
- [7.3. 缩小事务范围](#73-缩小事务范围)
|
||||
- [8. 参考资料](#8-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 事务简介
|
||||
|
||||
> 事务简单来说:**一个 Session 中所进行所有的操作,要么同时成功,要么同时失败**。进一步说,事务指的是满足 ACID 特性的一组操作,可以通过 `Commit` 提交一个事务,也可以使用 `Rollback` 进行回滚。
|
||||
|
@ -246,7 +225,7 @@ T<sub>1</sub> 读取某个范围的数据,T<sub>2</sub> 在这个范围内插
|
|||
数据库隔离级别解决的问题:
|
||||
|
||||
| 隔离级别 | 丢失修改 | 脏读 | 不可重复读 | 幻读 |
|
||||
| :------: | :--: | :--------: | :--: | :--: |
|
||||
| :------: | :------: | :--: | :--------: | :--: |
|
||||
| 未提交读 | ✔️ | ❌ | ❌ | ❌ |
|
||||
| 提交读 | ✔️ | ✔️ | ❌ | ❌ |
|
||||
| 可重复读 | ✔️ | ✔️ | ✔️ | ❌ |
|
|
@ -1,24 +1,13 @@
|
|||
---
|
||||
title: Mysql 锁
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/dcd4a7/
|
||||
---
|
||||
|
||||
# Mysql 锁
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716064947.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 悲观锁和乐观锁](#1-悲观锁和乐观锁)
|
||||
- [2. 表级锁和行级锁](#2-表级锁和行级锁)
|
||||
- [3. 读写锁](#3-读写锁)
|
||||
- [4. 意向锁](#4-意向锁)
|
||||
- [5. MVCC](#5-mvcc)
|
||||
- [5.1. MVCC 思想](#51-mvcc-思想)
|
||||
- [5.2. 版本号](#52-版本号)
|
||||
- [5.3. Undo 日志](#53-undo-日志)
|
||||
- [5.4. ReadView](#54-readview)
|
||||
- [5.5. 快照读与当前读](#55-快照读与当前读)
|
||||
- [6. 行锁](#6-行锁)
|
||||
- [7. 参考资料](#7-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 悲观锁和乐观锁
|
||||
|
||||
确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,**乐观锁和悲观锁是并发控制主要采用的技术手段。**
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Mysql 索引
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/aa6a1a/
|
||||
---
|
||||
|
||||
# Mysql 索引
|
||||
|
||||
> 索引是提高 MySQL 查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引,因为事后可能需要监控大量的 SQL 才能定位到问题所在,而且添加索引的时间肯定是远大于初始添加索引所需要的时间,可见索引的添加也是非常有技术含量的。
|
||||
|
@ -6,35 +12,6 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200715172009.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 索引简介](#1-索引简介)
|
||||
- [1.1. 索引的优缺点](#11-索引的优缺点)
|
||||
- [1.2. 何时使用索引](#12-何时使用索引)
|
||||
- [2. 索引的数据结构](#2-索引的数据结构)
|
||||
- [2.1. 哈希索引](#21-哈希索引)
|
||||
- [2.2. B 树索引](#22-b-树索引)
|
||||
- [2.3. 全文索引](#23-全文索引)
|
||||
- [2.4. 空间数据索引](#24-空间数据索引)
|
||||
- [3. 索引的类型](#3-索引的类型)
|
||||
- [3.1. 主键索引(`PRIMARY`)](#31-主键索引primary)
|
||||
- [3.2. 唯一索引(`UNIQUE`)](#32-唯一索引unique)
|
||||
- [3.3. 普通索引(`INDEX`)](#33-普通索引index)
|
||||
- [3.4. 全文索引(`FULLTEXT`)](#34-全文索引fulltext)
|
||||
- [3.5. 联合索引](#35-联合索引)
|
||||
- [4. 索引的策略](#4-索引的策略)
|
||||
- [4.1. 索引基本原则](#41-索引基本原则)
|
||||
- [4.2. 独立的列](#42-独立的列)
|
||||
- [4.3. 覆盖索引](#43-覆盖索引)
|
||||
- [4.4. 使用索引来排序](#44-使用索引来排序)
|
||||
- [4.5. 前缀索引](#45-前缀索引)
|
||||
- [4.6. 最左前缀匹配原则](#46-最左前缀匹配原则)
|
||||
- [4.7. = 和 in 可以乱序](#47--和-in-可以乱序)
|
||||
- [5. 索引最佳实践](#5-索引最佳实践)
|
||||
- [6. 参考资料](#6-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 索引简介
|
||||
|
||||
**索引是数据库为了提高查找效率的一种数据结构**。
|
||||
|
@ -124,7 +101,6 @@ B 树是最常见的索引,按照顺序存储数据,所以 Mysql 可以用
|
|||
- 出现哈希冲突时,必须遍历链表中所有的行指针,逐行比较,直到找到符合条件的行。
|
||||
- 如果哈希冲突多的话,维护索引的代价会很高。
|
||||
|
||||
|
||||
> 因为种种限制,所以哈希索引只适用于特定的场合。而一旦使用哈希索引,则它带来的性能提升会非常显著。
|
||||
|
||||
### 2.2. B 树索引
|
|
@ -1,26 +1,11 @@
|
|||
---
|
||||
title: Mysql 性能优化
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/387d10/
|
||||
---
|
||||
|
||||
# Mysql 性能优化
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 数据结构优化](#1-数据结构优化)
|
||||
- [1.1. 数据类型优化](#11-数据类型优化)
|
||||
- [1.2. 表设计](#12-表设计)
|
||||
- [1.3. 范式和反范式](#13-范式和反范式)
|
||||
- [1.4. 索引优化](#14-索引优化)
|
||||
- [2. SQL 优化](#2-sql-优化)
|
||||
- [2.1. 优化 `COUNT()` 查询](#21-优化-count-查询)
|
||||
- [2.2. 优化关联查询](#22-优化关联查询)
|
||||
- [2.3. 优化 `GROUP BY` 和 `DISTINCT`](#23-优化-group-by-和-distinct)
|
||||
- [2.4. 优化 `LIMIT`](#24-优化-limit)
|
||||
- [2.5. 优化 UNION](#25-优化-union)
|
||||
- [2.6. 优化查询方式](#26-优化查询方式)
|
||||
- [3. 执行计划(`EXPLAIN`)](#3-执行计划explain)
|
||||
- [4. optimizer trace](#4-optimizer-trace)
|
||||
- [5. 数据模型和业务](#5-数据模型和业务)
|
||||
- [6. 参考资料](#6-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 数据结构优化
|
||||
|
||||
良好的逻辑设计和物理设计是高性能的基石。
|
|
@ -1,41 +1,13 @@
|
|||
---
|
||||
title: Mysql 运维
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/4e960f/
|
||||
---
|
||||
|
||||
# Mysql 运维
|
||||
|
||||
> 如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维。如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 安装部署](#1-安装部署)
|
||||
- [1.1. Windows 安装](#11-windows-安装)
|
||||
- [1.2. CentOS 安装](#12-centos-安装)
|
||||
- [1.3. 初始化数据库密码](#13-初始化数据库密码)
|
||||
- [1.4. 配置远程访问](#14-配置远程访问)
|
||||
- [1.5. 跳过登录认证](#15-跳过登录认证)
|
||||
- [2. 基本运维](#2-基本运维)
|
||||
- [2.1. 客户端连接](#21-客户端连接)
|
||||
- [2.2. 查看连接](#22-查看连接)
|
||||
- [2.3. 创建用户](#23-创建用户)
|
||||
- [2.4. 查看用户](#24-查看用户)
|
||||
- [2.5. 授权](#25-授权)
|
||||
- [2.6. 撤销授权](#26-撤销授权)
|
||||
- [2.7. 查看授权](#27-查看授权)
|
||||
- [2.8. 更改用户密码](#28-更改用户密码)
|
||||
- [2.9. 备份与恢复](#29-备份与恢复)
|
||||
- [2.10. 卸载](#210-卸载)
|
||||
- [2.11. 主从节点部署](#211-主从节点部署)
|
||||
- [3. 服务器配置](#3-服务器配置)
|
||||
- [3.1. 配置文件路径](#31-配置文件路径)
|
||||
- [3.2. 配置项语法](#32-配置项语法)
|
||||
- [3.3. 常用配置项说明](#33-常用配置项说明)
|
||||
- [4. 常见问题](#4-常见问题)
|
||||
- [4.1. Too many connections](#41-too-many-connections)
|
||||
- [4.2. 时区(time_zone)偏差](#42-时区time_zone偏差)
|
||||
- [4.3. 数据表损坏如何修复](#43-数据表损坏如何修复)
|
||||
- [4.4. 数据结构](#44-数据结构)
|
||||
- [5. 脚本](#5-脚本)
|
||||
- [6. 参考资料](#6-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 安装部署
|
||||
|
||||
### 1.1. Windows 安装
|
||||
|
@ -682,7 +654,7 @@ Default options are read from the following files in the given order:
|
|||
|
||||
### 3.3. 常用配置项说明
|
||||
|
||||
> 这里介绍比较常用的基本配置,更多配置项说明可以参考:[Mysql 服务器配置说明](mysql-config.md)
|
||||
> 这里介绍比较常用的基本配置,更多配置项说明可以参考:[Mysql 服务器配置说明](21.Mysql配置.md)
|
||||
|
||||
先给出一份常用配置模板,内容如下:
|
||||
|
|
@ -1,15 +1,13 @@
|
|||
# Mysql 服务器配置
|
||||
---
|
||||
title: Mysql 配置
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/423d2d/
|
||||
---
|
||||
|
||||
# Mysql 配置
|
||||
|
||||
> 版本:![mysql](https://img.shields.io/badge/mysql-8.0-blue)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 基本配置](#1-基本配置)
|
||||
- [2. 配置项说明](#2-配置项说明)
|
||||
- [3. 参考资料](#3-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 基本配置
|
||||
|
||||
```ini
|
|
@ -1,14 +1,13 @@
|
|||
# Mysql FAQ
|
||||
---
|
||||
title: Mysql 常见问题
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/ea9962/
|
||||
---
|
||||
|
||||
# Mysql 常见问题
|
||||
|
||||
> **📦 本文以及示例源码已归档在 [db-tutorial](https://github.com/dunwu/db-tutorial/)**
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 为什么表数据删掉一半,表文件大小不变](#1-为什么表数据删掉一半表文件大小不变)
|
||||
- [2. 参考资料](#2-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 为什么表数据删掉一半,表文件大小不变
|
||||
|
||||
【问题】数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?
|
|
@ -1,36 +1,44 @@
|
|||
---
|
||||
title: Mysql 教程
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/f29f7c/
|
||||
---
|
||||
|
||||
# Mysql 教程
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716103611.png)
|
||||
|
||||
## 📖 内容
|
||||
|
||||
### [Mysql 应用指南](mysql-quickstart.md)
|
||||
### [Mysql 应用指南](01.Mysql应用指南.md)
|
||||
|
||||
### [Mysql 工作流](mysql-workflow.md)
|
||||
### [Mysql 工作流](02.MySQL工作流.md)
|
||||
|
||||
### [Mysql 索引](mysql-index.md)
|
||||
|
||||
> 关键词:`Hash`、`B 树`、`聚簇索引`、`回表`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200715172009.png)
|
||||
|
||||
### [Mysql 锁](mysql-lock.md)
|
||||
|
||||
> 关键词:`乐观锁`、`表级锁`、`行级锁`、`意向锁`、`MVCC`、`Next-key 锁`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716064947.png)
|
||||
|
||||
### [Mysql 事务](mysql-transaction.md)
|
||||
### [Mysql 事务](03.Mysql事务.md)
|
||||
|
||||
> 关键词:`ACID`、`AUTOCOMMIT`、`事务隔离级别`、`死锁`、`分布式事务`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716074533.png)
|
||||
|
||||
### [Mysql 性能优化](mysql-optimization.md)
|
||||
### [Mysql 锁](04.Mysql锁.md)
|
||||
|
||||
### [Mysql 运维](mysql-ops.md) 🔨
|
||||
> 关键词:`乐观锁`、`表级锁`、`行级锁`、`意向锁`、`MVCC`、`Next-key 锁`
|
||||
|
||||
### [Mysql 配置](mysql-config.md) 🔨
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716064947.png)
|
||||
|
||||
### [Mysql 索引](05.Mysql索引.md)
|
||||
|
||||
> 关键词:`Hash`、`B 树`、`聚簇索引`、`回表`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200715172009.png)
|
||||
|
||||
### [Mysql 性能优化](06.Mysql性能优化.md)
|
||||
|
||||
### [Mysql 运维](20.Mysql运维.md) 🔨
|
||||
|
||||
### [Mysql 配置](21.Mysql配置.md) 🔨
|
||||
|
||||
### [Mysql 常见问题](99.Mysql常见问题)
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: PostgreSQL 应用指南
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/bb2260/
|
||||
---
|
||||
|
||||
# PostgreSQL 应用指南
|
||||
|
||||
> [PostgreSQL](https://www.postgresql.org/) 是一个关系型数据库(RDBM)。
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: H2 应用指南
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/d15410/
|
||||
---
|
||||
|
||||
# H2 应用指南
|
||||
|
||||
## 概述
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: sqlite
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/ec4fc2/
|
||||
---
|
||||
|
||||
# SQLite
|
||||
|
||||
> SQLite 是一个实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
title: 关系型数据库其他知识
|
||||
date: 2022-04-11 12:14:59
|
||||
permalink: /pages/d64774/
|
||||
---
|
||||
|
||||
# 关系型数据库其他知识
|
||||
|
||||
## 📖 内容
|
||||
|
||||
- [PostgreSQL 应用指南](01.PostgreSQL.md)
|
||||
- [H2 应用指南](02.H2.md)
|
||||
- [SqLite 应用指南](03.Sqlite.md)
|
||||
|
||||
## 📚 资料
|
||||
|
||||
## 🚪 传送
|
||||
|
||||
◾ 🏠 [DB-TUTORIAL 首页](https://github.com/dunwu/db-tutorial) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾
|
|
@ -0,0 +1,66 @@
|
|||
---
|
||||
title: 关系型数据库
|
||||
date: 2022-04-11 11:45:33
|
||||
permalink: /pages/ba3eb1/
|
||||
---
|
||||
|
||||
# 关系型数据库
|
||||
|
||||
## 📖 内容
|
||||
|
||||
### 公共知识
|
||||
|
||||
- [关系型数据库面试总结](01.综合/01.关系型数据库面试.md) 💯
|
||||
- [SQL Cheat Sheet](01.综合/02.SqlCheatSheet.md) 是一个 SQL 入门教程。
|
||||
- [扩展 SQL](01.综合/03.扩展SQL.md) 是一个 SQL 入门教程。
|
||||
|
||||
### Mysql
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716103611.png)
|
||||
|
||||
- [Mysql 应用指南](02.Mysql/01.Mysql应用指南.md) ⚡
|
||||
- [Mysql 工作流](02.Mysql/02.MySQL工作流.md) - 关键词:`连接`、`缓存`、`语法分析`、`优化`、`执行引擎`、`redo log`、`bin log`、`两阶段提交`
|
||||
- [Mysql 事务](02.Mysql/03.Mysql事务.md) - 关键词:`ACID`、`AUTOCOMMIT`、`事务隔离级别`、`死锁`、`分布式事务`
|
||||
- [Mysql 锁](02.Mysql/04.Mysql锁.md) - 关键词:`乐观锁`、`表级锁`、`行级锁`、`意向锁`、`MVCC`、`Next-key 锁`
|
||||
- [Mysql 索引](02.Mysql/05.Mysql索引.md) - 关键词:`Hash`、`B 树`、`聚簇索引`、`回表`
|
||||
- [Mysql 性能优化](02.Mysql/06.Mysql性能优化.md)
|
||||
- [Mysql 运维](02.Mysql/20.Mysql运维.md) 🔨
|
||||
- [Mysql 配置](02.Mysql/21.Mysql配置.md) 🔨
|
||||
- [Mysql 问题](02.Mysql/99.Mysql常见问题.md)
|
||||
|
||||
### 其他
|
||||
|
||||
- [PostgreSQL 应用指南](99.其他/01.PostgreSQL.md)
|
||||
- [H2 应用指南](99.其他/02.H2.md)
|
||||
- [SqLite 应用指南](99.其他/03.Sqlite.md)
|
||||
|
||||
## 📚 资料
|
||||
|
||||
### 综合
|
||||
|
||||
- [《数据库的索引设计与优化》](https://book.douban.com/subject/26419771/)
|
||||
- [《SQL 必知必会》](https://book.douban.com/subject/35167240/) - SQL 的基本概念和语法【入门】
|
||||
|
||||
### Mysql
|
||||
|
||||
- **官方**
|
||||
- [Mysql 官网](https://www.mysql.com/)
|
||||
- [Mysql 官方文档](https://dev.mysql.com/doc/)
|
||||
- [Mysql 官方文档之命令行客户端](https://dev.mysql.com/doc/refman/8.0/en/mysql.html)
|
||||
- **书籍**
|
||||
- [《高性能 MySQL》](https://book.douban.com/subject/23008813/) - 经典,适合 DBA 或作为开发者的参考手册
|
||||
- [《MySQL 必知必会》](https://book.douban.com/subject/3354490/) - 适合入门者
|
||||
- **教程**
|
||||
- [MySQL 实战 45 讲](https://time.geekbang.org/column/intro/139)
|
||||
- [runoob.com MySQL 教程](http://www.runoob.com/mysql/mysql-tutorial.html)
|
||||
- [mysql-tutorial](https://github.com/jaywcjlove/mysql-tutorial)
|
||||
- **更多资源**
|
||||
- [awesome-mysql](https://github.com/jobbole/awesome-mysql-cn)
|
||||
|
||||
### 其他
|
||||
|
||||
- [《Oracle Database 9i/10g/11g 编程艺术》](https://book.douban.com/subject/5402711/)
|
||||
|
||||
## 🚪 传送
|
||||
|
||||
◾ 🏠 [DB-TUTORIAL 首页](https://github.com/dunwu/db-tutorial) ◾ 🎯 [我的博客](https://github.com/dunwu/blog) ◾
|
|
@ -1,32 +1,11 @@
|
|||
---
|
||||
title: MongoDB 应用指南
|
||||
date: 2020-09-07 09:01:07
|
||||
permalink: /pages/b4209b/
|
||||
---
|
||||
|
||||
# MongoDB 应用指南
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [简介](#简介)
|
||||
- [MongoDB 发展](#mongodb-发展)
|
||||
- [MongoDB 和 RDBMS](#mongodb-和-rdbms)
|
||||
- [MongoDB 特性](#mongodb-特性)
|
||||
- [MongoDB 概念](#mongodb-概念)
|
||||
- [数据库](#数据库)
|
||||
- [文档](#文档)
|
||||
- [集合](#集合)
|
||||
- [元数据](#元数据)
|
||||
- [MongoDB 数据类型](#mongodb-数据类型)
|
||||
- [MongoDB CRUD](#mongodb-crud)
|
||||
- [数据库操作](#数据库操作)
|
||||
- [集合操作](#集合操作)
|
||||
- [插入文档操作](#插入文档操作)
|
||||
- [查询文档操作](#查询文档操作)
|
||||
- [更新文档操作](#更新文档操作)
|
||||
- [删除文档操作](#删除文档操作)
|
||||
- [索引操作](#索引操作)
|
||||
- [MongoDB 聚合操作](#mongodb-聚合操作)
|
||||
- [管道](#管道)
|
||||
- [聚合步骤](#聚合步骤)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 简介
|
||||
|
||||
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
|
|
@ -1,8 +1,10 @@
|
|||
# MongoDB CRUD 操作
|
||||
---
|
||||
title: MongoDB 的 CRUD 操作
|
||||
date: 2020-09-24 11:16:13
|
||||
permalink: /pages/d930e5/
|
||||
---
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
<!-- /TOC -->
|
||||
# MongoDB 的 CRUD 操作
|
||||
|
||||
## 一、基本 CRUD 操作
|
||||
|
||||
|
@ -17,7 +19,7 @@ MongoDB 提供以下操作向一个 collection 插入 document
|
|||
|
||||
> 注:以上操作都是原子操作。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924112342.svg)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924112342.svg)
|
||||
|
||||
插入操作的特性:
|
||||
|
||||
|
@ -66,7 +68,7 @@ db.inventory.insertMany([
|
|||
|
||||
MongoDB 提供 [`db.collection.find()`](https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find) 方法来检索 document。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924113832.svg)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924113832.svg)
|
||||
|
||||
### Update 操作
|
||||
|
||||
|
@ -82,7 +84,7 @@ MongoDB 提供以下操作来更新 collection 中的 document
|
|||
- [`db.collection.updateMany(<filter>, <update>, <options>)`](https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/#db.collection.updateMany)
|
||||
- [`db.collection.replaceOne(<filter>, <update>, <options>)`](https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/#db.collection.replaceOne)
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924114043.svg)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924114043.svg)
|
||||
|
||||
【示例】插入测试数据
|
||||
|
||||
|
@ -191,7 +193,7 @@ MongoDB 提供以下操作来删除 collection 中的 document
|
|||
- [`db.collection.deleteOne()`](https://docs.mongodb.com/manual/reference/method/db.collection.deleteOne/#db.collection.deleteOne):删除一条 document
|
||||
- [`db.collection.deleteMany()`](https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany/#db.collection.deleteMany):删除多条 document
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924120007.svg)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924120007.svg)
|
||||
|
||||
删除操作的特性:
|
||||
|
||||
|
@ -295,7 +297,7 @@ try {
|
|||
### 术语和概念
|
||||
|
||||
| SQL 术语和概念 | MongoDB 术语和概念 |
|
||||
| :-------------------------- | :----------------------------------------------------------- |
|
||||
| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| database | [database](https://docs.mongodb.com/manual/reference/glossary/#term-database) |
|
||||
| table | [collection](https://docs.mongodb.com/manual/reference/glossary/#term-collection) |
|
||||
| row | [document](https://docs.mongodb.com/manual/reference/glossary/#term-document) 或 [BSON](https://docs.mongodb.com/manual/reference/glossary/#term-bson) |
|
|
@ -1,4 +1,10 @@
|
|||
# MongoDB 聚合操作
|
||||
---
|
||||
title: MongoDB 的聚合操作
|
||||
date: 2020-09-21 09:17:26
|
||||
permalink: /pages/4abdcc/
|
||||
---
|
||||
|
||||
# MongoDB 的聚合操作
|
||||
|
||||
聚合操作处理数据记录并返回计算结果。聚合操作将来自多个 document 的值分组,并可以对分组的数据执行各种操作以返回单个结果。 MongoDB 提供了三种执行聚合的方式:聚合管道,map-reduce 函数和单一目的聚合方法。
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: MongoDB 事务
|
||||
date: 2020-09-21 09:09:43
|
||||
permalink: /pages/368234/
|
||||
---
|
||||
|
||||
# MongoDB 事务
|
||||
|
||||
writeConcern 可以决定写操作到达多少个节点才算成功。
|
||||
|
@ -14,9 +20,9 @@ journal 则定义如何才算成功。取值包括:
|
|||
【示例】在集群中使用 writeConcern 参数
|
||||
|
||||
```javascript
|
||||
db.transaction.insert({"count":1}, {"writeConcern":{w:"majoriy"}})
|
||||
db.transaction.insert({"count":1}, {"writeConcern":{w:"4"}})
|
||||
db.transaction.insert({"count":1}, {"writeConcern":{w:"all"}})
|
||||
db.transaction.insert({ count: 1 }, { writeConcern: { w: 'majoriy' } })
|
||||
db.transaction.insert({ count: 1 }, { writeConcern: { w: '4' } })
|
||||
db.transaction.insert({ count: 1 }, { writeConcern: { w: 'all' } })
|
||||
```
|
||||
|
||||
【示例】配置延迟节点,模拟网络延迟
|
||||
|
@ -27,4 +33,3 @@ conf.memebers[2].slaveDelay=5
|
|||
conf.memebers[2].priority=0
|
||||
rs.reconfig(conf)
|
||||
```
|
||||
|
|
@ -1,29 +1,15 @@
|
|||
---
|
||||
title: MongoDB 建模
|
||||
date: 2020-09-08 08:58:10
|
||||
permalink: /pages/e81890/
|
||||
---
|
||||
|
||||
# MongoDB 建模
|
||||
|
||||
MongoDB 的数据模式是一种灵活模式,关系型数据库要求你在插入数据之前必须先定义好一个表的模式结构,而 MongoDB 的集合则并不限制 document 结构。这种灵活性让对象和数据库文档之间的映射变得很容易。即使数据记录之间有很大的变化,每个文档也可以很好的映射到各条不同的记录。 当然在实际使用中,同一个集合中的文档往往都有一个比较类似的结构。
|
||||
|
||||
数据模型设计中最具挑战性的是在应用程序需求,数据库引擎性能要求和数据读写模式之间做权衡考量。当设计数据模型的时候,一定要考虑应用程序对数据的使用模式(如查询,更新和处理)以及数据本身的天然结构。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [MongoDB 数据建模入门](#mongodb-数据建模入门)
|
||||
- [(一)定义数据集](#一定义数据集)
|
||||
- [(二)思考 JSON 结构](#二思考-json-结构)
|
||||
- [(三)确定哪些字段作为嵌入式数据](#三确定哪些字段作为嵌入式数据)
|
||||
- [数据模型简介](#数据模型简介)
|
||||
- [灵活的 Schema](#灵活的-schema)
|
||||
- [Document 结构](#document-结构)
|
||||
- [原子写操作](#原子写操作)
|
||||
- [数据使用和性能](#数据使用和性能)
|
||||
- [Schema 校验](#schema-校验)
|
||||
- [指定校验规则](#指定校验规则)
|
||||
- [JSON Schema](#json-schema)
|
||||
- [其它查询表达式](#其它查询表达式)
|
||||
- [行为](#行为)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## MongoDB 数据建模入门
|
||||
|
||||
> 参考:https://docs.mongodb.com/guides/server/introduction/#what-you-ll-need
|
|
@ -1,21 +1,11 @@
|
|||
---
|
||||
title: MongoDB 建模示例
|
||||
date: 2020-09-12 09:06:57
|
||||
permalink: /pages/bfc4a1/
|
||||
---
|
||||
|
||||
# MongoDB 建模示例
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [关系型模型](#关系型模型)
|
||||
- [嵌入式文档一对一关系模型](#嵌入式文档一对一关系模型)
|
||||
- [嵌入式文档一对多关系模型](#嵌入式文档一对多关系模型)
|
||||
- [引用式文档一对多关系模型](#引用式文档一对多关系模型)
|
||||
- [树形结构模型](#树形结构模型)
|
||||
- [具有父节点的树形结构模型](#具有父节点的树形结构模型)
|
||||
- [具有子节点的树形结构模型](#具有子节点的树形结构模型)
|
||||
- [具有祖先的树形结构模型](#具有祖先的树形结构模型)
|
||||
- [具有实体化路径的树形结构模型](#具有实体化路径的树形结构模型)
|
||||
- [具有嵌套集的树形结构模型](#具有嵌套集的树形结构模型)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 关系型模型
|
||||
|
||||
### 嵌入式文档一对一关系模型
|
||||
|
@ -529,23 +519,23 @@ db.categories.insertMany([
|
|||
|
||||
```javascript
|
||||
db.categories.insertMany([
|
||||
{ _id: "Books", parent: 0, left: 1, right: 12 },
|
||||
{ _id: "Programming", parent: "Books", left: 2, right: 11 },
|
||||
{ _id: "Languages", parent: "Programming", left: 3, right: 4 },
|
||||
{ _id: "Databases", parent: "Programming", left: 5, right: 10 },
|
||||
{ _id: "MongoDB", parent: "Databases", left: 6, right: 7 },
|
||||
{ _id: "dbm", parent: "Databases", left: 8, right: 9 }
|
||||
]);
|
||||
{ _id: 'Books', parent: 0, left: 1, right: 12 },
|
||||
{ _id: 'Programming', parent: 'Books', left: 2, right: 11 },
|
||||
{ _id: 'Languages', parent: 'Programming', left: 3, right: 4 },
|
||||
{ _id: 'Databases', parent: 'Programming', left: 5, right: 10 },
|
||||
{ _id: 'MongoDB', parent: 'Databases', left: 6, right: 7 },
|
||||
{ _id: 'dbm', parent: 'Databases', left: 8, right: 9 },
|
||||
])
|
||||
```
|
||||
|
||||
可以查询以检索节点的后代:
|
||||
|
||||
```javascript
|
||||
var databaseCategory = db.categories.findOne({ _id: "Databases" });
|
||||
var databaseCategory = db.categories.findOne({ _id: 'Databases' })
|
||||
db.categories.find({
|
||||
left: { $gt: databaseCategory.left },
|
||||
right: { $lt: databaseCategory.right }
|
||||
});
|
||||
right: { $lt: databaseCategory.right },
|
||||
})
|
||||
```
|
||||
|
||||
## 设计模式
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: MongoDB 索引
|
||||
date: 2020-09-21 20:55:42
|
||||
permalink: /pages/580732/
|
||||
---
|
||||
|
||||
# MongoDB 索引
|
||||
|
||||
## MongoDB 索引简介
|
||||
|
@ -12,7 +18,7 @@
|
|||
|
||||
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200921210621.svg)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200921210621.svg)
|
||||
|
||||
### createIndex() 方法
|
||||
|
|
@ -1,21 +1,11 @@
|
|||
---
|
||||
title: MongoDB 复制
|
||||
date: 2020-09-21 09:09:43
|
||||
permalink: /pages/b2f73d/
|
||||
---
|
||||
|
||||
# MongoDB 复制
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [副本和可用性](#副本和可用性)
|
||||
- [MongoDB 副本](#mongodb-副本)
|
||||
- [异步复制](#异步复制)
|
||||
- [慢操作](#慢操作)
|
||||
- [复制延迟和流控](#复制延迟和流控)
|
||||
- [故障转移](#故障转移)
|
||||
- [读操作](#读操作)
|
||||
- [读优先](#读优先)
|
||||
- [数据可见性](#数据可见性)
|
||||
- [镜像读取](#镜像读取)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 副本和可用性
|
||||
|
||||
副本可以**提供冗余并提高数据可用性**。在不同数据库服务器上使用多个数据副本,可以提供一定程度的容错能力,以防止单个数据库服务器宕机时,数据丢失。
|
|
@ -1,19 +1,11 @@
|
|||
---
|
||||
title: MongoDB 分片
|
||||
date: 2020-09-21 09:09:43
|
||||
permalink: /pages/ba092a/
|
||||
---
|
||||
|
||||
# MongoDB 分片
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [分片集群](#分片集群)
|
||||
- [分片的分布](#分片的分布)
|
||||
- [连接分片集群](#连接分片集群)
|
||||
- [分片 Key](#分片-key)
|
||||
- [分片策略](#分片策略)
|
||||
- [Hash 分片](#hash-分片)
|
||||
- [范围分片](#范围分片)
|
||||
- [分片集群中的区域](#分片集群中的区域)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 分片集群简介
|
||||
|
||||
当 MongoDB 需要存储海量数据时,单节点不足以存储全量数据,且可能无法提供令人满意的吞吐量。所以,可以通过 MongoDB 分片机制来支持水平扩展。
|
|
@ -1,21 +1,11 @@
|
|||
---
|
||||
title: MongoDB 运维
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/7d487e/
|
||||
---
|
||||
|
||||
# MongoDB 运维
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [MongoDB 安装](#mongodb-安装)
|
||||
- [Windows](#windows)
|
||||
- [Linux](#linux)
|
||||
- [设置用户名、密码](#设置用户名密码)
|
||||
- [备份和恢复](#备份和恢复)
|
||||
- [数据备份](#数据备份)
|
||||
- [数据恢复](#数据恢复)
|
||||
- [导入导出](#导入导出)
|
||||
- [导入操作](#导入操作)
|
||||
- [导出操作](#导出操作)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## MongoDB 安装
|
||||
|
||||
### Windows
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: MongoDB 教程
|
||||
date: 2020-09-07 09:03:47
|
||||
permalink: /pages/102927/
|
||||
---
|
||||
|
||||
# MongoDB 教程
|
||||
|
||||
> MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
|
||||
|
@ -8,23 +14,25 @@
|
|||
|
||||
## 📖 内容
|
||||
|
||||
### [MongoDB 应用指南](mongodb-quickstart.md)
|
||||
### [MongoDB 应用指南](01.MongoDB应用指南.md)
|
||||
|
||||
### [MongoDB CRUD 操作](mongodb-crud.md)
|
||||
### [MongoDB 的 CRUD 操作](02.MongoDB的CRUD操作.md)
|
||||
|
||||
### [MongoDB 聚合操作](mongodb-aggregation.md)
|
||||
### [MongoDB 聚合操作](03.MongoDB的聚合操作.md)
|
||||
|
||||
### [MongoDB 建模](mongodb-model.md)
|
||||
### [MongoDB 事务](04.MongoDB事务.md)
|
||||
|
||||
### [MongoDB 建模示例](mongodb-model-example.md)
|
||||
### [MongoDB 建模](05.MongoDB建模.md)
|
||||
|
||||
### [MongoDB 索引](mongodb-index.md)
|
||||
### [MongoDB 建模示例](06.MongoDB建模示例.md)
|
||||
|
||||
### [MongoDB 复制](mongodb-replication.md)
|
||||
### [MongoDB 索引](07.MongoDB索引.md)
|
||||
|
||||
### [MongoDB 分片](mongodb-sharding.md)
|
||||
### [MongoDB 复制](08.MongoDB复制.md)
|
||||
|
||||
### [MongoDB 运维](mongodb-ops.md)
|
||||
### [MongoDB 分片](09.MongoDB分片.md)
|
||||
|
||||
### [MongoDB 运维](20.MongoDB运维.md)
|
||||
|
||||
## 📚 资料
|
||||
|
|
@ -1,20 +1,11 @@
|
|||
---
|
||||
title: Redis 面试总结
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/b30618/
|
||||
---
|
||||
|
||||
# Redis 面试总结
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [Redis 数据类型](#redis-数据类型)
|
||||
- [Redis 内存淘汰](#redis-内存淘汰)
|
||||
- [Redis 持久化](#redis-持久化)
|
||||
- [Redis 事务](#redis-事务)
|
||||
- [Redis 管道](#redis-管道)
|
||||
- [Redis 高并发](#redis-高并发)
|
||||
- [Redis 复制](#redis-复制)
|
||||
- [Redis 哨兵](#redis-哨兵)
|
||||
- [Redis vs. Memcached](#redis-vs-memcached)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## Redis 数据类型
|
||||
|
||||
【问题】
|
||||
|
@ -93,7 +84,7 @@
|
|||
|
||||
> **_Redis 持久化_**
|
||||
>
|
||||
> 详情可以参考:[Redis 持久化](redis-persistence.md)
|
||||
> 详情可以参考:[Redis 持久化](04.Redis持久化.md)
|
||||
|
||||
(1)Redis 支持两种持久化方式:RDB 和 AOF。
|
||||
|
||||
|
@ -129,7 +120,7 @@ AOF 丢数据比 RDB 少,但文件会比 RDB 文件大很多。
|
|||
|
||||
> **_Redis 的事务特性、原理_**
|
||||
>
|
||||
> 详情参考:[Redis 应用指南之 事务](redis-quickstart.md#六redis-事务)
|
||||
> 详情参考:[Redis 应用指南之 事务](02.Redis应用指南.md#六redis-事务)
|
||||
|
||||
**Redis 提供的不是严格的事务,Redis 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去**。
|
||||
|
||||
|
@ -169,7 +160,7 @@ Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。Redis
|
|||
|
||||
> **_Redis 集群_**
|
||||
>
|
||||
> 详情可以参考:[Redis 集群](redis-cluster.md)
|
||||
> 详情可以参考:[Redis 集群](07.Redis集群.md)
|
||||
|
||||
(1)单线程
|
||||
|
||||
|
@ -209,7 +200,7 @@ Redis 集群基于复制特性实现节点间的数据一致性。
|
|||
|
||||
> **_Redis 复制_**
|
||||
>
|
||||
> 详情可以参考:[Redis 复制](redis-replication.md)
|
||||
> 详情可以参考:[Redis 复制](05.Redis复制.md)
|
||||
|
||||
(1)旧版复制基于 `SYNC` 命令实现。分为同步(sync)和命令传播(command propagate)两个操作。这种方式存在缺陷:不能高效处理断线重连后的复制情况。
|
||||
|
||||
|
@ -247,7 +238,7 @@ Redis 集群基于复制特性实现节点间的数据一致性。
|
|||
|
||||
> **_Redis 哨兵_**
|
||||
>
|
||||
> 详情可以参考:[Redis 哨兵](redis-sentinel.md)
|
||||
> 详情可以参考:[Redis 哨兵](06.Redis哨兵.md)
|
||||
|
||||
(1)Redis 的高可用是通过哨兵来实现(Raft 协议的 Redis 实现)。Sentinel(哨兵)可以监听主服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器。
|
||||
|
|
@ -1,50 +1,11 @@
|
|||
---
|
||||
title: Redis 应用指南
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/2694e2/
|
||||
---
|
||||
|
||||
# Redis 应用指南
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、Redis 简介](#一redis-简介)
|
||||
- [Redis 使用场景](#redis-使用场景)
|
||||
- [Redis 的优势](#redis-的优势)
|
||||
- [Redis 与 Memcached](#redis-与-memcached)
|
||||
- [二、Redis 数据类型](#二redis-数据类型)
|
||||
- [STRING](#string)
|
||||
- [HASH](#hash)
|
||||
- [LIST](#list)
|
||||
- [SET](#set)
|
||||
- [ZSET](#zset)
|
||||
- [三、Redis 内存淘汰](#三redis-内存淘汰)
|
||||
- [内存淘汰要点](#内存淘汰要点)
|
||||
- [主键过期时间](#主键过期时间)
|
||||
- [淘汰策略](#淘汰策略)
|
||||
- [如何选择淘汰策略](#如何选择淘汰策略)
|
||||
- [内部实现](#内部实现)
|
||||
- [四、Redis 持久化](#四redis-持久化)
|
||||
- [五、Redis 事件](#五redis-事件)
|
||||
- [文件事件](#文件事件)
|
||||
- [时间事件](#时间事件)
|
||||
- [事件的调度与执行](#事件的调度与执行)
|
||||
- [六、Redis 事务](#六redis-事务)
|
||||
- [MULTI](#multi)
|
||||
- [EXEC](#exec)
|
||||
- [DISCARD](#discard)
|
||||
- [WATCH](#watch)
|
||||
- [Rollback](#rollback)
|
||||
- [七、Redis 管道](#七redis-管道)
|
||||
- [八、Redis 发布与订阅](#八redis-发布与订阅)
|
||||
- [九、Redis 复制](#九redis-复制)
|
||||
- [旧版复制](#旧版复制)
|
||||
- [新版复制](#新版复制)
|
||||
- [部分重同步](#部分重同步)
|
||||
- [PSYNC 命令](#psync-命令)
|
||||
- [心跳检测](#心跳检测)
|
||||
- [十、Redis 哨兵](#十redis-哨兵)
|
||||
- [十一、Redis 集群](#十一redis-集群)
|
||||
- [Redis Client](#redis-client)
|
||||
- [扩展阅读](#扩展阅读)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、Redis 简介
|
||||
|
||||
> Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
|
||||
|
@ -117,7 +78,7 @@ Redis 基本数据类型:STRING、HASH、LIST、SET、ZSET
|
|||
|
||||
Redis 高级数据类型:BitMap、HyperLogLog、GEO
|
||||
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 数据类型和应用](redis-datatype.md)
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 数据类型和应用](03.Redis数据类型和应用.md)
|
||||
|
||||
## 三、Redis 内存淘汰
|
||||
|
||||
|
@ -195,7 +156,7 @@ Redis 支持两种持久化方式:RDB 和 AOF。
|
|||
- RDB - **RDB 即快照方式,它将某个时间点的所有 Redis 数据保存到一个经过压缩的二进制文件(RDB 文件)中**。
|
||||
- AOF - `AOF(Append Only File)` 是以文本日志形式将所有写命令追加到 AOF 文件的末尾,以此来记录数据的变化。当服务器重启的时候会重新载入和执行这些命令来恢复原始的数据。AOF 适合作为 **热备**。
|
||||
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 持久化](redis-persistence.md)
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 持久化](04.Redis持久化.md)
|
||||
|
||||
## 五、Redis 事件
|
||||
|
||||
|
@ -424,7 +385,7 @@ pipe.exec();
|
|||
Redis 提供了 5 个发布与订阅命令:
|
||||
|
||||
| 命令 | 描述 |
|
||||
| -------------- | ------------------------------------------------------------ |
|
||||
| -------------- | ------------------------------------------------------------------- |
|
||||
| `SUBSCRIBE` | `SUBSCRIBE channel [channel ...]`—订阅指定频道。 |
|
||||
| `UNSUBSCRIBE` | `UNSUBSCRIBE [channel [channel ...]]`—取消订阅指定频道。 |
|
||||
| `PUBLISH` | `PUBLISH channel message`—发送信息到指定的频道。 |
|
||||
|
@ -487,13 +448,13 @@ Redis 2.8 版本以后的复制功能基于 `PSYNC` 命令实现。`PSYNC` 命
|
|||
|
||||
从服务器通过向主服务器发送命令 `REPLCONF ACK <replication_offset>` 来进行心跳检测,以及命令丢失检测。
|
||||
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 复制](redis-replication.md)
|
||||
> :bulb: 更详细的特性及原理说明请参考:[Redis 复制](05.Redis复制.md)
|
||||
|
||||
## 十、Redis 哨兵
|
||||
|
||||
Sentinel(哨兵)可以监听主服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器。
|
||||
|
||||
> 💡 更详细的特性及原理说明请参考:[Redis 哨兵](redis-sentinel.md)
|
||||
> 💡 更详细的特性及原理说明请参考:[Redis 哨兵](06.Redis哨兵.md)
|
||||
|
||||
## 十一、Redis 集群
|
||||
|
||||
|
@ -519,7 +480,7 @@ redis 官方推荐的 Java Redis Client:
|
|||
|
||||
## 扩展阅读
|
||||
|
||||
> 💡 Redis 常用于分布式缓存,有关缓存的特性和原理请参考:[缓存基本原理](https://dunwu.github.io/blog/design/theory/cache-theory/)
|
||||
> 💡 Redis 常用于分布式缓存,有关缓存的特性和原理请参考:[缓存基本原理](https://dunwu.github.io/design/distributed/分布式缓存.html)
|
||||
|
||||
## 参考资料
|
||||
|
|
@ -1,40 +1,15 @@
|
|||
# Redis 数据类型
|
||||
---
|
||||
title: Redis 数据类型和应用
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/ee52c4/
|
||||
---
|
||||
|
||||
# Redis 数据类型和应用
|
||||
|
||||
> Redis 提供了多种数据类型,每种数据类型有丰富的命令支持。
|
||||
>
|
||||
> 使用 Redis ,不仅要了解其数据类型的特性,还需要根据业务场景,灵活的、高效的使用其数据类型来建模。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、Redis 基本数据类型](#一redis-基本数据类型)
|
||||
- [STRING](#string)
|
||||
- [HASH](#hash)
|
||||
- [LIST](#list)
|
||||
- [SET](#set)
|
||||
- [ZSET](#zset)
|
||||
- [通用命令](#通用命令)
|
||||
- [二、Redis 高级数据类型](#二redis-高级数据类型)
|
||||
- [BitMap](#bitmap)
|
||||
- [HyperLogLog](#hyperloglog)
|
||||
- [GEO](#geo)
|
||||
- [三、Redis 数据类型应用](#三redis-数据类型应用)
|
||||
- [案例-最受欢迎文章](#案例-最受欢迎文章)
|
||||
- [案例-管理令牌](#案例-管理令牌)
|
||||
- [案例-购物车](#案例-购物车)
|
||||
- [案例-页面缓存](#案例-页面缓存)
|
||||
- [案例-数据行缓存](#案例-数据行缓存)
|
||||
- [案例-网页分析](#案例-网页分析)
|
||||
- [案例-记录日志](#案例-记录日志)
|
||||
- [案例-统计数据](#案例-统计数据)
|
||||
- [案例-查找 IP 所属地](#案例-查找-ip-所属地)
|
||||
- [案例-服务的发现与配置](#案例-服务的发现与配置)
|
||||
- [案例-自动补全](#案例-自动补全)
|
||||
- [案例-广告定向](#案例-广告定向)
|
||||
- [案例-职位搜索](#案例-职位搜索)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、Redis 基本数据类型
|
||||
|
||||
![Redis 数据类型](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200226113813.png)
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Redis 持久化
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/2d1fde/
|
||||
---
|
||||
|
||||
# Redis 持久化
|
||||
|
||||
> Redis 支持持久化,即把数据存储到硬盘中。
|
||||
|
@ -13,32 +19,6 @@
|
|||
>
|
||||
> Redis 提供了两种持久方式:RDB 和 AOF。你可以同时开启两种持久化方式。在这种情况下, 当 redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、RDB](#一rdb)
|
||||
- [RDB 简介](#rdb-简介)
|
||||
- [RDB 的创建](#rdb-的创建)
|
||||
- [RDB 的载入](#rdb-的载入)
|
||||
- [RDB 的文件结构](#rdb-的文件结构)
|
||||
- [RDB 的配置](#rdb-的配置)
|
||||
- [二、AOF](#二aof)
|
||||
- [AOF 简介](#aof-简介)
|
||||
- [AOF 的创建](#aof-的创建)
|
||||
- [AOF 的载入](#aof-的载入)
|
||||
- [AOF 的重写](#aof-的重写)
|
||||
- [AOF 的配置](#aof-的配置)
|
||||
- [三、RDB 和 AOF](#三rdb-和-aof)
|
||||
- [如何选择持久化](#如何选择持久化)
|
||||
- [RDB 切换为 AOF](#rdb-切换为-aof)
|
||||
- [AOF 和 RDB 的相互作用](#aof-和-rdb-的相互作用)
|
||||
- [四、Redis 备份](#四redis-备份)
|
||||
- [备份过程](#备份过程)
|
||||
- [容灾备份](#容灾备份)
|
||||
- [五、要点总结](#五要点总结)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、RDB
|
||||
|
||||
### RDB 简介
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Redis 复制
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/36a040/
|
||||
---
|
||||
|
||||
# Redis 复制
|
||||
|
||||
> 在 Redis 中,**可以通过执行 `SLAVEOF` 命令或设置 `slaveof` 选项,让一个服务器去复制(replicate)另一个服务器**,其中,后者叫主服务器(master),前者叫从服务器(slave)。
|
||||
|
@ -6,33 +12,6 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200712182603.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、复制简介](#一复制简介)
|
||||
- [二、旧版复制](#二旧版复制)
|
||||
- [同步](#同步)
|
||||
- [命令传播](#命令传播)
|
||||
- [旧版复制的缺陷](#旧版复制的缺陷)
|
||||
- [三、新版复制](#三新版复制)
|
||||
- [部分重同步](#部分重同步)
|
||||
- [PSYNC 命令](#psync-命令)
|
||||
- [四、心跳检测](#四心跳检测)
|
||||
- [检测主从连接状态](#检测主从连接状态)
|
||||
- [辅助实现 min-slaves 选项](#辅助实现-min-slaves-选项)
|
||||
- [检测命令丢失](#检测命令丢失)
|
||||
- [五、复制的流程](#五复制的流程)
|
||||
- [步骤 1. 设置主从服务器](#步骤-1-设置主从服务器)
|
||||
- [步骤 2. 主从服务器建立 TCP 连接。](#步骤-2-主从服务器建立-tcp-连接)
|
||||
- [步骤 3. 发送 PING 检查通信状态。](#步骤-3-发送-ping-检查通信状态)
|
||||
- [步骤 4. 身份验证。](#步骤-4-身份验证)
|
||||
- [步骤 5. 发送端口信息。](#步骤-5-发送端口信息)
|
||||
- [步骤 6. 同步。](#步骤-6-同步)
|
||||
- [步骤 7. 命令传播。](#步骤-7-命令传播)
|
||||
- [六、复制的配置项](#六复制的配置项)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、复制简介
|
||||
|
||||
Redis 通过 `slaveof host port` 命令来让一个服务器成为另一个服务器的从服务器。
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Redis 哨兵
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/06cb53/
|
||||
---
|
||||
|
||||
# Redis 哨兵
|
||||
|
||||
> Redis 哨兵(Sentinel)是 Redis 的**高可用性**(Hight Availability)解决方案。
|
||||
|
@ -6,22 +12,6 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713072747.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、哨兵简介](#一哨兵简介)
|
||||
- [二、启动哨兵](#二启动哨兵)
|
||||
- [三、监控](#三监控)
|
||||
- [检测服务器状态](#检测服务器状态)
|
||||
- [获取服务器信息](#获取服务器信息)
|
||||
- [四、通知](#四通知)
|
||||
- [向服务器发送消息](#向服务器发送消息)
|
||||
- [接收服务器的消息](#接收服务器的消息)
|
||||
- [五、选举 Leader](#五选举-leader)
|
||||
- [六、故障转移](#六故障转移)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、哨兵简介
|
||||
|
||||
Redis 哨兵(Sentinel)是 Redis 的**高可用性**(Hight Availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Redis 集群
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/6772f8/
|
||||
---
|
||||
|
||||
# Redis 集群
|
||||
|
||||
> **[Redis 集群(Redis Cluster)](https://redis.io/topics/cluster-tutorial) 是 Redis 官方提供的分布式数据库方案**。
|
||||
|
@ -10,30 +16,6 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713100613.png)
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、Redis Cluster 分区](#一redis-cluster-分区)
|
||||
- [集群节点](#集群节点)
|
||||
- [分配 Hash 槽](#分配-hash-槽)
|
||||
- [寻址](#寻址)
|
||||
- [重新分片](#重新分片)
|
||||
- [ASK 错误](#ask-错误)
|
||||
- [二、Redis Cluster 故障转移](#二redis-cluster-故障转移)
|
||||
- [复制](#复制)
|
||||
- [故障检测](#故障检测)
|
||||
- [故障转移](#故障转移)
|
||||
- [三、Redis Cluster 通信](#三redis-cluster-通信)
|
||||
- [四、Redis Cluster 应用](#四redis-cluster-应用)
|
||||
- [集群限制](#集群限制)
|
||||
- [集群配置](#集群配置)
|
||||
- [五、其他方案](#五其他方案)
|
||||
- [客户端分区方案](#客户端分区方案)
|
||||
- [代理分区方案](#代理分区方案)
|
||||
- [查询路由方案](#查询路由方案)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、Redis Cluster 分区
|
||||
|
||||
### 集群节点
|
||||
|
@ -122,7 +104,7 @@ Redis 集群的重新分片操作由 Redis 集群管理软件 **redis-trib** 负
|
|||
|
||||
### 复制
|
||||
|
||||
Redis 复制机制可以参考:[Redis 复制](redis-replication.md)
|
||||
Redis 复制机制可以参考:[Redis 复制](docs/05.KV数据库/01.Redis/05.Redis复制.md)
|
||||
|
||||
### 故障检测
|
||||
|
|
@ -1,17 +1,11 @@
|
|||
---
|
||||
title: Redis 实战
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/31fcbd/
|
||||
---
|
||||
|
||||
# Redis 实战
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、应用场景](#一应用场景)
|
||||
- [缓存](#缓存)
|
||||
- [BitMap 和 BloomFilter](#bitmap-和-bloomfilter)
|
||||
- [分布式锁](#分布式锁)
|
||||
- [二、技巧](#二技巧)
|
||||
- [keys 和 scan](#keys-和-scan)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、应用场景
|
||||
|
||||
Redis 可以应用于很多场景,这里列举几个经典的应用场景。
|
||||
|
@ -22,7 +16,7 @@ Redis 可以应用于很多场景,这里列举几个经典的应用场景。
|
|||
|
||||
Redis 有多种数据类型,以及丰富的操作命令,并且有着高性能、高可用的特性,非常适合用于分布式缓存。
|
||||
|
||||
> 缓存应用的基本原理,请参考 [**缓存基本原理**](https://github.com/dunwu/blog/blob/master/source/_posts/theory/cache.md) 第四 ~ 第六节内容。
|
||||
> 缓存应用的基本原理,请参考 [**缓存基本原理**](https://dunwu.github.io/design/distributed/分布式缓存.html) 第四 ~ 第六节内容。
|
||||
|
||||
### BitMap 和 BloomFilter
|
||||
|
||||
|
@ -30,7 +24,7 @@ Redis 除了 5 种基本数据类型外,还支持 BitMap 和 BloomFilter(即
|
|||
|
||||
BitMap 和 BloomFilter 都可以用于解决缓存穿透问题。要点在于:过滤一些不可能存在的数据。
|
||||
|
||||
> 什么是缓存穿透,可以参考:[**缓存基本原理**](https://github.com/dunwu/blog/blob/master/source/_posts/theory/cache.md)
|
||||
> 什么是缓存穿透,可以参考:[**缓存基本原理**](https://dunwu.github.io/design/distributed/分布式缓存.html)
|
||||
|
||||
小数据量可以用 BitMap,大数据量可以用布隆过滤器。
|
||||
|
|
@ -1,36 +1,15 @@
|
|||
---
|
||||
title: Redis 运维
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/89a414/
|
||||
---
|
||||
|
||||
# Redis 运维
|
||||
|
||||
> **Redis** 是一个高性能的 key-value 数据库。
|
||||
>
|
||||
> SET 操作每秒钟 110000 次;GET 操作每秒钟 81000 次。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [一、Redis 安装](#一redis-安装)
|
||||
- [Window 下安装](#window-下安装)
|
||||
- [Linux 下安装](#linux-下安装)
|
||||
- [Ubuntu 下安装](#ubuntu-下安装)
|
||||
- [开机启动](#开机启动)
|
||||
- [开放防火墙端口](#开放防火墙端口)
|
||||
- [Redis 安装脚本](#redis-安装脚本)
|
||||
- [二、Redis 单机使用和配置](#二redis-单机使用和配置)
|
||||
- [启动 Redis](#启动-redis)
|
||||
- [Redis 常见配置](#redis-常见配置)
|
||||
- [设为守护进程](#设为守护进程)
|
||||
- [压力测试](#压力测试)
|
||||
- [三、Redis 集群使用和配置](#三redis-集群使用和配置)
|
||||
- [集群规划](#集群规划)
|
||||
- [部署集群](#部署集群)
|
||||
- [部署哨兵](#部署哨兵)
|
||||
- [扩容](#扩容)
|
||||
- [四、Redis 命令](#四redis-命令)
|
||||
- [通用命令](#通用命令)
|
||||
- [集群命令](#集群命令)
|
||||
- [五、客户端](#五客户端)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 一、Redis 安装
|
||||
|
||||
### Window 下安装
|
||||
|
@ -216,7 +195,7 @@ Redis 默认访问不需要密码,如果需要设置密码,需要如下配
|
|||
| `dir ./` | 指定本地数据库存放目录 |
|
||||
| `slaveof <masterip> <masterport>` | 设置当本机为 slav 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步 |
|
||||
| `masterauth <master-password>` | 当 master 服务设置了密码保护时,slav 服务连接 master 的密码 |
|
||||
| `requirepass foobared` | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭 |
|
||||
| `requirepass foobared` | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 `AUTH <password>` 命令提供密码,默认关闭 |
|
||||
| `maxclients 128` | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息 |
|
||||
| `maxmemory <bytes>` | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区 |
|
||||
| `appendonly no` | 指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为 no |
|
|
@ -1,40 +1,46 @@
|
|||
---
|
||||
title: README
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/9fdea9/
|
||||
---
|
||||
|
||||
# Redis 教程
|
||||
|
||||
> Redis 最典型的应用场景是作为分布式缓存。
|
||||
>
|
||||
> 学习 Redis,有必要深入理解缓存的原理,以及 Redis 作为一种缓存方案,在系统应用中的定位。
|
||||
>
|
||||
> 参考:[缓存基本原理](https://github.com/dunwu/blog/blob/master/source/_posts/theory/cache.md),有助于理解缓存的特性、原理,使用缓存常见的问题及解决方案。
|
||||
> 参考:[缓存基本原理](https://dunwu.github.io/design/distributed/分布式缓存.html),有助于理解缓存的特性、原理,使用缓存常见的问题及解决方案。
|
||||
|
||||
## 📖 内容
|
||||
|
||||
### [Redis 面试总结 💯](redis-interview.md)
|
||||
### [Redis 面试总结 💯](01.Redis面试总结.md)
|
||||
|
||||
### [Redis 应用指南 ⚡](redis-quickstart.md)
|
||||
### [Redis 应用指南 ⚡](02.Redis应用指南.md)
|
||||
|
||||
> 关键词:`内存淘汰`、`事件`、`事务`、`管道`、`发布与订阅`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713105627.png)
|
||||
|
||||
### [Redis 数据类型和应用](redis-datatype.md)
|
||||
### [Redis 数据类型和应用](03.Redis数据类型和应用.md)
|
||||
|
||||
> 关键词:`STRING`、`HASH`、`LIST`、`SET`、`ZSET`、`BitMap`、`HyperLogLog`、`Geo`
|
||||
|
||||
![Redis 数据类型](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200226113813.png)
|
||||
|
||||
### [Redis 持久化](redis-persistence.md)
|
||||
### [Redis 持久化](04.Redis持久化.md)
|
||||
|
||||
> 关键词:`RDB`、`AOF`、`SAVE`、`BGSAVE`、`appendfsync`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200224214047.png)
|
||||
|
||||
### [Redis 复制](redis-replication.md)
|
||||
### [Redis 复制](05.Redis复制.md)
|
||||
|
||||
> 关键词:`SLAVEOF`、`SYNC`、`PSYNC`、`REPLCONF ACK`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200712182603.png)
|
||||
|
||||
### [Redis 哨兵](redis-sentinel.md)
|
||||
### [Redis 哨兵](06.Redis哨兵.md)
|
||||
|
||||
> Redis 哨兵(Sentinel)是 Redis 的高可用性(Hight Availability)解决方案。
|
||||
>
|
||||
|
@ -44,17 +50,17 @@
|
|||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713072747.png)
|
||||
|
||||
### [Redis 集群](redis-cluster.md)
|
||||
### [Redis 集群](07.Redis集群.md)
|
||||
|
||||
> 关键词:`CLUSTER MEET`、`Hash slot`、`MOVED`、`ASK`、`SLAVEOF no one`、`redis-trib`
|
||||
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713100613.png)
|
||||
|
||||
### [Redis 实战](redis-action.md)
|
||||
### [Redis 实战](08.Redis实战.md)
|
||||
|
||||
> 关键词:`缓存`、`分布式锁`、`布隆过滤器`
|
||||
|
||||
### [Redis 运维 🔨](redis-ops.md)
|
||||
### [Redis 运维 🔨](20.Redis运维.md)
|
||||
|
||||
> 关键词:`安装`、`命令`、`集群`、`客户端`
|
||||
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: Hbase
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/e848d6/
|
||||
---
|
||||
# HBase
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: Cassandra
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/18031b/
|
||||
---
|
||||
# Cassandra
|
||||
|
||||
> Apache Cassandra 是一个高度可扩展的分区行存储。行被组织成具有所需主键的表。
|
|
@ -1,4 +1,10 @@
|
|||
# Elasticsearch 面试
|
||||
---
|
||||
title: Elasticsearch 面试总结
|
||||
date: 2020-08-26 20:30:39
|
||||
permalink: /pages/aa9e4a/
|
||||
---
|
||||
|
||||
# Elasticsearch 面试总结
|
||||
|
||||
## 集群部署
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
---
|
||||
title: Elasticsearch 快速入门
|
||||
date: 2022-01-10 09:34:00
|
||||
permalink: /pages/868e6c/
|
||||
---
|
||||
|
||||
# Elasticsearch 快速入门
|
||||
|
||||
> **[Elasticsearch](https://github.com/elastic/elasticsearch) 是一个分布式、RESTful 风格的搜索和数据分析引擎**,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
|
||||
|
@ -100,7 +106,7 @@ Document 使用 JSON 格式表示,下面是一个例子。
|
|||
- 实际的 node 上的 `primary shard` 处理请求,然后将数据同步到 `replica node`。
|
||||
- `coordinating node` 如果发现 `primary node` 和所有 `replica node` 都搞定之后,就返回响应结果给客户端。
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20210712104055.png)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20210712104055.png)
|
||||
|
||||
### ES 读数据过程
|
||||
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: Elasticsearch简介
|
||||
date: 2022-01-10 09:34:00
|
||||
permalink: /pages/ac661a/
|
||||
---
|
||||
# Elasticsearch 简介
|
||||
|
||||
Elasticsearch 是一个基于 Lucene 的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch 是遵从 Apache 开源条款的一款开源产品,是当前主流的企业级搜索引擎。
|
||||
|
@ -125,7 +130,7 @@ Elasticsearch 是一个近乎实时的搜索平台。这意味着**从索引文
|
|||
|
||||
#### 倒排索引
|
||||
|
||||
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220108215559.PNG)
|
||||
![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220108215559.PNG)
|
||||
|
||||
#### index template
|
||||
|
|
@ -1,27 +1,10 @@
|
|||
# Elasticsearch 索引管理
|
||||
---
|
||||
title: Elasticsearch 索引
|
||||
date: 2022-01-10 09:34:00
|
||||
permalink: /pages/db5f76/
|
||||
---
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 索引管理操作](#1-索引管理操作)
|
||||
- [1.1. 索引删除](#11-索引删除)
|
||||
- [1.2. 索引别名](#12-索引别名)
|
||||
- [2. Settings 详解](#2-settings-详解)
|
||||
- [2.1. 固定属性](#21-固定属性)
|
||||
- [2.2. 索引静态配置](#22-索引静态配置)
|
||||
- [2.3. 索引动态配置](#23-索引动态配置)
|
||||
- [3. Mapping 详解](#3-mapping-详解)
|
||||
- [3.1. 映射分类](#31-映射分类)
|
||||
- [3.2. 基础类型](#32-基础类型)
|
||||
- [3.3. 复杂类型](#33-复杂类型)
|
||||
- [3.4. 特殊类型](#34-特殊类型)
|
||||
- [3.5. Mapping 属性](#35-mapping-属性)
|
||||
- [4. 索引查询](#4-索引查询)
|
||||
- [4.1. 多个 index、多个 type 查询](#41-多个index多个type查询)
|
||||
- [4.2. URI 搜索](#42-uri搜索)
|
||||
- [4.3. 查询流程](#43-查询流程)
|
||||
- [5. 参考资料](#5-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
# Elasticsearch 索引
|
||||
|
||||
## 1. 索引管理操作
|
||||
|
|
@ -1,56 +1,13 @@
|
|||
---
|
||||
title: Elasticsearch 查询
|
||||
date: 2022-01-18 19:58:06
|
||||
permalink: /pages/a88250/
|
||||
---
|
||||
|
||||
# Elasticsearch 查询
|
||||
|
||||
Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL。Elasticsearch 查询分类大致分为**全文查询**、**词项查询**、**复合查询**、**嵌套查询**、**位置查询**、**特殊查询**。Elasticsearch 查询从机制分为两种,一种是根据用户输入的查询词,通过排序模型计算文档与查询词之间的**相关度**,并根据评分高低排序返回;另一种是**过滤机制**,只根据过滤条件对文档进行过滤,不计算评分,速度相对较快。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 全文查询](#1-全文查询)
|
||||
- [1.1. intervals query](#11-intervals-query)
|
||||
- [1.2. match query](#12-match-query)
|
||||
- [1.3. match_bool_prefix query](#13-match_bool_prefix-query)
|
||||
- [1.4. match_phrase query](#14-match_phrase-query)
|
||||
- [1.5. match_phrase_prefix query](#15-match_phrase_prefix-query)
|
||||
- [1.6. multi_match query](#16-multi_match-query)
|
||||
- [1.7. combined_fields query](#17-combined_fields-query)
|
||||
- [1.8. common_terms query](#18-common_terms-query)
|
||||
- [1.9. query_string query](#19-query_string-query)
|
||||
- [1.10. simple_query_string query](#110-simple_query_string-query)
|
||||
- [1.11. 全文查询完整示例](#111-全文查询完整示例)
|
||||
- [2. 词项查询](#2-词项查询)
|
||||
- [2.1. exists query](#21-exists-query)
|
||||
- [2.2. fuzzy query](#22-fuzzy-query)
|
||||
- [2.3. ids query](#23-ids-query)
|
||||
- [2.4. prefix query](#24-prefix-query)
|
||||
- [2.5. range query](#25-range-query)
|
||||
- [2.6. regexp query](#26-regexp-query)
|
||||
- [2.7. term query](#27-term-query)
|
||||
- [2.8. terms query](#28-terms-query)
|
||||
- [2.9. type query](#29-type-query)
|
||||
- [2.10. wildcard query](#210-wildcard-query)
|
||||
- [2.11. 词项查询完整示例](#211-词项查询完整示例)
|
||||
- [3. 复合查询](#3-复合查询)
|
||||
- [3.1. bool query](#31-bool-query)
|
||||
- [3.2. boosting query](#32-boosting-query)
|
||||
- [3.3. constant_score query](#33-constant_score-query)
|
||||
- [3.4. dis_max query](#34-dis_max-query)
|
||||
- [3.5. function_score query](#35-function_score-query)
|
||||
- [3.6. indices query](#36-indices-query)
|
||||
- [4. 嵌套查询](#4-嵌套查询)
|
||||
- [4.1. nested query](#41-nested-query)
|
||||
- [4.2. has_child query](#42-has_child-query)
|
||||
- [4.3. has_parent query](#43-has_parent-query)
|
||||
- [5. 位置查询](#5-位置查询)
|
||||
- [5.1. geo_distance query](#51-geo_distance-query)
|
||||
- [5.2. geo_bounding_box query](#52-geo_bounding_box-query)
|
||||
- [5.3. geo_polygon query](#53-geo_polygon-query)
|
||||
- [5.4. geo_shape query](#54-geo_shape-query)
|
||||
- [6. 特殊查询](#6-特殊查询)
|
||||
- [6.1. more_like_this query](#61-more_like_this-query)
|
||||
- [6.2. script query](#62-script-query)
|
||||
- [6.3. percolate query](#63-percolate-query)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 全文查询
|
||||
|
||||
ES 全文查询主要用于在全文字段上,主要考虑查询词与文档的相关性(Relevance)。
|
|
@ -1,16 +1,13 @@
|
|||
---
|
||||
title: Elasticsearch 高亮搜索及显示
|
||||
date: 2022-02-22 19:33:00
|
||||
permalink: /pages/588753/
|
||||
---
|
||||
|
||||
# Elasticsearch 高亮搜索及显示
|
||||
|
||||
Elasticsearch 的高亮(highlight)可以让您从搜索结果中的一个或多个字段中获取突出显示的摘要,以便向用户显示查询匹配的位置。当您请求突出显示(即高亮)时,响应结果的 highlight 字段中包括高亮的字段和高亮的片段。Elasticsearch 默认会用 `<em></em>` 标签标记关键字。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 高亮参数](#1-高亮参数)
|
||||
- [2. 自定义高亮片段](#2-自定义高亮片段)
|
||||
- [3. 多字段高亮](#3-多字段高亮)
|
||||
- [4. 高亮性能分析](#4-高亮性能分析)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 高亮参数
|
||||
|
||||
ES 提供了如下高亮参数:
|
|
@ -1,20 +1,13 @@
|
|||
---
|
||||
title: Elasticsearch 排序
|
||||
date: 2022-01-20 09:16:15
|
||||
permalink: /pages/91b465/
|
||||
---
|
||||
|
||||
# Elasticsearch 排序
|
||||
|
||||
在 Elasticsearch 中,默认排序是**按照相关性的评分(\_score)**进行降序排序,也可以按照**字段的值排序**、**多级排序**、**多值字段排序、基于 geo(地理位置)排序以及自定义脚本排序**,除此之外,对于相关性的评分也可以用 rescore 二次、三次打分,它可以限定重新打分的窗口大小(window size),并针对作用范围内的文档修改其得分,从而达到精细化控制结果相关性的目的。
|
||||
|
||||
<!-- TOC depthFrom:2 depthTo:3 -->
|
||||
|
||||
- [1. 默认相关性排序](#1-默认相关性排序)
|
||||
- [1.1. TF-IDF 模型](#11-tf-idf-模型)
|
||||
- [1.2. BM25 模型](#12-bm25-模型)
|
||||
- [2. 字段的值排序](#2-字段的值排序)
|
||||
- [3. 多字段排序](#3-多字段排序)
|
||||
- [4. 多值字段的排序](#4-多值字段的排序)
|
||||
- [5. 地理位置上的距离排序](#5-地理位置上的距离排序)
|
||||
- [6. 参考资料](#6-参考资料)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
## 1. 默认相关性排序
|
||||
|
||||
在 Elasticsearch 中,默认情况下,文档是按照相关性得分倒序排列的,其对应的相关性得分字段用 `_score` 来表示,它是浮点数类型,`_score` 评分越高,相关性越高。评分模型的选择可以通过 `similarity` 参数在映射中指定。
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: Elasticsearch聚合
|
||||
date: 2022-01-20 09:16:15
|
||||
permalink: /pages/601224/
|
||||
---
|
||||
# Elasticsearch 聚合
|
||||
|
||||
Elasticsearch 是一个分布式的全文搜索引擎,索引和搜索是 Elasticsearch 的基本功能。事实上,Elasticsearch 的聚合(Aggregations)功能也十分强大,允许在数据上做复杂的分析统计。Elasticsearch 提供的聚合分析功能主要有**指标聚合(metrics aggregations)**、**桶聚合(bucket aggregations)**、**管道聚合(pipeline aggregations)** 和 **矩阵聚合(matrix aggregations)** 四大类,管道聚合和矩阵聚合官方说明是在试验阶段,后期会完全更改或者移除,这里不再对管道聚合和矩阵聚合进行讲解。
|
|
@ -1,3 +1,8 @@
|
|||
---
|
||||
title: Elasticsearch分析器
|
||||
date: 2022-01-20 09:36:08
|
||||
permalink: /pages/baef46/
|
||||
---
|
||||
# Elasticsearch 分析器
|
||||
|
||||
在 ES 中,不管是索引任务还是搜索工作,都需要使用 analyzer(分析器)。分析器,分为**内置分析器**和**自定义的分析器**。
|