From 106f0031cfdc2719b433eae868e9bdc772f24184 Mon Sep 17 00:00:00 2001
From: dunwu
Date: Mon, 11 Apr 2022 16:51:22 +0800
Subject: [PATCH 01/36] =?UTF-8?q?build(CI):=20=E5=BC=83=E7=94=A8=20travis-?=
=?UTF-8?q?ci=EF=BC=8C=E6=94=B9=E7=94=A8=20github=20actions=20=E8=BF=9B?=
=?UTF-8?q?=E8=A1=8C=20CI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/deploy.yml | 36 +++++++++++++++++++++++++++++
.travis.yml | 24 --------------------
docs/.markdownlint.json | 3 ++-
docs/package.json | 30 ------------------------
package.json | 37 ++++++++++++++++++++++++++++++
prettier.config.js | 7 ++++++
scripts/deploy.sh | 44 ++++++++++++++++++------------------
7 files changed, 104 insertions(+), 77 deletions(-)
create mode 100644 .github/workflows/deploy.yml
delete mode 100644 .travis.yml
delete mode 100644 docs/package.json
create mode 100644 package.json
create mode 100644 prettier.config.js
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000..36b705cb
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,36 @@
+name: CI
+
+# 在master分支发生push事件时触发。
+on:
+ push:
+ branches:
+ - master
+
+env: # 设置环境变量
+ TZ: Asia/Shanghai # 时区(设置时区可使页面中的`最近更新时间`使用时区时间)
+
+jobs:
+ build: # 自定义名称
+ runs-on: ubuntu-latest # 运行在虚拟机环境ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [14.x]
+
+ steps:
+ # 使用的动作。格式:userName/repoName。作用:检出仓库,获取源码。 官方actions库:https://github.com/actions
+ - name: Checkout
+ uses: actions/checkout@master
+
+ # 指定 nodejs 版本
+ - name: Use Nodejs ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ # 部署
+ - name: Deploy
+ env: # 设置环境变量
+ GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
+ GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
+ run: npm install && npm run deploy
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 47463f91..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-# 持续集成 CI
-# @see https://docs.travis-ci.com/user/tutorial/
-
-language: node_js
-
-sudo: required
-
-node_js: '16.13.0'
-
-branches:
- only:
- - master
-
-before_install:
- - export TZ=Asia/Shanghai
-
-script: bash ./scripts/deploy.sh
-
-notifications:
- email:
- recipients:
- - forbreak@163.com
- on_success: change
- on_failure: always
diff --git a/docs/.markdownlint.json b/docs/.markdownlint.json
index 3df31ed2..1ab9a8fa 100644
--- a/docs/.markdownlint.json
+++ b/docs/.markdownlint.json
@@ -13,5 +13,6 @@
"MD036": false,
"fenced-code-language": false,
"no-hard-tabs": false,
- "whitespace": false
+ "whitespace": false,
+ "emphasis-style": { "style": "consistent" }
}
diff --git a/docs/package.json b/docs/package.json
deleted file mode 100644
index 953d3851..00000000
--- a/docs/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "db-tutorial",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "clean": "rimraf dist && rimraf .temp",
- "build": "npm run clean && vuepress build ./ --temp .temp",
- "start": "vuepress dev ./ --temp .temp",
- "lint": "markdownlint -r markdownlint-rule-emphasis-style -c ./.markdownlint.json **/*.md -i node_modules",
- "lint:fix": "markdownlint -f -r markdownlint-rule-emphasis-style -c ./.markdownlint.json **/*.md -i node_modules",
- "show-help": "vuepress --help",
- "view-info": "vuepress view-info ./ --temp .temp"
- },
- "devDependencies": {
- "@vuepress/plugin-active-header-links": "^1.8.2",
- "@vuepress/plugin-back-to-top": "^1.8.2",
- "@vuepress/plugin-medium-zoom": "^1.8.2",
- "@vuepress/plugin-pwa": "^1.8.2",
- "@vuepress/theme-vue": "^1.8.2",
- "markdownlint-cli": "^0.30.0",
- "markdownlint-rule-emphasis-style": "^1.0.1",
- "rimraf": "^3.0.1",
- "vue-toasted": "^1.1.25",
- "vuepress": "^1.8.2",
- "vuepress-plugin-flowchart": "^1.5.0"
- },
- "dependencies": {
- "moment": "^2.29.1"
- }
-}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..d5c0d8b9
--- /dev/null
+++ b/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "java-tutorial",
+ "version": "1.0.0",
+ "scripts": {
+ "clean": "rimraf docs/.temp",
+ "start": "vuepress dev docs",
+ "build": "vuepress build docs",
+ "deploy": "bash scripts/deploy.sh",
+ "updateTheme": "yarn remove vuepress-theme-vdoing && rm -rf node_modules && yarn && yarn add vuepress-theme-vdoing -D",
+ "editFm": "node utils/editFrontmatter.js",
+ "lint": "markdownlint -r markdownlint-rule-emphasis-style -c ./.markdownlint.json **/*.md -i node_modules",
+ "lint:fix": "markdownlint -f -r markdownlint-rule-emphasis-style -c ./.markdownlint.json **/*.md -i node_modules",
+ "show-help": "vuepress --help",
+ "view-info": "vuepress view-info ./ --temp docs/.temp"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "dayjs": "^1.9.7",
+ "inquirer": "^7.1.0",
+ "json2yaml": "^1.1.0",
+ "vuepress": "1.9.2",
+ "vuepress-plugin-baidu-tongji": "^1.0.1",
+ "vuepress-plugin-demo-block": "^0.7.2",
+ "vuepress-plugin-fulltext-search": "^2.2.1",
+ "vuepress-plugin-one-click-copy": "^1.0.2",
+ "vuepress-plugin-thirdparty-search": "^1.0.2",
+ "vuepress-plugin-zooming": "^1.1.7",
+ "vuepress-plugin-flowchart": "^1.4.2",
+ "vuepress-theme-vdoing": "^1.10.3",
+ "yamljs": "^0.3.0",
+ "markdownlint-cli": "^0.25.0",
+ "markdownlint-rule-emphasis-style": "^1.0.1",
+ "rimraf": "^3.0.1",
+ "vue-toasted": "^1.1.25"
+ },
+ "dependencies": {}
+}
diff --git a/prettier.config.js b/prettier.config.js
new file mode 100644
index 00000000..eb6bb1f5
--- /dev/null
+++ b/prettier.config.js
@@ -0,0 +1,7 @@
+/**
+ * @see https://prettier.io/docs/en/options.html
+ * @see https://prettier.io/docs/en/configuration.html
+ */
+module.exports = {
+ tabWidth: 2, semi: false, singleQuote: true
+}
diff --git a/scripts/deploy.sh b/scripts/deploy.sh
index 3596f5ee..ba8e17a2 100644
--- a/scripts/deploy.sh
+++ b/scripts/deploy.sh
@@ -7,40 +7,40 @@
# ------------------------------------------------------------------------------
# 装载其它库
-ROOT_DIR=$(cd `dirname $0`/..; pwd)
+ROOT_DIR=$(
+ cd $(dirname $0)/..
+ pwd
+)
# 确保脚本抛出遇到的错误
set -e
-cd ${ROOT_DIR}/docs
-
# 生成静态文件
-npm install
npm run build
# 进入生成的文件夹
-cd dist
+cd ${ROOT_DIR}/docs/.temp
# 如果是发布到自定义域名
# echo 'www.example.com' > CNAME
-git init
-git checkout -b gh-pages && git add .
-git commit -m 'deploy'
-
-# 如果发布到 https://.github.io/
-GITHUB_REPO=github.com/dunwu/db-tutorial.git
-GITEE_REPO=gitee.com/turnon/db-tutorial.git
if [[ ${GITHUB_TOKEN} && ${GITEE_TOKEN} ]]; then
- echo "使用 token 公钥部署 gh-pages"
- # ${GITHUB_TOKEN} 是 Github 私人令牌;${GITEE_TOKEN} 是 Gitee 私人令牌
- # ${GITHUB_TOKEN} 和 ${GITEE_TOKEN} 都是环境变量;travis-ci 构建时会传入变量
- git push --force --quiet "https://dunwu:${GITHUB_TOKEN}@${GITHUB_REPO}" gh-pages
- git push --force --quiet "https://turnon:${GITEE_TOKEN}@${GITEE_REPO}" gh-pages
+ msg='自动部署'
+ GITHUB_URL=https://dunwu:${GITHUB_TOKEN}@github.com/dunwu/db-tutorial.git
+ GITEE_URL=https://turnon:${GITEE_TOKEN}@gitee.com/turnon/db-tutorial.git
+ git config --global user.name "dunwu"
+ git config --global user.email "forbreak@163.com"
else
- echo "使用 ssh 公钥部署 gh-pages"
- git push -f git@github.com:dunwu/db-tutorial.git gh-pages
- git push -f git@gitee.com:turnon/db-tutorial.git gh-pages
+ msg='手动部署'
+ GITHUB_URL=git@github.com:dunwu/db-tutorial.git
+ GITEE_URL=git@gitee.com:turnon/db-tutorial.git
fi
-
-cd ${ROOT_DIR}
+git init
+git add -A
+git commit -m "${msg}"
+# 推送到github gh-pages分支
+git push -f "${GITHUB_URL}" master:gh-pages
+git push -f "${GITEE_URL}" master:gh-pages
+
+cd -
+rm -rf ${ROOT_DIR}/docs/.temp
From 2966837ad438e35f8c24bd2eac81e308bbe00ebe Mon Sep 17 00:00:00 2001
From: dunwu
Date: Mon, 11 Apr 2022 16:52:35 +0800
Subject: [PATCH 02/36] =?UTF-8?q?docs:=20=E6=95=B4=E7=90=86=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 176 +++++++------
assets/redis/Redis.xmind | Bin 584814 -> 801506 bytes
docs/.vuepress/config.js | 237 ++++++++++++------
docs/.vuepress/config/baiduCode.js | 1 +
docs/.vuepress/config/htmlModules.js | 52 ++++
docs/.vuepress/enhanceApp.js | 54 +++-
docs/.vuepress/plugins/love-me/index.js | 12 +
docs/.vuepress/plugins/love-me/love-me.js | 62 +++++
docs/.vuepress/public/img/EB-logo.png | Bin 0 -> 1460 bytes
docs/.vuepress/public/img/bg.gif | Bin 0 -> 199753 bytes
docs/.vuepress/public/img/bg.jpeg | Bin 0 -> 1246291 bytes
docs/.vuepress/public/img/bg.jpg | Bin 0 -> 246625 bytes
docs/.vuepress/public/img/dunwu-logo.png | Bin 0 -> 15561 bytes
docs/.vuepress/public/img/favicon.ico | Bin 0 -> 16958 bytes
.../public/img/gif/\347\214\2531.gif" | Bin 0 -> 170358 bytes
.../public/img/gif/\347\214\2532.gif" | Bin 0 -> 64654 bytes
.../public/img/gif/\347\214\2533.gif" | Bin 0 -> 523143 bytes
.../public/img/gif/\347\214\2534.gif" | Bin 0 -> 107143 bytes
docs/.vuepress/public/img/more.png | Bin 0 -> 41386 bytes
docs/.vuepress/public/img/other.png | Bin 0 -> 32961 bytes
docs/.vuepress/public/img/panda-waving.png | Bin 0 -> 313616 bytes
...5\347\273\264\345\257\274\345\233\276.png" | Bin 0 -> 771 bytes
.../\346\225\260\346\215\256\345\272\223.png" | Bin 0 -> 816 bytes
...0\346\215\256\347\273\223\346\236\204.png" | Bin 0 -> 834 bytes
.../\346\234\215\345\212\241\345\231\250.png" | Bin 0 -> 1137 bytes
...2\345\231\250\345\255\246\344\271\240.png" | Bin 0 -> 1091 bytes
.../img/png/\347\256\227\346\263\225.png" | Bin 0 -> 667 bytes
.../img/png/\347\263\273\347\273\237.png" | Bin 0 -> 1065 bytes
...3\347\273\237\345\210\206\346\236\220.png" | Bin 0 -> 726 bytes
.../img/png/\347\274\226\347\250\213.png" | Bin 0 -> 655 bytes
...1\347\273\234\346\212\200\346\234\257.png" | Bin 0 -> 1027 bytes
...7\346\234\272\347\275\221\347\273\234.png" | Bin 0 -> 1169 bytes
...7\344\273\266\345\274\200\345\217\221.png" | Bin 0 -> 706 bytes
...2\345\220\221\345\257\271\350\261\241.png" | Bin 0 -> 1321 bytes
...1\347\233\256\347\256\241\347\220\206.png" | Bin 0 -> 10773 bytes
docs/.vuepress/public/img/python.png | Bin 0 -> 51525 bytes
docs/.vuepress/public/img/ui.png | Bin 0 -> 24146 bytes
docs/.vuepress/public/img/web.png | Bin 0 -> 38793 bytes
docs/.vuepress/public/markmap/01.html | 25 ++
docs/.vuepress/styles/index.styl | 93 +++++++
docs/.vuepress/styles/palette.styl | 62 +++++
...00\346\234\257\351\200\211\345\236\213.md" | 10 +-
...56\345\272\223\347\264\242\345\274\225.md" | 10 +-
.../README.md" | 36 +++
...ShardingSphere\347\256\200\344\273\213.md" | 18 +-
.../02.ShardingSphereJdbc.md" | 12 +-
.../02.Flyway.md" | 10 +-
.../README.md" | 19 ++
...56\345\272\223\351\235\242\350\257\225.md" | 9 +-
.../02.SqlCheatSheet.md" | 5 +
.../03.\346\211\251\345\261\225SQL.md" | 10 +-
.../01.\347\273\274\345\220\210/README.md" | 12 +-
...24\347\224\250\346\214\207\345\215\227.md" | 43 +---
...QL\345\267\245\344\275\234\346\265\201.md" | 25 +-
.../03.Mysql\344\272\213\345\212\241.md" | 43 +---
.../02.Mysql/04.Mysql\351\224\201.md" | 23 +-
.../05.Mysql\347\264\242\345\274\225.md" | 36 +--
...47\350\203\275\344\274\230\345\214\226.md" | 27 +-
.../20.Mysql\350\277\220\347\273\264.md" | 42 +---
.../21.Mysql\351\205\215\347\275\256.md" | 16 +-
...70\350\247\201\351\227\256\351\242\230.md" | 15 +-
.../02.Mysql/README.md" | 32 ++-
.../01.PostgreSQL.md" | 6 +
.../99.\345\205\266\344\273\226/02.H2.md" | 6 +
.../99.\345\205\266\344\273\226/03.Sqlite.md" | 6 +
.../99.\345\205\266\344\273\226/README.md" | 19 ++
.../README.md" | 66 +++++
...24\347\224\250\346\214\207\345\215\227.md" | 33 +--
...47\232\204CRUD\346\223\215\344\275\234.md" | 44 ++--
...32\345\220\210\346\223\215\344\275\234.md" | 8 +-
.../04.MongoDB\344\272\213\345\212\241.md" | 13 +-
.../05.MongoDB\345\273\272\346\250\241.md" | 26 +-
...72\346\250\241\347\244\272\344\276\213.md" | 42 ++--
.../07.MongoDB\347\264\242\345\274\225.md" | 8 +-
.../08.MongoDB\345\244\215\345\210\266.md" | 22 +-
.../09.MongoDB\345\210\206\347\211\207.md" | 20 +-
.../20.MongoDB\350\277\220\347\273\264.md" | 22 +-
.../01.MongoDB/README.md" | 26 +-
...42\350\257\225\346\200\273\347\273\223.md" | 31 +--
...24\347\224\250\346\214\207\345\215\227.md" | 73 ++----
...13\345\222\214\345\272\224\347\224\250.md" | 39 +--
...is\346\214\201\344\271\205\345\214\226.md" | 32 +--
.../05.Redis\345\244\215\345\210\266.md" | 35 +--
.../06.Redis\345\223\250\345\205\265.md" | 22 +-
.../07.Redis\351\233\206\347\276\244.md" | 32 +--
.../08.Redis\345\256\236\346\210\230.md" | 22 +-
.../20.Redis\350\277\220\347\273\264.md" | 35 +--
.../01.Redis/README.md" | 26 +-
.../01.Redis/redis-cheat-sheets.pdf" | Bin
.../01.Hbase.md" | 5 +
.../02.Cassandra.md" | 5 +
...42\350\257\225\346\200\273\347\273\223.md" | 8 +-
...53\351\200\237\345\205\245\351\227\250.md" | 8 +-
....Elasticsearch\347\256\200\344\273\213.md" | 7 +-
....Elasticsearch\347\264\242\345\274\225.md" | 31 +--
....Elasticsearch\346\237\245\350\257\242.md" | 55 +---
....Elasticsearch\351\253\230\344\272\256.md" | 15 +-
....Elasticsearch\346\216\222\345\272\217.md" | 19 +-
....Elasticsearch\350\201\232\345\220\210.md" | 5 +
...ch\345\210\206\346\236\220\345\231\250.md" | 5 +
...47\350\203\275\344\274\230\345\214\226.md" | 39 +--
.../11.ElasticsearchRestApi.md" | 37 +--
.../12.ElasticsearchHighLevelRestJavaApi.md" | 29 +--
....Elasticsearch\350\277\220\347\273\264.md" | 20 +-
...44\345\222\214\345\210\206\347\211\207.md" | 5 +
.../01.Elasticsearch/README.md" | 66 +++++
.../02.Elastic/README.md" | 49 ++++
.../02.Elastic/elastic-beats-ops.md" | 5 +
.../02.Elastic/elastic-beats.md" | 17 +-
.../02.Elastic/elastic-kibana-ops.md" | 5 +
.../02.Elastic/elastic-kibana.md" | 5 +
.../02.Elastic/elastic-logstash-ops.md" | 5 +
.../02.Elastic/elastic-logstash.md" | 5 +
.../02.Elastic/elastic-quickstart.md" | 5 +
docs/@pages/archivesPage.md | 6 +
docs/README.md | 185 ++++++++------
docs/nosql/elasticsearch/README.md | 100 --------
utils/config.yml | 14 ++
utils/editFrontmatter.js | 92 +++++++
utils/modules/fn.js | 21 ++
utils/modules/readFileList.js | 43 ++++
121 files changed, 1662 insertions(+), 1195 deletions(-)
create mode 100644 docs/.vuepress/config/baiduCode.js
create mode 100644 docs/.vuepress/config/htmlModules.js
create mode 100644 docs/.vuepress/plugins/love-me/index.js
create mode 100644 docs/.vuepress/plugins/love-me/love-me.js
create mode 100644 docs/.vuepress/public/img/EB-logo.png
create mode 100644 docs/.vuepress/public/img/bg.gif
create mode 100644 docs/.vuepress/public/img/bg.jpeg
create mode 100644 docs/.vuepress/public/img/bg.jpg
create mode 100644 docs/.vuepress/public/img/dunwu-logo.png
create mode 100644 docs/.vuepress/public/img/favicon.ico
create mode 100644 "docs/.vuepress/public/img/gif/\347\214\2531.gif"
create mode 100644 "docs/.vuepress/public/img/gif/\347\214\2532.gif"
create mode 100644 "docs/.vuepress/public/img/gif/\347\214\2533.gif"
create mode 100644 "docs/.vuepress/public/img/gif/\347\214\2534.gif"
create mode 100644 docs/.vuepress/public/img/more.png
create mode 100644 docs/.vuepress/public/img/other.png
create mode 100644 docs/.vuepress/public/img/panda-waving.png
create mode 100644 "docs/.vuepress/public/img/png/\346\200\235\347\273\264\345\257\274\345\233\276.png"
create mode 100644 "docs/.vuepress/public/img/png/\346\225\260\346\215\256\345\272\223.png"
create mode 100644 "docs/.vuepress/public/img/png/\346\225\260\346\215\256\347\273\223\346\236\204.png"
create mode 100644 "docs/.vuepress/public/img/png/\346\234\215\345\212\241\345\231\250.png"
create mode 100644 "docs/.vuepress/public/img/png/\346\234\272\345\231\250\345\255\246\344\271\240.png"
create mode 100644 "docs/.vuepress/public/img/png/\347\256\227\346\263\225.png"
create mode 100644 "docs/.vuepress/public/img/png/\347\263\273\347\273\237.png"
create mode 100644 "docs/.vuepress/public/img/png/\347\263\273\347\273\237\345\210\206\346\236\220.png"
create mode 100644 "docs/.vuepress/public/img/png/\347\274\226\347\250\213.png"
create mode 100644 "docs/.vuepress/public/img/png/\347\275\221\347\273\234\346\212\200\346\234\257.png"
create mode 100644 "docs/.vuepress/public/img/png/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.png"
create mode 100644 "docs/.vuepress/public/img/png/\350\275\257\344\273\266\345\274\200\345\217\221.png"
create mode 100644 "docs/.vuepress/public/img/png/\351\235\242\345\220\221\345\257\271\350\261\241.png"
create mode 100644 "docs/.vuepress/public/img/png/\351\241\271\347\233\256\347\256\241\347\220\206.png"
create mode 100644 docs/.vuepress/public/img/python.png
create mode 100644 docs/.vuepress/public/img/ui.png
create mode 100644 docs/.vuepress/public/img/web.png
create mode 100644 docs/.vuepress/public/markmap/01.html
create mode 100644 docs/.vuepress/styles/index.styl
create mode 100644 docs/.vuepress/styles/palette.styl
rename docs/nosql/nosql-selection.md => "docs/01.\346\225\260\346\215\256\345\272\223\347\273\274\345\220\210/01.Nosql\346\212\200\346\234\257\351\200\211\345\236\213.md" (99%)
rename "docs/composite/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" => "docs/01.\346\225\260\346\215\256\345\272\223\347\273\274\345\220\210/02.\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" (99%)
create mode 100644 "docs/01.\346\225\260\346\215\256\345\272\223\347\273\274\345\220\210/README.md"
rename docs/middleware/shardingsphere.md => "docs/02.\346\225\260\346\215\256\345\272\223\344\270\255\351\227\264\344\273\266/01.Shardingsphere/01.ShardingSphere\347\256\200\344\273\213.md" (88%)
rename docs/middleware/shardingsphere-jdbc.md => "docs/02.\346\225\260\346\215\256\345\272\223\344\270\255\351\227\264\344\273\266/01.Shardingsphere/02.ShardingSphereJdbc.md" (97%)
rename docs/middleware/flyway.md => "docs/02.\346\225\260\346\215\256\345\272\223\344\270\255\351\227\264\344\273\266/02.Flyway.md" (99%)
create mode 100644 "docs/02.\346\225\260\346\215\256\345\272\223\344\270\255\351\227\264\344\273\266/README.md"
rename docs/sql/common/sql-interview.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/01.\347\273\274\345\220\210/01.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223\351\235\242\350\257\225.md" (99%)
rename docs/sql/common/sql-cheat-sheet.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/01.\347\273\274\345\220\210/02.SqlCheatSheet.md" (99%)
rename docs/sql/common/sql-advanced.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/01.\347\273\274\345\220\210/03.\346\211\251\345\261\225SQL.md" (61%)
rename docs/sql/common/README.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/01.\347\273\274\345\220\210/README.md" (83%)
rename docs/sql/mysql/mysql-quickstart.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/01.Mysql\345\272\224\347\224\250\346\214\207\345\215\227.md" (91%)
rename docs/sql/mysql/mysql-workflow.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/02.MySQL\345\267\245\344\275\234\346\265\201.md" (96%)
rename docs/sql/mysql/mysql-transaction.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/03.Mysql\344\272\213\345\212\241.md" (94%)
rename docs/sql/mysql/mysql-lock.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/04.Mysql\351\224\201.md" (96%)
rename docs/sql/mysql/mysql-index.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/05.Mysql\347\264\242\345\274\225.md" (94%)
rename docs/sql/mysql/mysql-optimization.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/06.Mysql\346\200\247\350\203\275\344\274\230\345\214\226.md" (95%)
rename docs/sql/mysql/mysql-ops.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/20.Mysql\350\277\220\347\273\264.md" (95%)
rename docs/sql/mysql/mysql-config.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/21.Mysql\351\205\215\347\275\256.md" (99%)
rename docs/sql/mysql/mysql-faq.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/99.Mysql\345\270\270\350\247\201\351\227\256\351\242\230.md" (90%)
rename docs/sql/mysql/README.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/02.Mysql/README.md" (80%)
rename docs/sql/postgresql.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/99.\345\205\266\344\273\226/01.PostgreSQL.md" (98%)
rename docs/sql/h2.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/99.\345\205\266\344\273\226/02.H2.md" (99%)
rename docs/sql/sqlite.md => "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/99.\345\205\266\344\273\226/03.Sqlite.md" (99%)
create mode 100644 "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/99.\345\205\266\344\273\226/README.md"
create mode 100644 "docs/03.\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223/README.md"
rename docs/nosql/mongodb/mongodb-quickstart.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/01.MongoDB\345\272\224\347\224\250\346\214\207\345\215\227.md" (96%)
rename docs/nosql/mongodb/mongodb-crud.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/02.MongoDB\347\232\204CRUD\346\223\215\344\275\234.md" (82%)
rename docs/nosql/mongodb/mongodb-aggregation.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/03.MongoDB\347\232\204\350\201\232\345\220\210\346\223\215\344\275\234.md" (99%)
rename docs/nosql/mongodb/mongodb-transaction.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/04.MongoDB\344\272\213\345\212\241.md" (70%)
rename docs/nosql/mongodb/mongodb-model.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/05.MongoDB\345\273\272\346\250\241.md" (95%)
rename docs/nosql/mongodb/mongodb-model-example.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/06.MongoDB\345\273\272\346\250\241\347\244\272\344\276\213.md" (91%)
rename docs/nosql/mongodb/mongodb-index.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/07.MongoDB\347\264\242\345\274\225.md" (96%)
rename docs/nosql/mongodb/mongodb-replication.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/08.MongoDB\345\244\215\345\210\266.md" (95%)
rename docs/nosql/mongodb/mongodb-sharding.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/09.MongoDB\345\210\206\347\211\207.md" (95%)
rename docs/nosql/mongodb/mongodb-ops.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/20.MongoDB\350\277\220\347\273\264.md" (96%)
rename docs/nosql/mongodb/README.md => "docs/04.\346\226\207\346\241\243\346\225\260\346\215\256\345\272\223/01.MongoDB/README.md" (71%)
rename docs/nosql/redis/redis-interview.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/01.Redis\351\235\242\350\257\225\346\200\273\347\273\223.md" (94%)
rename docs/nosql/redis/redis-quickstart.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/02.Redis\345\272\224\347\224\250\346\214\207\345\215\227.md" (92%)
rename docs/nosql/redis/redis-datatype.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/03.Redis\346\225\260\346\215\256\347\261\273\345\236\213\345\222\214\345\272\224\347\224\250.md" (97%)
rename docs/nosql/redis/redis-persistence.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/04.Redis\346\214\201\344\271\205\345\214\226.md" (95%)
rename docs/nosql/redis/redis-replication.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/05.Redis\345\244\215\345\210\266.md" (90%)
rename docs/nosql/redis/redis-sentinel.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/06.Redis\345\223\250\345\205\265.md" (95%)
rename docs/nosql/redis/redis-cluster.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/07.Redis\351\233\206\347\276\244.md" (94%)
rename docs/nosql/redis/redis-action.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/08.Redis\345\256\236\346\210\230.md" (85%)
rename docs/nosql/redis/redis-ops.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/20.Redis\350\277\220\347\273\264.md" (97%)
rename docs/nosql/redis/README.md => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/README.md" (81%)
rename docs/nosql/redis/redis-cheat-sheets.pdf => "docs/05.KV\346\225\260\346\215\256\345\272\223/01.Redis/redis-cheat-sheets.pdf" (100%)
rename docs/nosql/hbase.md => "docs/06.\345\210\227\345\274\217\346\225\260\346\215\256\345\272\223/01.Hbase.md" (98%)
rename docs/nosql/cassandra.md => "docs/06.\345\210\227\345\274\217\346\225\260\346\215\256\345\272\223/02.Cassandra.md" (96%)
rename docs/nosql/elasticsearch/elasticsearch-interview.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/01.Elasticsearch\351\235\242\350\257\225\346\200\273\347\273\223.md" (99%)
rename "docs/nosql/elasticsearch/Elasticsearch\345\277\253\351\200\237\345\205\245\351\227\250.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/02.Elasticsearch\345\277\253\351\200\237\345\205\245\351\227\250.md" (98%)
rename "docs/nosql/elasticsearch/Elasticsearch\347\256\200\344\273\213.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/03.Elasticsearch\347\256\200\344\273\213.md" (99%)
rename "docs/nosql/elasticsearch/Elasticsearch\347\264\242\345\274\225\347\256\241\347\220\206.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/04.Elasticsearch\347\264\242\345\274\225.md" (96%)
rename "docs/nosql/elasticsearch/Elasticsearch\346\237\245\350\257\242.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/05.Elasticsearch\346\237\245\350\257\242.md" (95%)
rename "docs/nosql/elasticsearch/Elasticsearch\351\253\230\344\272\256.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/06.Elasticsearch\351\253\230\344\272\256.md" (97%)
rename "docs/nosql/elasticsearch/Elasticsearch\346\216\222\345\272\217.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/07.Elasticsearch\346\216\222\345\272\217.md" (95%)
rename "docs/nosql/elasticsearch/Elasticsearch\350\201\232\345\220\210.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/08.Elasticsearch\350\201\232\345\220\210.md" (99%)
rename "docs/nosql/elasticsearch/Elasticsearch\345\210\206\346\236\220\345\231\250.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/09.Elasticsearch\345\210\206\346\236\220\345\231\250.md" (99%)
rename "docs/nosql/elasticsearch/Elasticsearch\346\200\247\350\203\275\344\274\230\345\214\226.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/10.Elasticsearch\346\200\247\350\203\275\344\274\230\345\214\226.md" (92%)
rename docs/nosql/elasticsearch/ElasticsearchRestApi.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/11.ElasticsearchRestApi.md" (95%)
rename docs/nosql/elasticsearch/ElasticsearchHighLevelRestJavaApi.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/12.ElasticsearchHighLevelRestJavaApi.md" (92%)
rename "docs/nosql/elasticsearch/Elasticsearch\350\277\220\347\273\264.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/20.Elasticsearch\350\277\220\347\273\264.md" (93%)
rename "docs/nosql/elasticsearch/Elasticsearch\351\233\206\347\276\244\345\222\214\345\210\206\347\211\207.md" => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/Elasticsearch\351\233\206\347\276\244\345\222\214\345\210\206\347\211\207.md" (99%)
create mode 100644 "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/01.Elasticsearch/README.md"
create mode 100644 "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/README.md"
rename docs/nosql/elasticsearch/elastic/elastic-beats-ops.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-beats-ops.md" (98%)
rename docs/nosql/elasticsearch/elastic/elastic-beats.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-beats.md" (98%)
rename docs/nosql/elasticsearch/elastic/elastic-kibana-ops.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-kibana-ops.md" (99%)
rename docs/nosql/elasticsearch/elastic/elastic-kibana.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-kibana.md" (99%)
rename docs/nosql/elasticsearch/elastic/elastic-logstash-ops.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-logstash-ops.md" (99%)
rename docs/nosql/elasticsearch/elastic/elastic-logstash.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-logstash.md" (99%)
rename docs/nosql/elasticsearch/elastic/elastic-quickstart.md => "docs/07.\346\220\234\347\264\242\345\274\225\346\223\216\346\225\260\346\215\256\345\272\223/02.Elastic/elastic-quickstart.md" (99%)
create mode 100644 docs/@pages/archivesPage.md
delete mode 100644 docs/nosql/elasticsearch/README.md
create mode 100644 utils/config.yml
create mode 100644 utils/editFrontmatter.js
create mode 100644 utils/modules/fn.js
create mode 100644 utils/modules/readFileList.js
diff --git a/README.md b/README.md
index 932350ab..a240e1a5 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,23 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
DB-TUTORIAL
@@ -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,43 +49,67 @@ 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 入门教程。
+- [关系型数据库面试总结](docs/03.关系型数据库/01.综合/01.关系型数据库面试.md) 💯
+- [SQL Cheat Sheet](docs/03.关系型数据库/01.综合/02.SqlCheatSheet.md) 是一个 SQL 入门教程。
+- [扩展 SQL](docs/03.关系型数据库/01.综合/03.扩展SQL.md) 是一个 SQL 入门教程。
-### [Mysql](docs/sql/mysql)
+### Mysql

