mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-27 05:36:42 +08:00
792 lines
54 KiB
HTML
792 lines
54 KiB
HTML
<!DOCTYPE html>
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
<link rel="icon" href="/static/favicon.png">
|
||
<title>080 程序员练级攻略(2018):数据库.md.html</title>
|
||
<!-- Spectre.css framework -->
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
<!-- theme css & js -->
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
</head>
|
||
<body>
|
||
<div class="book-container">
|
||
<div class="book-sidebar">
|
||
<div class="book-brand">
|
||
<a href="/">
|
||
<img src="/static/favicon.png">
|
||
<span>技术文章摘抄</span>
|
||
</a>
|
||
</div>
|
||
<div class="book-menu uncollapsible">
|
||
<ul class="uncollapsible">
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
<li><a href="../">上一级</a></li>
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/000 开篇词 洞悉技术的本质,享受科技的乐趣.md.html">000 开篇词 洞悉技术的本质,享受科技的乐趣</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/001 程序员如何用技术变现(上).md.html">001 程序员如何用技术变现(上)</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/002 程序员如何用技术变现(下).md.html">002 程序员如何用技术变现(下)</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/003 Equifax信息泄露始末.md.html">003 Equifax信息泄露始末</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/004 从Equifax信息泄露看数据安全.md.html">004 从Equifax信息泄露看数据安全</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/005 何为技术领导力.md.html">005 何为技术领导力</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/006 如何拥有技术领导力.md.html">006 如何拥有技术领导力</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/007 推荐阅读:每个程序员都该知道的事.md.html">007 推荐阅读:每个程序员都该知道的事</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/008 Go语言,Docker和新技术.md.html">008 Go语言,Docker和新技术</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/009 答疑解惑:渴望、热情和选择.md.html">009 答疑解惑:渴望、热情和选择</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/010 如何成为一个大家愿意追随的Leader?.md.html">010 如何成为一个大家愿意追随的Leader?</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/011 程序中的错误处理:错误返回码和异常捕捉.md.html">011 程序中的错误处理:错误返回码和异常捕捉</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/012 程序中的错误处理:异步编程和最佳实践.md.html">012 程序中的错误处理:异步编程和最佳实践</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/013 魔数 0x5f3759df.md.html">013 魔数 0x5f3759df</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/014 推荐阅读:机器学习101.md.html">014 推荐阅读:机器学习101</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/015 时间管理:同扭曲时间的事儿抗争.md.html">015 时间管理:同扭曲时间的事儿抗争</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/016 时间管理:投资赚取时间.md.html">016 时间管理:投资赚取时间</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/017 故障处理最佳实践:应对故障.md.html">017 故障处理最佳实践:应对故障</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/018 故障处理最佳实践:故障改进.md.html">018 故障处理最佳实践:故障改进</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/019 答疑解惑:我们应该能够识别的表象和本质.md.html">019 答疑解惑:我们应该能够识别的表象和本质</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/020 分布式系统架构的冰与火.md.html">020 分布式系统架构的冰与火</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/021 从亚马逊的实践,谈分布式系统的难点.md.html">021 从亚马逊的实践,谈分布式系统的难点</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/022 分布式系统的技术栈.md.html">022 分布式系统的技术栈</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/023 分布式系统关键技术:全栈监控.md.html">023 分布式系统关键技术:全栈监控</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/024 分布式系统关键技术:服务调度.md.html">024 分布式系统关键技术:服务调度</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/025 分布式系统关键技术:流量与数据调度.md.html">025 分布式系统关键技术:流量与数据调度</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/026 洞悉PaaS平台的本质.md.html">026 洞悉PaaS平台的本质</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/027 推荐阅读:分布式系统架构经典资料.md.html">027 推荐阅读:分布式系统架构经典资料</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/028 编程范式游记(1)- 起源.md.html">028 编程范式游记(1)- 起源</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/029 编程范式游记(2)- 泛型编程.md.html">029 编程范式游记(2)- 泛型编程</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/030 编程范式游记(3) - 类型系统和泛型的本质.md.html">030 编程范式游记(3) - 类型系统和泛型的本质</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/031 Git协同工作流,你该怎样选.md.html">031 Git协同工作流,你该怎样选</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/032 推荐阅读:分布式数据调度相关论文.md.html">032 推荐阅读:分布式数据调度相关论文</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/033 编程范式游记(4)- 函数式编程.md.html">033 编程范式游记(4)- 函数式编程</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/034 编程范式游记(5)- 修饰器模式.md.html">034 编程范式游记(5)- 修饰器模式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/035 编程范式游记(6)- 面向对象编程.md.html">035 编程范式游记(6)- 面向对象编程</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/036 编程范式游记(7)- 基于原型的编程范式.md.html">036 编程范式游记(7)- 基于原型的编程范式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/037 编程范式游记(8)- Go 语言的委托模式.md.html">037 编程范式游记(8)- Go 语言的委托模式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/038 编程范式游记(9)- 编程的本质.md.html">038 编程范式游记(9)- 编程的本质</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/039 编程范式游记(10)- 逻辑编程范式.md.html">039 编程范式游记(10)- 逻辑编程范式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/040 编程范式游记(11)- 程序世界里的编程范式.md.html">040 编程范式游记(11)- 程序世界里的编程范式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/041 弹力设计篇之“认识故障和弹力设计”.md.html">041 弹力设计篇之“认识故障和弹力设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/042 弹力设计篇之“隔离设计”.md.html">042 弹力设计篇之“隔离设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/043 弹力设计篇之“异步通讯设计”.md.html">043 弹力设计篇之“异步通讯设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/044 弹力设计篇之“幂等性设计”.md.html">044 弹力设计篇之“幂等性设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/045 弹力设计篇之“服务的状态”.md.html">045 弹力设计篇之“服务的状态”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/046 弹力设计篇之“补偿事务”.md.html">046 弹力设计篇之“补偿事务”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/047 弹力设计篇之“重试设计”.md.html">047 弹力设计篇之“重试设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/048 弹力设计篇之“熔断设计”.md.html">048 弹力设计篇之“熔断设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/049 弹力设计篇之“限流设计”.md.html">049 弹力设计篇之“限流设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/050 弹力设计篇之“降级设计”.md.html">050 弹力设计篇之“降级设计”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/051 弹力设计篇之“弹力设计总结”.md.html">051 弹力设计篇之“弹力设计总结”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/052 区块链技术 - 区块链的革命性及技术概要.md.html">052 区块链技术 - 区块链的革命性及技术概要</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/053 区块链技术 - 区块链技术细节 - 哈希算法.md.html">053 区块链技术 - 区块链技术细节 - 哈希算法</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/054 区块链技术 - 区块链技术细节 - 加密和挖矿.md.html">054 区块链技术 - 区块链技术细节 - 加密和挖矿</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/055 区块链技术 - 去中心化的共识机制.md.html">055 区块链技术 - 去中心化的共识机制</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/056 区块链技术 - 智能合约.md.html">056 区块链技术 - 智能合约</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/057 区块链技术 - 传统金融和虚拟货币.md.html">057 区块链技术 - 传统金融和虚拟货币</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/058 管理设计篇之分布式锁.md.html">058 管理设计篇之分布式锁</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/059 管理设计篇之配置中心.md.html">059 管理设计篇之配置中心</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/060 管理设计篇之边车模式.md.html">060 管理设计篇之边车模式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/061 管理设计篇之服务网格.md.html">061 管理设计篇之服务网格</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/062 管理设计篇之网关模式.md.html">062 管理设计篇之网关模式</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/063 管理设计篇之部署升级策略.md.html">063 管理设计篇之部署升级策略</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/064 性能设计篇之缓存.md.html">064 性能设计篇之缓存</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/065 性能设计篇之异步处理.md.html">065 性能设计篇之异步处理</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/066 性能设计篇之数据库扩展.md.html">066 性能设计篇之数据库扩展</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/067 性能设计篇之秒杀.md.html">067 性能设计篇之秒杀</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/068 性能设计篇之边缘计算.md.html">068 性能设计篇之边缘计算</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/069 程序员练级攻略(2018):开篇词.md.html">069 程序员练级攻略(2018):开篇词</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/070 程序员练级攻略(2018):零基础启蒙.md.html">070 程序员练级攻略(2018):零基础启蒙</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/071 程序员练级攻略(2018):正式入门.md.html">071 程序员练级攻略(2018):正式入门</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/072 程序员练级攻略(2018):程序员修养.md.html">072 程序员练级攻略(2018):程序员修养</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/073 程序员练级攻略(2018):编程语言.md.html">073 程序员练级攻略(2018):编程语言</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/074 程序员练级攻略:理论学科.md.html">074 程序员练级攻略:理论学科</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/075 程序员练级攻略(2018):系统知识.md.html">075 程序员练级攻略(2018):系统知识</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/076 程序员练级攻略(2018):软件设计.md.html">076 程序员练级攻略(2018):软件设计</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/077 程序员练级攻略(2018):Linux系统、内存和网络.md.html">077 程序员练级攻略(2018):Linux系统、内存和网络</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/078 程序员练级攻略(2018):异步IO模型和Lock-Free编程.md.html">078 程序员练级攻略(2018):异步IO模型和Lock-Free编程</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/079 程序员练级攻略(2018):Java底层知识.md.html">079 程序员练级攻略(2018):Java底层知识</a>
|
||
</li>
|
||
<li>
|
||
<a class="current-tab" href="/专栏/左耳听风/080 程序员练级攻略(2018):数据库.md.html">080 程序员练级攻略(2018):数据库</a>
|
||
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/081 程序员练级攻略(2018):分布式架构入门.md.html">081 程序员练级攻略(2018):分布式架构入门</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/082 程序员练级攻略(2018):分布式架构经典图书和论文.md.html">082 程序员练级攻略(2018):分布式架构经典图书和论文</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/083 程序员练级攻略(2018):分布式架构工程设计.md.html">083 程序员练级攻略(2018):分布式架构工程设计</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/084 程序员练级攻略(2018):微服务.md.html">084 程序员练级攻略(2018):微服务</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/085 程序员练级攻略(2018):容器化和自动化运维.md.html">085 程序员练级攻略(2018):容器化和自动化运维</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/086 程序员练级攻略(2018):机器学习和人工智能.md.html">086 程序员练级攻略(2018):机器学习和人工智能</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/087 程序员练级攻略(2018):前端基础和底层原理.md.html">087 程序员练级攻略(2018):前端基础和底层原理</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/088 程序员练级攻略(2018):前端性能优化和框架.md.html">088 程序员练级攻略(2018):前端性能优化和框架</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/089 程序员练级攻略(2018):UIUX设计.md.html">089 程序员练级攻略(2018):UIUX设计</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/090 程序员练级攻略(2018):技术资源集散地.md.html">090 程序员练级攻略(2018):技术资源集散地</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/091 程序员面试攻略:面试前的准备.md.html">091 程序员面试攻略:面试前的准备</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/092 程序员面试攻略:面试中的技巧.md.html">092 程序员面试攻略:面试中的技巧</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/093 程序员面试攻略:面试风格.md.html">093 程序员面试攻略:面试风格</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/094 程序员面试攻略:实力才是王中王.md.html">094 程序员面试攻略:实力才是王中王</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/095 高效学习:端正学习态度.md.html">095 高效学习:端正学习态度</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/096 高效学习:源头、原理和知识地图.md.html">096 高效学习:源头、原理和知识地图</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/097 高效学习:深度,归纳和坚持实践.md.html">097 高效学习:深度,归纳和坚持实践</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/098 高效学习:如何学习和阅读代码.md.html">098 高效学习:如何学习和阅读代码</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/099 高效学习:面对枯燥和量大的知识.md.html">099 高效学习:面对枯燥和量大的知识</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/100 高效沟通:Talk和Code同等重要.md.html">100 高效沟通:Talk和Code同等重要</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/101 高效沟通:沟通阻碍和应对方法.md.html">101 高效沟通:沟通阻碍和应对方法</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/102 高效沟通:沟通方式及技巧.md.html">102 高效沟通:沟通方式及技巧</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/103 高效沟通:沟通技术.md.html">103 高效沟通:沟通技术</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/104 高效沟通:好老板要善于提问.md.html">104 高效沟通:好老板要善于提问</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/105 高效沟通:好好说话的艺术.md.html">105 高效沟通:好好说话的艺术</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/106 加餐 谈谈我的“三观”.md.html">106 加餐 谈谈我的“三观”</a>
|
||
</li>
|
||
<li>
|
||
|
||
<a href="/专栏/左耳听风/107 结束语 业精于勤,行成于思.md.html">107 结束语 业精于勤,行成于思</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
<div class="sidebar-toggle-inner"></div>
|
||
</div>
|
||
<script>
|
||
function add_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.add('show')
|
||
}
|
||
function remove_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.remove('show')
|
||
}
|
||
function sidebar_toggle() {
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let content = document.querySelector('.off-canvas-content')
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
sidebar_toggle.classList.remove('extend')
|
||
sidebar.classList.remove('hide')
|
||
content.classList.remove('extend')
|
||
} else { // hide
|
||
sidebar_toggle.classList.add('extend')
|
||
sidebar.classList.add('hide')
|
||
content.classList.add('extend')
|
||
}
|
||
}
|
||
function open_sidebar() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.add('show')
|
||
overlay.classList.add('show')
|
||
}
|
||
function hide_canvas() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.remove('show')
|
||
overlay.classList.remove('show')
|
||
}
|
||
</script>
|
||
<div class="off-canvas-content">
|
||
<div class="columns">
|
||
<div class="column col-12 col-lg-12">
|
||
<div class="book-navbar">
|
||
<!-- For Responsive Layout -->
|
||
<header class="navbar">
|
||
<section class="navbar-section">
|
||
<a onclick="open_sidebar()">
|
||
<i class="icon icon-menu"></i>
|
||
</a>
|
||
</section>
|
||
</header>
|
||
</div>
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
overflow-x: auto;
|
||
overflow-y: hidden;">
|
||
<div class="book-post">
|
||
<p id="tip" align="center"></p>
|
||
<div><h1>080 程序员练级攻略(2018):数据库</h1>
|
||
<p>对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。关系型数据库主要有三个:Oracle、MySQL 和 Postgres。</p>
|
||
<p>在这里,我们只讨论越来越主流的 MySQL 数据库。首先,我们要了解数据库的一些实现原理和内存的一些细节,然后我们要知道数据的高可用和数据复制这些比较重要的话题,了解一下关系型数据库的一些实践和难点。然后,我们会进入到 NoSQL 数据库的学习。</p>
|
||
<p>NoSQL 数据库千奇百怪,其主要是解决了关系型数据库中的各种问题。第一个大问题就是数据的 Schema 非常多,用关系型数据库来表示不同的 Data Schema 是非常笨拙的,所以要有不同的数据库(如时序型、键值对型、搜索型、文档型、图结构型等)。另一个大问题是,关系型数据库的 ACID 是一件很讨厌的事,这极大地影响了数据库的性能和扩展性,所以 NoSQL 在这上面做了相应的妥协以解决大规模伸缩的问题。</p>
|
||
<p>对于一个程序员,你可能觉得数据库的事都是 DBA 的事,然而我想告诉你你错了,这些事才真正是程序员的事。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。所以,作为一个架构师或程序员,你必须了解最重要的数据存储——数据库。</p>
|
||
<h1>关系型数据库</h1>
|
||
<p>今天,关系型数据库最主要的两个代表是闭源的 Oracle 和开源的 MySQL。当然,还有很多了,比如微软的 SQL Server,IBM 的 DB2 等,还有开源的 PostgreSQL。关系型数据库的世界中有好多好多产品。当然,还是 Oracle 和 MySQL 是比较主流的。所以,这里主要介绍更为开放和主流的 MySQL。</p>
|
||
<p>如果你要玩 Oracle,我这里只推荐一本书《<a href="https://book.douban.com/subject/5402711/">Oracle Database 9i/10g/11g 编程艺术</a>》,无论是开发人员还是 DBA,它都是必读的书。这本书的作者是 Oracle 公司的技术副总裁托马斯·凯特(Thomas Kyte),他也是世界顶级的 Oracle 专家。</p>
|
||
<p>这本书中深入分析了 Oracle 数据库体系结构,包括文件、内存结构以及构成 Oracle 数据库和实例的底层进程,利用具体示例讨论了一些重要的数据库主题,如锁定、并发控制、事务等。同时分析了数据库中的物理结构,如表、索引和数据类型,并介绍采用哪些技术能最优地使用这些物理结构。</p>
|
||
<ul>
|
||
<li>
|
||
<p>学习 MySQL,首先一定是要看<a href="https://dev.mysql.com/doc/">MySQL 官方手册</a>。</p>
|
||
</li>
|
||
<li>
|
||
<p>然后,官方还有几个 PPT 也要学习一下。</p>
|
||
<ul>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/tune-mysql-queries-performance/">How to Analyze and Tune MySQL Queries for Better Performance</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-performance-tuning101/">MySQL Performance Tuning 101</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-performance-sys-schema/">MySQL Performance Schema & Sys Schema</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-performance-tuning-best-practices/">MySQL Performance: Demystified Tuning & Best Practices</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-security-best-practices/">MySQL Security Best Practices</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-cluster-deployment-best-practices/">MySQL Cluster Deployment Best Practices</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/presentations/mysql-high-availability-innodb-cluster/">MySQL High Availability with InnoDB Cluster</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>然后推荐《<a href="https://book.douban.com/subject/23008813/">高性能 MySQL</a>》,这本书是 MySQL 领域的经典之作,拥有广泛的影响力。不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,都能从本书中有所收获。</p>
|
||
</li>
|
||
<li>
|
||
<p>如果你对 MySQL 的内部原理有兴趣的话,可以看一下这本书《<a href="https://book.douban.com/subject/24708143/">MySQL 技术内幕:InnoDB 存储引擎</a>》。当然,还有官网的<a href="https://dev.mysql.com/doc/internals/en/">MySQL Internals Manual</a> 。</p>
|
||
</li>
|
||
<li>
|
||
<p>数据库的索引设计和优化也是非常关键的,这里还有一本书《<a href="https://book.douban.com/subject/26419771/">数据库的索引设计与优化</a>》也是很不错的。虽然不是讲 MySQL 的,但是原理都是相通的。这也是上面推荐过的《高性能 MySQL》在其索引部分推荐的一本好书。</p>
|
||
<p>你千万不要觉得只有做数据库你才需要学习这种索引技术。不是的!在系统架构上,在分布式架构中,索引技术也是非常重要的。这本书对于索引性能进行了非常清楚的估算,不像其它书中只是模糊的描述,你一定会收获很多。</p>
|
||
</li>
|
||
</ul>
|
||
<p>下面还有一些不错的和 MySQL 相关的文章。</p>
|
||
<ul>
|
||
<li><a href="http://blog.codinglabs.org/articles/theory-of-mysql-index.html">MySQL 索引背后的数据结构及算法原理</a></li>
|
||
<li><a href="https://medium.com/@kousiknath/data-structures-database-storage-internals-1f5ed3619d43">Some study on database storage internals</a></li>
|
||
<li><a href="https://medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96ca6f">Sharding Pinterest: How we scaled our MySQL fleet</a></li>
|
||
<li><a href="https://www.mysql.com/cn/why-mysql/white-papers/mysql-guide-to-high-availability-solutions/">Guide to MySQL High Availability</a></li>
|
||
<li><a href="https://dzone.com/articles/choosing-mysql-high-availability-solutions">Choosing MySQL High Availability Solutions</a></li>
|
||
<li><a href="https://mariadb.com/sites/default/files/content/Whitepaper_High_availability_with_MariaDB-TX.pdf">High availability with MariaDB TX: The definitive guide</a></li>
|
||
</ul>
|
||
<p>最后,还有一个 MySQL 的资源列表 <a href="https://shlomi-noach.github.io/awesome-mysql/">Awesome MySQL</a>,这个列表中有很多的工具和开发资源,可以帮助你做很多事。</p>
|
||
<p>MySQL 有两个比较有名的分支,一个是 Percona,另一个是 MariaDB,其官网上的 Resources 页面中有很多不错的资源和文档,可以经常看看。 <a href="https://www.percona.com/resources">Percona Resources</a>、<a href="https://mariadb.com/resources">MariaDB Resources</a> ,以及它们的开发博客中也有很多不错的文章,分别为 <a href="https://www.percona.com/blog/">Percona Blog</a> 和 <a href="https://mariadb.com/resources/blog">MariaDB Blog</a>。</p>
|
||
<p>然后是关于 MySQL 的一些相关经验型的文章。</p>
|
||
<ul>
|
||
<li><a href="https://www.percona.com/live/mysql-conference-2015/sessions/bookingcom-evolution-mysql-system-design">Booking.com: Evolution of MySQL System Design</a> ,Booking.com 的 MySQL 数据库使用的演化,其中有很多不错的经验分享,我相信也是很多公司会遇到的的问题。</li>
|
||
<li><a href="https://medium.com/airbnb-engineering/tracking-the-money-scaling-financial-reporting-at-airbnb-6d742b80f040">Tracking the Money - Scaling Financial Reporting at Airbnb</a> ,Airbnb 的数据库扩展的经验分享。</li>
|
||
<li><a href="https://eng.uber.com/mysql-migration/">Why Uber Engineering Switched from Postgres to MySQL</a> ,无意比较两个数据库谁好谁不好,推荐这篇 Uber 的长文,主要是想让你从中学习到一些经验和技术细节,这是一篇很不错的文章。</li>
|
||
</ul>
|
||
<p>关于 MySQL 的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。</p>
|
||
<ul>
|
||
<li><a href="https://engineering.imvu.com/2013/01/09/monitoring-delayed-replication-with-a-focus-on-mysql/">Monitoring Delayed Replication, With A Focus On MySQL</a></li>
|
||
<li><a href="https://githubengineering.com/mitigating-replication-lag-and-reducing-read-load-with-freno/">Mitigating replication lag and reducing read load with freno</a></li>
|
||
<li>另外,Booking.com 给了一系列的文章,你可以看看:
|
||
<ul>
|
||
<li><a href="https://medium.com/booking-com-infrastructure/better-parallel-replication-for-mysql-14e2d7857813">Better Parallel Replication for MySQL</a></li>
|
||
<li><a href="https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-2-slave-group-commit-459026a141d2">Evaluating MySQL Parallel Replication Part 2: Slave Group Commit</a></li>
|
||
<li><a href="https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-3-benchmarks-in-production-db5811058d74">Evaluating MySQL Parallel Replication Part 3: Benchmarks in Production</a></li>
|
||
<li><a href="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
|
||
</a></li>
|
||
<li><a href="https://medium.com/booking-com-infrastructure/evaluating-mysql-parallel-replication-part-4-annex-under-the-hood-eb456cf8b2fb">Evaluating MySQL Parallel Replication Part 4, Annex: Under the Hood</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>对于 MySQL 的数据分区来说,还有下面几篇文章你可以看看。</p>
|
||
<ul>
|
||
<li><a href="https://stackoverflow.com/questions/5541421/mysql-sharding-approaches">StackOverflow: MySQL sharding approaches?</a></li>
|
||
<li><a href="https://www.percona.com/blog/2009/08/06/why-you-dont-want-to-shard/">Why you don’t want to shard</a></li>
|
||
<li>[How to Scale Big Data Applications](https://www.percona.com/sites/default/files/presentations/How to Scale Big Data Applications.pdf)</li>
|
||
<li><a href="https://www.percona.com/blog/2016/08/30/mysql-sharding-with-proxysql/">MySQL Sharding with ProxySQL</a></li>
|
||
</ul>
|
||
<p>然后,再看看各个公司做 MySQL Sharding 的一些经验分享。</p>
|
||
<ul>
|
||
<li><a href="https://devs.mailchimp.com/blog/using-shards-to-accommodate-millions-of-users/">MailChimp: Using Shards to Accommodate Millions of Users
|
||
</a></li>
|
||
<li><a href="https://eng.uber.com/schemaless-rewrite/">Uber: Code Migration in Production: Rewriting the Sharding Layer of Uber’s Schemaless Datastore</a></li>
|
||
<li><a href="https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c">Sharding & IDs at Instagram</a></li>
|
||
<li><a href="https://medium.com/airbnb-engineering/how-we-partitioned-airbnb-s-main-database-in-two-weeks-55f7e006ff21">Airbnb: How We Partitioned Airbnb’s Main Database in Two Weeks</a></li>
|
||
</ul>
|
||
<h1>NoSQL 数据库</h1>
|
||
<p>关于 NoSQL 数据库,其最初目的就是解决大数据的问题。然而,也有人把其直接用来替换掉关系型数据库。所以在学习这个技术之前,我们需要对这个技术的一些概念和初衷有一定的了解。下面是一些推荐资料。</p>
|
||
<ul>
|
||
<li>Martin Fowler 在 YouTube 上分享的 NoSQL 介绍 <a href="https://youtu.be/qI_g07C_Q5I">Introduction To NoSQL</a>, 以及他参与编写的 <a href="https://book.douban.com/subject/25662138/">NoSQL Distilled - NoSQL 精粹</a>,这本书才 100 多页,是本难得的关于 NoSQL 的书,很不错,非常易读。</li>
|
||
<li><a href="https://medium.com/baqend-blog/nosql-databases-a-survey-and-decision-guidance-ea7823a822d#.nhzop4d23">NoSQL Databases: a Survey and Decision Guidance</a>,这篇文章可以带你自上而下地从 CAP 原理到开始了解 NoSQL 的种种技术,是一篇非常不错的文章。</li>
|
||
<li><a href="https://resources.sei.cmu.edu/asset_files/WhitePaper/2014_019_001_90915.pdf">Distribution, Data, Deployment: Software Architecture Convergence in Big Data Systems</a>,这是卡内基·梅隆大学的一篇讲分布式大数据系统的论文。其中主要讨论了在大数据时代下的软件工程中的一些关键点,也说到了 NoSQL 数据库。</li>
|
||
<li><a href="http://ianvarley.com/UT/MR/Varley_MastersReport_Full_2009-08-07.pdf">No Relation: The Mixed Blessings of Non-Relational Databases</a>,这篇论文虽然有点年代久远。但这篇论文是 HBase 的基础,你花上一点时间来读读,就可以了解到,对各种非关系型数据存储优缺点的一个很好的比较。</li>
|
||
<li><a href="https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/">NoSQL Data Modeling Techniques</a> ,NoSQL 建模技术。这篇文章我曾经翻译在了 CoolShell 上,标题为 <a href="https://coolshell.cn/articles/7270.htm">NoSQL 数据建模技术</a>,供你参考。
|
||
<ul>
|
||
<li><a href="https://docs.mongodb.com/manual/core/data-modeling-introduction/">MongoDB - Data Modeling Introduction</a> ,虽然这是 MongoDB 的数据建模介绍,但是其很多观点可以用于其它的 NoSQL 数据库。</li>
|
||
<li><a href="https://firebase.google.com/docs/database/android/structure-data">Firebase - Structure Your Database</a> ,Google 的 Firebase 数据库使用 JSON 建模的一些最佳实践。</li>
|
||
</ul>
|
||
</li>
|
||
<li>因为 CAP 原理,所以当你需要选择一个 NoSQL 数据库的时候,你应该看看这篇文档 <a href="http://blog.nahurst.com/visual-guide-to-nosql-systems">Visual Guide to NoSQL Systems</a>。</li>
|
||
</ul>
|
||
<p>选 SQL 还是 NoSQL,这里有两篇文章,值得你看看。</p>
|
||
<ul>
|
||
<li><a href="https://www.upwork.com/hiring/data/sql-vs-nosql-databases-whats-the-difference/">SQL vs. NoSQL Databases: What’s the Difference?</a></li>
|
||
<li><a href="https://engineering.salesforce.com/sql-or-nosql-9eaf1d92545b">Salesforce: SQL or NoSQL</a></li>
|
||
</ul>
|
||
<h1>各种 NoSQL 数据库</h1>
|
||
<p>学习使用 NoSQL 数据库其实并不是一件很难的事,只要你把官方的文档仔细地读一下,是很容易上手的,而且大多数 NoSQL 数据库都是开源的,所以,也可以通过代码自己解决问题。下面我主要给出一些典型的 NoSQL 数据库的一些经验型的文章,供你参考。</p>
|
||
<p><strong>列数据库 Column Database</strong></p>
|
||
<ul>
|
||
<li>Cassandra 相关
|
||
<ul>
|
||
<li>沃尔玛实验室有两篇文章值得一读。
|
||
<ul>
|
||
<li><a href="https://medium.com/walmartlabs/avoid-pitfalls-in-scaling-your-cassandra-cluster-lessons-and-remedies-a71ca01f8c04">Avoid Pitfalls in Scaling Cassandra Cluster at Walmart</a></li>
|
||
<li><a href="https://medium.com/walmartlabs/building-object-store-storing-images-in-cassandra-walmart-scale-a6b9c02af593">Storing Images in Cassandra at Walmart</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="https://engineeringblog.yelp.com/2016/08/how-we-scaled-our-ad-analytics-with-cassandra.html">Yelp: How We Scaled Our Ad Analytics with Apache Cassandra</a> ,Yelp 的这篇博客也有一些相关的经验和教训。</li>
|
||
<li><a href="https://blog.discordapp.com/how-discord-stores-billions-of-messages-7fa6ec7ee4c7">Discord: How Discord Stores Billions of Messages</a> ,Discord 公司分享的一个如何存储十亿级消息的技术文章。</li>
|
||
<li><a href="https://www.slideshare.net/DataStax/cassandra-at-instagram-2016">Cassandra at Instagram</a> ,Instagram 的一个 PPT,其中介绍了 Instagram 中是怎么使用 Cassandra 的。</li>
|
||
<li><a href="https://medium.com/netflix-techblog/benchmarking-cassandra-scalability-on-aws-over-a-million-writes-per-second-39f45f066c9e">Netflix: Benchmarking Cassandra Scalability on AWS - Over a million writes per second</a> ,Netflix 公司在 AWS 上给 Cassandra 做的一个 Benchmark。</li>
|
||
</ul>
|
||
</li>
|
||
<li>HBase 相关
|
||
<ul>
|
||
<li><a href="https://medium.com/imgur-engineering/imgur-notifications-from-mysql-to-hbase-9dba6fc44183">Imgur Notification: From MySQL to HBASE</a></li>
|
||
<li><a href="https://medium.com/@Pinterest_Engineering/improving-hbase-backup-efficiency-at-pinterest-86159da4b954">Pinterest: Improving HBase Backup Efficiency</a></li>
|
||
<li><a href="https://www.ibm.com/support/knowledgecenter/en/SSPT3X_2.1.2/com.ibm.swg.im.infosphere.biginsights.analyze.doc/doc/bigsql_TuneHbase.html">IBM : Tuning HBase performance</a></li>
|
||
<li><a href="http://www.larsgeorge.com/2010/05/hbase-file-locality-in-hdfs.html">HBase File Locality in HDFS</a></li>
|
||
<li><a href="http://borthakur.com/ftp/RealtimeHadoopSigmod2011.pdf">Apache Hadoop Goes Realtime at Facebook</a></li>
|
||
<li><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.294.8459&rep=rep1&type=pdf">Storage Infrastructure Behind Facebook Messages: Using HBase at Scale</a></li>
|
||
<li><a href="https://github.com/rayokota/awesome-hbase">GitHub: Awesome HBase</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>针对于 HBase 有两本书你可以考虑一下。</p>
|
||
<ul>
|
||
<li>首先,先推荐两本书,一本是偏实践的《<a href="https://book.douban.com/subject/25706541/">HBase 实战</a>》,另一本是偏大而全的手册型的《<a href="https://book.douban.com/subject/10748460/">HBase 权威指南</a>》。</li>
|
||
<li>当然,你也可以看看官方的 <a href="https://hbase.apache.org/0.94/book/book.html">The Apache HBase™ Reference Guide</a></li>
|
||
<li>另外两个列数据库:
|
||
<ul>
|
||
<li><a href="https://clickhouse.yandex/">ClickHouse - Open Source Distributed Column Database at Yandex</a></li>
|
||
<li><a href="https://engineering.giphy.com/scaling-redshift-without-scaling-costs/">Scaling Redshift without Scaling Costs at GIPHY</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p><strong>文档数据库 Document Database - MongoDB, SimpleDB, CouchDB</strong></p>
|
||
<ul>
|
||
<li><a href="https://msdn.microsoft.com/en-us/magazine/hh547103.aspx">Data Points - What the Heck Are Document Databases?</a></li>
|
||
<li><a href="https://www.mongodb.com/blog/post/ebay-building-mission-critical-multi-data-center-applications-with-mongodb">eBay: Building Mission-Critical Multi-Data Center Applications with MongoDB</a></li>
|
||
<li><a href="https://medium.baqend.com/parse-is-gone-a-few-secrets-about-their-infrastructure-91b3ab2fcf71">The AWS and MongoDB Infrastructure of Parse: Lessons Learned</a></li>
|
||
<li><a href="https://medium.com/build-addepar/migrating-mountains-of-mongo-data-63e530539952">Migrating Mountains of Mongo Data</a></li>
|
||
<li><a href="https://engineering.linkedin.com/blog/2017/12/couchbase-ecosystem-at-linkedin">Couchbase Ecosystem at LinkedIn</a></li>
|
||
<li><a href="https://medium.com/zendesk-engineering/resurrecting-amazon-simpledb-9404034ec506">SimpleDB at Zendesk</a></li>
|
||
<li><a href="https://github.com/ramnes/awesome-mongodb">Github: Awesome MongoDB</a></li>
|
||
</ul>
|
||
<p><strong>数据结构数据库 Data structure Database - Redis</strong></p>
|
||
<ul>
|
||
<li><a href="http://tech.trivago.com/2017/01/25/learn-redis-the-hard-way-in-production/">Learn Redis the hard way (in production) at Trivago</a></li>
|
||
<li><a href="http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html">Twitter: How Twitter Uses Redis To Scale - 105TB RAM, 39MM QPS, 10,000+ Instances</a></li>
|
||
<li><a href="https://slack.engineering/scaling-slacks-job-queue-687222e9d100">Slack: Scaling Slack’s Job Queue - Robustly Handling Billions of Tasks in Milliseconds Using Kafka and Redis</a></li>
|
||
<li><a href="https://githubengineering.com/moving-persistent-data-out-of-redis/">GitHub: Moving persistent data out of Redis at GitHub</a></li>
|
||
<li><a href="https://engineering.instagram.com/storing-hundreds-of-millions-of-simple-key-value-pairs-in-redis-1091ae80f74c">Instagram: Storing Hundreds of Millions of Simple Key-Value Pairs in Redis</a></li>
|
||
<li><a href="https://www.infoq.com/presentations/twitch-pokemon">Redis in Chat Architecture of Twitch (from 27:22)</a></li>
|
||
<li><a href="https://deliveroo.engineering/2016/10/07/optimising-session-key-storage.html">Deliveroo: Optimizing Session Key Storage in Redis</a></li>
|
||
<li><a href="https://deliveroo.engineering/2017/01/19/optimising-membership-queries.html">Deliveroo: Optimizing Redis Storage</a></li>
|
||
<li><a href="https://github.com/JamzyWang/awesome-redis">GitHub: Awesome Redis</a></li>
|
||
</ul>
|
||
<p><strong>时序数据库 Time-Series Database</strong></p>
|
||
<ul>
|
||
<li><a href="https://blog.timescale.com/what-the-heck-is-time-series-data-and-why-do-i-need-a-time-series-database-dcf3b1b18563">What is Time-Series Data & Why We Need a Time-Series Database</a></li>
|
||
<li><a href="https://blog.timescale.com/time-series-data-why-and-how-to-use-a-relational-database-instead-of-nosql-d0cd6975e87c">Time Series Data: Why and How to Use a Relational Database instead of NoSQL</a></li>
|
||
<li><a href="https://code.facebook.com/posts/952820474848503/beringei-a-high-performance-time-series-storage-engine/">Beringei: High-performance Time Series Storage Engine @Facebook</a></li>
|
||
<li><a href="https://medium.com/netflix-techblog/introducing-atlas-netflixs-primary-telemetry-platform-bd31f4d8ed9a">Introducing Atlas: Netflix’s Primary Telemetry Platform @Netflix</a></li>
|
||
<li><a href="https://blog.timescale.com/when-boring-is-awesome-building-a-scalable-time-series-database-on-postgresql-2900ea453ee2">Building a Scalable Time Series Database on PostgreSQL</a></li>
|
||
<li><a href="https://medium.com/netflix-techblog/scaling-time-series-data-storage-part-i-ec2b6d44ba39">Scaling Time Series Data Storage - Part I @Netflix</a></li>
|
||
<li><a href="https://medium.com/@leventov/design-of-a-cost-efficient-time-series-store-for-big-data-88c5dc41af8e">Design of a Cost Efficient Time Series Store for Big Data</a></li>
|
||
<li><a href="https://github.com/xephonhq/awesome-time-series-database">GitHub: Awesome Time-Series Database</a></li>
|
||
</ul>
|
||
<p><strong>图数据库 - Graph Platform</strong></p>
|
||
<ul>
|
||
<li>首先是 IBM Devloperworks 上的两个简介性的 PPT。
|
||
<ul>
|
||
<li><a href="https://www.ibm.com/developerworks/library/cl-graph-database-1/cl-graph-database-1-pdf.pdf">Intro to graph databases, Part 1, Graph databases and the CRUD operations</a></li>
|
||
<li><a href="https://www.ibm.com/developerworks/library/cl-graph-database-2/cl-graph-database-2-pdf.pdf">Intro to graph databases, Part 2, Building a recommendation engine with a graph database</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>然后是一本免费的电子书《<a href="http://graphdatabases.com/">Graph Database</a>》。</li>
|
||
<li>接下来是一些图数据库的介绍文章。
|
||
<ul>
|
||
<li><a href="https://www.infoq.com/presentations/graph-database-scalability">Handling Billions of Edges in a Graph Database</a></li>
|
||
<li><a href="https://neo4j.com/customers/">Neo4j case studies with Walmart, eBay, AirBnB, NASA, etc</a></li>
|
||
<li><a href="https://blog.twitter.com/engineering/en_us/a/2010/introducing-flockdb.html">FlockDB: Distributed Graph Database for Storing Adjacency Lists at Twitter</a></li>
|
||
<li><a href="https://architecht.io/google-ibm-back-new-open-source-graph-database-project-janusgraph-1d74fb78db6b">JanusGraph: Scalable Graph Database backed by Google, IBM and Hortonworks</a></li>
|
||
<li><a href="https://aws.amazon.com/neptune/">Amazon Neptune</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p><strong>搜索数据库 - ElasticSearch</strong></p>
|
||
<ul>
|
||
<li><a href="https://www.elastic.co/guide/en/elasticsearch/guide/master/index.html">Elasticsearch: The Definitive Guide</a> 这是官网方的 ElasticSearch 的学习资料,基本上来说,看这个就够了。</li>
|
||
<li>接下来是 4 篇和性能调优相关的工程实践。
|
||
<ul>
|
||
<li><a href="https://www.ebayinc.com/stories/blogs/tech/elasticsearch-performance-tuning-practice-at-ebay/">Elasticsearch Performance Tuning Practice at eBay</a></li>
|
||
<li><a href="https://kickstarter.engineering/elasticsearch-at-kickstarter-db3c487887fc">Elasticsearch at Kickstarter</a></li>
|
||
<li><a href="https://www.loggly.com/blog/nine-tips-configuring-elasticsearch-for-high-performance/">9 tips on ElasticSearch configuration for high performance</a></li>
|
||
<li><a href="https://medium.com/@abhidrona/elasticsearch-deployment-best-practices-d6c1323b25d7">Elasticsearch In Production - Deployment Best Practices</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>最后是 GitHub 上的资源列表 <a href="https://github.com/dzharii/awesome-elasticsearch">GitHub: Awesome ElasticSearch</a> 。</li>
|
||
</ul>
|
||
<h1>小结</h1>
|
||
<p>好了,总结一下今天分享的内容。虽然有人会认为数据库与程序员无关,是 DBA 的事儿。但我坚信,数据库才真正是程序员的事儿。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。</p>
|
||
<p>对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。因而,在这篇文章中,我给出了 MySQL 和各种开源 NoSQL 的一些相关的有价值的文章和导读,主要是让你对这些数据库的内在有一定的了解,但又不会太深。同时给出了一些知名企业使用数据库的工程实践,这对于了解各种数据库的优劣非常有帮助,值得认真读读。</p>
|
||
<p>从下篇文章开始,我们将进入分布式系统架构方面的内容,里面不仅涵盖了大量的理论知识,更有丰富的入门指导和大量的工程实践。敬请期待。</p>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="float: left">
|
||
<a href="/专栏/左耳听风/079 程序员练级攻略(2018):Java底层知识.md.html">上一页</a>
|
||
</div>
|
||
<div style="float: right">
|
||
<a href="/专栏/左耳听风/081 程序员练级攻略(2018):分布式架构入门.md.html">下一页</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
</div>
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"7099788bbd753cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
</body>
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag() {
|
||
dataLayer.push(arguments);
|
||
}
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-NPSEEVD756');
|
||
var path = window.location.pathname
|
||
var cookie = getCookie("lastPath");
|
||
console.log(path)
|
||
if (path.replace("/", "") === "") {
|
||
if (cookie.replace("/", "") !== "") {
|
||
console.log(cookie)
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
}
|
||
} else {
|
||
setCookie("lastPath", path)
|
||
}
|
||
function setCookie(cname, cvalue) {
|
||
var d = new Date();
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
var expires = "expires=" + d.toGMTString();
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
}
|
||
function getCookie(cname) {
|
||
var name = cname + "=";
|
||
var ca = document.cookie.split(';');
|
||
for (var i = 0; i < ca.length; i++) {
|
||
var c = ca[i].trim();
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
}
|
||
return "";
|
||
}
|
||
</script>
|
||
</html>
|