-- [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)
-## 列式数据库
+## 文档数据库
-### HBase
+### MongoDB
-> [HBase](https://dunwu.github.io/bigdata-tutorial/hbase) 📚 因为常用于大数据项目,所以将其文档和源码整理在 [bigdata-tutorial](https://dunwu.github.io/bigdata-tutorial/) 项目中。
+> MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
+>
+> MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。
+>
+> MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
-- [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)
-- [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)
+- [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 数据库
@@ -82,34 +117,26 @@ TODO...

-- [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) 🔨 - 关键词:`安装`、`命令`、`集群`、`客户端`
+- [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) 🔨 - 关键词:`安装`、`命令`、`集群`、`客户端`
-## 文档数据库
+## 列式数据库
-### MongoDB
+### HBase
-> MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
->
-> MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。
->
-> MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
+> [HBase](https://dunwu.github.io/bigdata-tutorial/hbase) 📚 因为常用于大数据项目,所以将其文档和源码整理在 [bigdata-tutorial](https://dunwu.github.io/bigdata-tutorial/) 项目中。
-- [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)
+- [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)
+- [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)
## 搜索引擎数据库
@@ -117,24 +144,19 @@ TODO...
> 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)
diff --git a/assets/redis/Redis.xmind b/assets/redis/Redis.xmind
index cd8a6823d36a15edfc274037141db3525ecdf771..47d8c008e1dea26909a6435175c4a5a51caaa9b1 100644
GIT binary patch
delta 152323
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