1. 程式人生 > >Python 總結(後端開發、運維、資料庫、AI方向)

Python 總結(後端開發、運維、資料庫、AI方向)

Python 基礎篇

目錄

3 專案架構

4 效能優化

8 SSH

1 知識點

1 Tornado 概述

tornado 是實時 web 服務的理想框架,處理高併發等場景(每秒可處理數以千計的連線請求),基於非阻塞方式和epoll 運用

2 Tornado實現非同步非阻塞

1 gen.coroutine(協程實現) 非同步協程

兩個裝飾器:tornado.web.asynchronous (請求變為長連線,手動self.finish()才會響應);

tornado.gen.coroutine:指定請求改為協程模式,使用yield 配合完成 Tornado 程式設計,tornado 提供多種非同步編寫形式,回撥,協程,future等

@gen.coroutine -- def sleep(self): yield gen.sleep(5) --raise gen.Return([1,2,3,4,5])*跑出異常

使用 coroutine 方式有個很明顯是缺點就是嚴重依賴第三方庫的實現

2 基於執行緒實現非同步程式設計

使用 ThreadPoolExecutor 標準庫實現,使用執行緒方式讓阻塞函式非同步化

如果大量使用執行緒,會讓非同步函式高負載,降低 tornado 程序效能

3 Tornado + Celery 實現非同步程式設計

celery 簡單,靈活,處理大量訊息的分散式系統,實時處理任務佇列,支援任務排程

輕量級的放線上程中執行,複雜的放在 Celery 中執行

3 專案架構

app{common{}--db{}--modules{}--views{}--web{}--server{}--conf{}} 存放程式需要執行的邏輯

common 通用函式方法 business 存放業務邏輯 dal 資料庫讀寫 db 資料庫操作輔助類 modules 存放tornado的handler即頁面控制器

viewhelper 於頁面的一些輔助方法,譬如,頁面上面需要裁剪字串,需要獲取通用頁尾的文章資料,需要獲取頁頭的通用分類資料等

conf目錄用於存放程式的相關配置檔案及資訊

views是存放控制器需要渲染的模板的目錄

static是靜態檔案目錄,包含了樣式,指令碼,頁面的前端邏輯等東西,同時也有一些第三方外掛

upload的職責是小型網站上傳圖片時候的存放

application是設定tornado程式的核心檔案

4 效能優化

採用執行緒池優化,此外,耗時任務,涉及IO 的常見操作:寫日誌,寫資料庫等資料持久化操作,還可以採用分散式任務佇列的方式實現:Celery + RabbitMQ + Redis

5 Flask

快速搭建一個Flask 專案

from flask import Flask

app= Flask(name)

@app.route('/')

def hello():

​ return 'Hello Python'

if name=='main':

​ app.run()

6 Shell

Windows 下執行:安裝Git cmd-->cd C:\Program Files\GIt\bin echo 111>>test.sh(生成一個shell指令碼,並用記事本開啟編輯:#!/bin/bash 約定標識,使用哪一種shell 直譯器) cmd 執行shell :sh .\test.sh

linux下執行shell 指令碼

Linux 執行shell:./test.sh

You can't use 'macro parameter character #' in math mode​ 變數引用符 ;命令列引數個數
$? 最後一個命令返回值
$* 所有引數
$n 第n個引數
$$ 當前shell 程序號PID
if then fi

練習:1 設計一個shell程式,備份並壓縮/etc目錄的所有內容,存放在/root/bak目錄裡,且檔名為如下形式yymmdd_etc

2 將當前目錄下所有的.txt檔案都改成.doc

(#!)/bin/bash

FILES=' Is ./*.txt '

for txt in $FILES

do

doc = ' echo $txt | sed "s/.txt/.doc" '

mv ​doc

don

7 Celery 原理及實現

8 SSH

SSH 建立在應用層的安全協議,用於計算機之間的加密登陸

SSH 在Linux Shell 中的用法,在 Windows系統下使用 PuTTY 軟體

SSH 之所以保證安全,原因採用公鑰加密(中間人攻擊)

過程:

9 Java Python相互呼叫

Java 呼叫 Python:

  1. 在 Java類中直接呼叫,jython(語言)

  2. 在 Java 中呼叫本機 Python 指令碼中的函式

  3. 使用 Java 直接執行 Python 指令碼

10 RESTful 架構

什麼是 RESTful ?

REST (Representational State Transfer)全稱表述性狀態轉移,即資源的轉移,包括資源的定義,獲取,表述,關聯,轉移等

RESTful 遵循統一介面原則,以 HTTP 協議來講:

GET:從伺服器獲取資源,一項或多項 select

POST:在伺服器新建一個資源 create

PUT:替換整個資源 update

PATCH:區域性資源更新 update

DELETE:從伺服器刪除資源 delete

  • URL 組成

    正確的格式:協議 ip port/路徑 ? search#hash

    即:protocol://domain:port/pathname ? search # hash

19 Docker

Linux 環境下執行:
sudo docker run -it ubuntu /bin/bash     啟動命令
ls  ps  ifconfig                         檢視目錄及服務程序/配置

1)容器技術

  • 一種虛擬化方案、作業系統級別的虛擬化

  • 只能執行在相同或相似的核心作業系統

  • 依賴於Linux核心特性:namespace和Cgroups

2)Linux 容器技術 VS 虛擬機器

  • 資源佔用更少,服務更多使用者

    容器技術缺點:不易安裝部署,不便於維護

3) Docker 簡介

  • Docker 將應用程式自動化部署到容器 的開源引擎

  • 基於Apache 2.0 開源協議發行

4)Docker 特點目標

  • 提供簡單、輕量的建模方式

    ​ 去除了管理程式的開銷,執行速度非常快,執行更多的容器,充分的利用系統資源

  • 職責的邏輯分離

    ​ 開發人員做的是應用程式的執行邏輯,開發環境和部署環境的一致性,運維人員如何管理容器

  • 快速高效的開發生命週期

    ​ 開發,測試,部署的生命週期,使應用程式具有可移植性,在容器中開發,以容器的形式互動、分發,避免了額外的除錯和部署開銷,縮短產品上線週期

  • 鼓勵使用面向服務架構

    單個容器只執行一個應用或程序,分散式應用程式模型,實現內部應用程式互聯,使分散式應用程式擴充套件,除錯簡單化,開發中常用的思想:高內聚,低耦合 執行中出現問題,比較容易定位問題的所在

5) Docker 使用場景

  • 使用Docker容器開發、測試、部署服務

    ​ Docker輕量化

  • 建立隔離的執行環境

    ​ 建立不同是生產環境,執行不同的服務,企業中不同版本服務不同客戶

  • 搭建測試環境

    ​ 不同系統上的相容性,甚至可以搭建叢集部署的測試

  • 構建多使用者的平臺服務即 服務PaaS 基礎設施

  • 提供軟體服務SaaS應用程式

  • 高效能、超大規模的宿主機部署

    ​ 使用Docker和OpenStack相結合,提供PaaS和SaaS服務,使Docker在雲端計算領域有非常廣闊的應用前景

6)Docker 的基本組成

  • Docker Client 客戶端

  • Docker Daemon 守護程序

  • Docker Image 映象

  • Docker Container 容器

  • Docker Registry 倉庫

Docker C/S 架構 服務:可在本地/也可遠端

守護程序是容器基石,層疊只讀檔案系統,聯合載入

通過映象啟動,寫時複製,可寫層

共有,私有,Docker hub

7) 各元件之間的關係

docker virsion  檢視docker版本
docker serach   查詢某一映象
docker pull learn/tual  下載該映象
docker run learn/tual  echo 'Hello world'  啟動
docker run learn/tual  apt-get install -y ping
docker ps -l
docker commit  11111 learn/ping  容器編號和給容器起名字
docker run learn/ping  ping www.google.com  ping一個網址測試
docker inspect
docker images
docker ps-l
docker push

8) Docker 容器相關技術

Docker 依賴 Linux 核心特性

  • Namespaces 名稱空間

    程式語言:封裝 --- 程式碼隔離

    作業系統:系統資源的隔離,五種名稱空間隔離:PID NET IPC MNT UTS程序、網路、檔案系統 管理掛載點 隔離核心和版本標識

  • Control groups (Cgroups) 控制組

    容器技術核心:資源限制、優先順序設定、資源計量、資源控制(程序組掛起和執行)

Docker 容器能力

  • 檔案系統隔離:每個系統都有自己的root檔案系統

  • 程序隔離:每個容器都執行在自己的程序環境中

  • 網路隔離:容器間的虛擬網路介面和IP地址都是分開的

  • 資源隔離和分組:使用Cgroups將CPU和記憶體之間的資源獨立分配給每個Docker容器

9)Docker 安裝與配置

Ubuntu win Linux

Ubuntu
安裝前檢查
uname -a     檢查核心版本
ls -l /sys/class/devive-mapper  檢查device mapper儲存驅動
安裝
sudo apt-get install docker.ce
source /etc/bash_completion.d/docker.ce
-------------------------------------------------------
推薦安裝Docker維護版本   使用shell封裝好的指令碼命令
sudo apt-get install -y curl    安裝curl命令
curl -sSL http://get.docker.com/ubuntu/|sudo sh
使用非root使用者
sudo groupadd docker               新增docker使用者組
sudo gpasswd -a ${USER} docker     新增使用者到使用者組
sudo server docker restart         重啟docker服務
登出重新登陸docker
docker run ubuntu echo 'Hello world'
windows 安裝
使用虛擬化完成在win下安裝:Boot2Docker for windows
win10  直接docker官網下載 docker for win10
win通過hyper vt 可直接執行,不需要虛擬機器
github 下載安裝
OS X安裝
開發測試環境下使用,部署不用換

10) 容器基本操作

docker run -i -t ubuntu /bin/bash   啟動互動式容器
i  標準輸入  t 替換終端
ps -ef|grep python 檢視Python程序是否存在
docker ps -a       檢視所有容器
docker inspect     檢視容器詳情
docker run --name=xxx -i -t ubuntu /bin/bash
>>  和新建容器互動
>> exit
docker start -i doc1
docker rm doc1
docker ps -a -l
-------------------------------------------------
守護式容器
長期執行,沒有互動式會話
docker run -i -t ubuntu /bin/bash
>># 首先啟動互動式容器
>>  crtl + P  crtl + Q  組合鍵退出 使容器後臺執行
docker ps  檢視正在執行的容器
docker attach 容器名    重新進入後臺執行的容器中
>>  crtl + P  crtl + Q  組合鍵退出
docker ps
docker attach 容器名
>> exit
docker ps     這樣後臺執行容器停止
--------------------------------------------
啟動守護式容器
docker run --name=doc1 -d ubuntu /bin/bash/sh -c'while true;do echo hello world; sleep 1;done'  
-d 以後臺的形式執行docker命令,返回docker守護程序分配的id地址
---------------------------------------------
檢視容器日誌
docker logs -f -t --tail 容器名 -f一直跟蹤  -t時間戳
docker logs -tf --tail 0 doc1           0代表顯示最新的日誌,不指定返回所有
---------------------------------------------
檢視容器程序
docker top 容器名
---------------------------------------------
在執行的容器中啟動新程序
對容器中的任務進行,維護,監控和管理等
docker exec -it doc1 /bin/bash
>> crtl +P crtl +Q 退出
docker top doc1         此時bash程序已經執行在doc1中
---------------------------------------------
停止守護式容器
docker stop/skill 容器名 
stop                    傳送一個命名等待停止,skill 直接停止

11) 在容器中部署靜態網站

設定容器的埠對映

Nginx 部署流程

  • 建立對映80埠的互動式容器

  • 安裝nginx

  • 安裝文字編輯器vim

  • 建立靜態頁面

  • 修改nginx配置檔案

  • 執行nginx

  • 驗證網站訪問

docker run -p 80 --name web -it ubuntu /bin/bash
>># apt-get install -y nginx
>> 如果報錯 跟新資源 apt-get update
>># apt-get install -y vim
>># mkdir -p /var/www/html   建立存放靜態檔案目錄
>># cd /var/www/html
>># vim index.html           建立編輯頁面
>># whereis nginx
>>  ls /etc/nginx/sites-enabled
>>  vim /etc/nginx/sites-enabled/default  將root值改為/var/www/html;  :wq  編輯HTML網站
>>  cd /                切換到根目錄
>>nginx                 執行nginx
>>ps -ef                檢視當前的程序
>> crtl+p crtl+Q退出
docker ps               容器對映的埠情況
docker port web         容器埠執行情況
docker top web          容器中程序執行狀況
curl http://127.0.0.1:80  檢視網站是否可訪問或者在瀏覽器訪問
docker inspect web      檢視容器IP地址,預設80埠
docker stop web
docker start -t web
ps -ef                  重新啟動後,容器沒有啟動nginx
crtl+p crtl+Q退出
docker exec web nginx
docker top web          使用exec命令啟動nginx
curl http://127.0.0.1:80  
docker inspect web       重啟後原IP和PORT都會改變

12) 檢視刪除映象

  • 列出映象 docker images

  • 映象標籤和倉庫 Repository&Tag

  • 檢視映象 docker inspect

  • 刪除映象 docker rmi

docker info             檢視docker儲存驅動和位置
sudo ls -l /var/lib/docker/aufs   檢視相關檔案
---------------------------------------------
列出映象 
docker images  檢視映象檔案,已安裝的
映象倉庫  Repository  一系列映象的集合
docker images --no-trunc  檢視完整映象
docker -a                 中間層映象,沒有映象名
docker -q                 只顯示映象id
docker images ubuntu      檢視Ubuntu映象
---------------------------------------------
檢視映象詳細資訊
docker inspect ubuntu     inspect可檢視映象和容器詳情
docker rmi   ubuntu16.4    只刪除一個映象標籤
docker rmi $(docker images -q ubuntu) 刪除ubuntu所有映象檔案

13 ) 獲取和推送映象

  • 查詢映象 docker search

  • 拉取映象 docker pull

  • 推送映象 docker push

查詢映象
docker Hub 和命令列
docker search -s 3 ubuntu  3星以上的倉庫
拉取映象
docker pull Ubuntu
使用--registry-mirror 選項映象下載
https://www.daoclould.io 獲取docker映象連線,選擇加速器
使用加速連線,配置倉庫映象地址
sudo vim /etc/default/docker
# 末尾新增映象檔案地址(剛才獲取的映象檔案地址--加速連線地址)
重啟docker服務
sudo service docker restart
ps -ef |grep docker        檢視docker相關程序
docker pull ubuntu:11.11
推送映象
docker images
docker push xxxxx/bginx   只會提交修改部分
在docker Hub上,可以檢視推送的映象,可設定私有

14) 構建映象

  • 儲存對映象的修改,並再次使用

  • 自定義映象能力

  • 以軟體的形式打包並分發服務到其執行環境

docker commit     通過容器構建  -a author  -m message  -p pause
docker build      通Dockerfilr檔案構建
docker run -it -p 80 --name nnn ubuntu /bin/bash
>> apt-get update
>> apt-get nginx
exit
docker ps -l
docker commit -a 'dockerHub名子' -m 'nginx' nnn dockerHub名子/nnn1
docker images  檢視新建立的映象nnn1
docker run -d --name nginx_web dockerHub名子/nnn1 nginx -g 'daemon off'    使用新映象執行一個容器,以前臺的方式執行,結束後容器停止
docker ps
curl http://127.0.0.1  訪問失敗,沒有指定埠
docker run -d --name nginx_web2 -p 80 dockerHub名子/nnn1 nginx -g 'daemon off'    再執行一個映象並指定埠80
docker ps
curl http://127.0.0.1:4443 使用對映後的埠訪問nginx服務
建立一個dockerfile
mkdir -p dockerfile/df_tset1  建立存放檔案目錄
cd dockerfile/df_tset1
vim Dockerfile
# FROM ununtu16.04
  MAINTAINER dockerHub名 "dockerHub名@outlook.com"
  RUN apt-get update
  RUN apt-get install -y nginx
  EXPOSE 80
 docker build -t='xxx/df_tset1' .  構建映象,取名,在當前目錄
 docker images
 docker run -d --name nginx_web2 -p 80 dockerHub名子/df_test1 nginx -g 'daemon off'   後面改名/df_test1
 docker ps
 curl http://127.0.0.1:4443  再次驗證訪問

15) Docker 客戶端和守護程序

docker C/S 執行模式
通過remoteAPI RESTful 風格 API互動通訊
編寫程式呼叫該介面與docker整合,支援STDIN/OUT/ERR 方式通訊互動
連線方式 socket
unix   tcp:host,port  fd:socketfd
守護程序會在啟動後一直執行
ps -ef |grep docker
使用docker命令操作,實際上是使用docker客戶端與守護程序互動通訊
docker version
nc -U /var/run/docker.sock     net connect unix實現socket連線
GET /info HTTP/1.1             使用HTTP協議,傳送檢視remoteAPI介面情況

16)Docker 守護程序的配置和相關操作

  • 檢視守護程序

    ps -ef |grep docker

    sudo status docker

  • 使用service命令管理

    sudo service docker start

    sudo service docker stop

    sudo service docker restart

docker啟動選項配置

重要的配置檔案,啟動配置檔案 :/etc/default/docker

sudo vim /etc/default/docker
DOCKER_OPTS= ' label name=docker_server_1'  可以在docker info命令中檢視該值
sudo service docker restart     使配置檔案命令生效
ps -ef | grep docker            該命令執行守護程序上了
docker info                     檢視做出的修改

17) Docker 遠端訪問

  • 第二臺安裝Docker的伺服器

  • 修改Docker守護程序啟動選項,新增label選項,區別伺服器

  • 保證Client API與 Server API 版本一致

第二臺伺服器,搭建環境,版本一致
sudo vim /etc/default/docker
DOCKER_OPTS= ' label name=docker_server_2'
sudo service docker restart 
docker info  
-----------------------------------------------
修改伺服器端配置
修改Docker守護程序啟動選項
守護程序預設配置 -H uinx:///var/run/docker.sock
DOCKER_OPTS= ' label name=docker_server_1 -H tcp//0.0.0.0:2375'
sudo service docker restart 
ps -ef |grep docker    檢視是執行,否修改成功
在另一臺docker伺服器上訪問當前服務,先找到該服務本機IP地址
ifconfig
第二臺docker伺服器
curl http://IP地址:2375/info    訪問的API是info
--------------------------------------------------
docker 客戶端進行遠端訪問,修改客戶端配置
docker -H tcp://IP地址:2375 info   返回dicker server1的相關資訊
export DOCKER_HOST='tcp://IP地址:2375'   頻繁訪問修該環境變數,訪問遠端docker服務,不用—H選項
docker info            返回dicker server1的相關資訊
export DOCKER_HOST=''  使用完要連線本機,只需遠端置空,恢復預設的連線方式
docker info            返回當前本地即dicker server2的相關資訊
-------------------------------------------------
在設定遠端訪問的服務上,也支援本機連線?
docker server1 中再次修改配置檔案
sudo vim /etc/default/docker
DOCKER_OPTS= ' label name=docker_server_1   -H unix:///var/run/docker.sock'              -H  可指定多個引數值
sudo service docker restart 
docker info             本機預設方式連線,返回dicker server1的相關資訊
總結:
—H  選項,配置docker守護程序的啟動選項,實現守護程序的遠端訪問
DOCKER_HOST環境變數  客戶端簡化docker的遠端訪問

18) Dockerfile 指令

  • FROM

    <images> 已存在的映象,基礎映象,必須是第一條非註釋指令

    <images>:<tag>

  • MAINRAINER (保持器)

    <name>指定映象的作者資訊,包含映象所有者和聯絡資訊

  • RUN

    <command> shell模式

    [ " executable", "param1","param2"] exec 模式

  • EXPOSE (暴露)

    指定執行該映象的容器,使用埠

# First Dockerfile
FROM ubuntu:16.04
MAINTAINER nnn  'dockerHub名@outlook.com'
RUN apt-get update
RUn apt-get install -y nginx
或合併指令 RUN apt-get update & apt-get install -y nginx
EXPOSE 80
  • CMD 被RUN命令覆蓋

  • ENTRYPOINT 不會覆蓋

# First Dockerfile
FROM ubuntu:16.04
MAINTAINER nnn  'dockerHub名@outlook.com'
RUN apt-get update
RUn apt-get install -y nginx
或合併指令 RUN apt-get update & apt-get install -y nginx
EXPOSE 80
CMD ['usr/bin/nginx','g','daemon off']
儲存退出
構建映象並指定映象名
docker build -t='dormanctpress/df_tset3'.
執行該映象,指定埠對映,名字,以守護形式執行,指定容器映象
docker run -p 88 --name cmd_test1 -d dormanctpress/df_tset3
檢視
docker ps
檢視容器中執行的程序
docker top cmd_test1
再執行一個容器,使用bash命令
docker run -p 88 --name cmd_test2 -d dormanctpress/df_tset3 /bin/bash
檢視
docker ps -l  並未執行dockerfile中命令,test2執行的是在docker run中執行的命令。覆蓋了CMD命令
----------------------------------------------------
# First Dockerfile
FROM ubuntu:16.04
MAINTAINER nnn  'dockerHub名@outlook.com'
RUN apt-get update
RUn apt-get install -y nginx
或合併指令 RUN apt-get update & apt-get install -y nginx
EXPOSE 80
ENTRYPOINT ['usr/bin/nginx']
CMD ['-h']
組合使用,覆蓋CMD引數
docker run -p 88 --name ep_test2 -d dormanctpress/df_tset3 -g 'daemon off;'  
檢視
docker ps
  • ADD 包含類似tar解壓縮功能

  • COPY 單純複製檔案

  • VOLUME 添加捲

  • WORKDIR 建立工作目錄絕對路徑,若使用相對路徑,會一層一層傳遞下去 RUN pwd /a/b/c

  • ENV 設定環境變數

  • USER daemon 指定使用者

  • ONBUILD 映象觸發器

  • RUN

  • EXPOSE

19) Dockerfile 構建過程

docker 如何通過Dockerfile構建一個映象

  • 從基礎映象執行一個容器

  • 執行一條指令,對容器做出修改

  • 執行類似docker commit 操作,提交一個新的映象層

  • 再基於剛提交的映象執行一個新的容器

  • 執行Dockerfile中的下一條指令,直至所有指令執行完畢

# First Dockerfile
FROM ubuntu:16.04
MAINTAINER nnn  'dockerHub名@outlook.com'
ENV REFRESH——DATE 2018-11-24
RUN apt-get update & apt-get install -y nginx
EXPOSE 80
儲存退出
構建映象
docker build -t='doemancypress/df_test1' .
會刪除中間層建立的容器,並未刪除中間層建立的映象,build結尾返回最新生成映象ID
使用中間層映象進行除錯,查詢錯誤,通過step4中間層映象執行一容器
docker run -it step4 /bin/bash
構建快取
再次執行剛才執行的構建命令
docker build -t='doemancypress/df_test1' .
不使用快取
docker build -t='doemancypress/df_test1' --no-cache .
或者修改配置時間
ENV REFRESH——DATE 2018-11-25
docker build -t='doemancypress/df_test1' .
檢視映象構建過程
docker history image(如doemancypress/df_test1)

20)Docker 容器的網路連線

  • docker 容器的網路基礎架構

  • docker 容器的互聯和配置方法

  • docker 容器與外部網路連線和基於 IPtables 的防火牆機制

ifconfig          檢視網路裝置
Linux的虛擬網橋 docker0 網橋是OSI中的資料鏈路層
(應用--表示--會話--傳輸--網路--資料鏈路--物理)
特點:
可設定IP地址
相當於擁有一個隱藏的虛擬網絡卡
檢視網橋
先安裝網橋管理工具
sudo apt-get install bridge-utils
檢視
sudo brctl show
執行一個容器
docker run -it --name bbb ubuntu /bin/bash
ifconfig
退出讓容器繼續執行  使用組合鍵
再次檢視網橋狀態
sudo brctl show  多了一個網路介面
修改docker0地址,修改定義一個新的網段
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
檢視
ifconfig
重啟docker服務
sudo service docker restart
再執行一個docker容器
docker run -it --name ccc ubuntu /bin/bash
檢視新執行容器的IP地址
ifconfig       此時地址已經修改為新的IP地址
-------------------------------------------------------
自定義虛擬網橋
首先新增虛擬網橋,然後,更改docker守護程序的啟動配置
sudo brctl addbr br0
設定IP配置和子網掩碼
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
sudo vim /etc/default/docker 
新增DOCKER_OPS值
DOCKER_OPS=' -b=br0'
儲存退出
重啟docker守護程序服務
sudo service docker reatart
檢視設定是否成功
ps -ef | grep docker
執行一個容器
docker run -it --name ttt ubuntu /bin/bash
檢視該容器的IP地址
ifconfig    成功連線到新建的網橋上

21) Docker 容器的互聯

  • 允許所有容器互聯

  • 拒絕容器互聯

  • 運允許特定容器互聯

環境準備,同於測試Docker映象的Dockerfile
# Container connection test
FRON ubuntu 16.0
RUN apt-get intall -y ping & update & -y nginx & curl
EXPOSE 80
CMD /bin/bash
儲存退出
建立一個映象
docker build -t dormancypress/ctt .
預設通過虛擬網橋進行連線,允許所有容器互聯
啟動兩個容器,進行驗證
docker run -it --name cct1 dormancypress/ctt
啟動一個nginx服務
nginx
組合鍵退出
再啟動一個容器
docker run -it --name cct2 dormancypress/ctt
查cct2IP地址
ifconfig
組合鍵退出
檢視cct1IP地址
docker attach cct1     attach 重新附加到cct1 上
ifconfig
ping cct2 IP地址 172.22.11.2
docker attach cct2 
curl http://cct1 IP地址 172.22.11.1
停止cct1 再次啟動
docker stop cct1
docker restart
docker attach cct1
ifconfig                # 容器的IP地址會發生變化
容器的IP地址是不可靠連線,指定代號訪問容器
docker run -it --name cct3 --link=cct1:webtest dormancypress/ctt
使用--link,通過別名連線
ping webtset
#  或參照官方文件使用 docker network --help
檢視環境變數,檢視對容器產生的影響
env                  產生webtest的環境變數
vi /etc/hosts        添加了webtest的地址對映
組合鍵退出
重啟
sudo service docker restart 
docker ps
重啟剛才執行的幾個容器
docker restart cct1 cct2 cct2
docker attach cct3
ping webtest
檢視
vi /etc/hosts           IP地址改變了,docker會自動修改IP地址,和指定的別名對映
env                     環境變數也做出了改變
--------------------------------------------------------------
拒絕互聯 --icc=false
修改預設的配置檔案
sudo vim /etc/default/docker
DOCKER_OPTS= ' --icc=false '
儲存退出,重啟docker服務
sudo service docker restart
檢視配置是否成功
ps -ef |grep docker
執行三個容器
docker restart cct1 cct2 cct3
docker attach cct3 
ping webtest                  # 容器間連線被阻斷了
--------------------------------------------------------------
執行特定容器間互聯  --icc=false  --iptables=true  --link
修該docker啟動配置檔案
sudo vim /etc/default/docker
DOCKER_OPTS= ' --icc=false --iptables=true'
儲存退出,重啟docker服務
sudo service docker restart
docker restart cct1 cct2 cct3
docker attach cct1
nginx                                 # 開啟cct1的nginx服務
組合鍵退出
docker attach cct3
curl webtset                            訪問失敗
組合鍵退出
執行一個新容器
docker run -it --name cct4 --link=cct1:webtest dormancypress/ctt
再訪問cct1
curl webtest                            還是失敗
--------------------------------------------------------
檢視iptables
sudo iptables -L -n
第一項是DROP,是個BUG
將iptables設定清空
sudo iptables -F
sudo iptables -L -n
重啟docker服務
sudo service docker restart
再次檢視iptabes設定
sudo iptables -L -n
重啟docker容器
docker restart cct1 cct2 cct3 cct4
docker attach cct1
nginx
組合鍵退出
docker attach cct4
curl webtest               訪問成功
docker attach cct3
curl webtest               訪問成功
docker attach cct2
需要cct1的IP地址
組合鍵退出
docker attach cct1
ifconfig
ping cct1 IP地址
cutl http://cct1 IP地址    cct2 不能訪問 cct1
為什麼cct3可以??  3和4使用了--link選項
sudo iptables -L -n

22)Docker 容器與外部網路連線

  • ip_forward

  • iptables 決定外部網路與容器的連線

  • 允許埠對映訪問

  • 限制IP訪問容器,使用iptables

首次檢視docker是否執行
ps -ef |grep docker
檢視ip_forward的值,值設定為1
sudo sysctl net.ipv4.conf.all.forwarding
IPtables是linux核心整合的包過濾防火牆系統,幾乎所有的Linux發行版都有iptables功能
表 table  鏈chain  規則 rule ACCEPT REJECT  DROP
檢視iptables  filter表,預設檢視就是該表
sudo iptables -t filter -L -n
通過埠對映訪問容器
啟動一個新容器,使用之前建立的映象
docker run -it -p 80 --name cct5 dormancypress/cct
ngnix
crtl+P 退出,保證容器一直執行
檢視該容器埠對映情況
docker port cct5      #  對映埠假設為44444
本機訪問該埠
crul http://127.0.0.1:44444
該訪問是如何實現的?檢視iptables,最後一行新增一條允許外界訪問的規則
sudo iptables -L -n
換一臺虛擬機器訪問該機docker提供的規則
先檢視本機Ip
ifconfig          假設為:10.212.55.1
另一臺虛擬機器訪問
curl 10.212.55.1:44444   可正常訪問
回到本機,新增規則禁止外界訪問
阻止另一臺虛擬機器的訪問
新增一個新的容器
docker run -it -p 80 --name cct6 dormancypress/cct
nginx
crtl+p 退出
檢視另一臺虛擬機器ip  
ifconfig         假設:10.212.55.5
本機禁止另一臺虛擬機器的訪問,在iptables新增規則
-s      指定訪問源地址10.212.55.5
-d      指定目的地址剛建立容器的地址172.17.0.1
-p      指定協議
-j      指定操作
sudo iptables -I DOCKER -s 10.212.55.1 -d 172.17.0.1 -p TCP --dport 80 -j DROP
檢視iptables
sudo iptables -L -n           在chain DOCKER最頂端添加了該規則
檢視vvt6的埠對映
docker port cct6              假設:88888
另一臺虛擬機器訪問
curl 10.212.55.5:88888        訪問被阻止
curl 10.212.55.5:44444        可以訪問

23)Docker 容器的資料管理

  • Docker 容器的資料卷

  • Docker 資料卷容器

  • Docker 資料卷備份和還原

什麼是資料卷 Date Volume?

  • 資料卷是經過特殊設計的目錄,可以繞過聯合檔案系統UFS,為一個或多個容器提供服務

  • 設計目的,在於資料的永久化,完全獨立與容器的生存週期分離

資料卷特點:

  • 資料卷在容器啟動時初始化,如果容器使用的映象在掛載點包含資料,這些資料會被拷貝到新初始化的資料卷中

  • 資料卷可在容器之間共享和重用

  • 可對資料卷的內容直接進行修改

  • 不會影響映象的更新

  • 卷會一直存在,即使掛載資料卷的容器被刪除

為容器新增資料卷
指定建立存放資料卷的目錄,指定在容器中訪問的名字,使用Ubuntu系統
docker run -it -v ~/datavolume/data ubuntu /bin/bash
ls -l                               檔案中有了包含data的檔案目錄
touch /data/c1                      在data目錄中建立一個c1的檔案
echo "I'm in container" > /data/c1  在c1檔案中輸出一句話
退出容器
exit
ls -l                               本機有了datavolume資料夾
ls -l datavolume                    c1有了
vim datavolume/c1                   編輯檢視剛才輸出的內容
docker ps -l                        檢視容器映象,假設ID:888888
docker inspect 888888               檢視容器是否掛載了資料卷
為資料卷新增訪問許可權
啟動一個新的容器,資料卷設定與上面一樣,目錄設定後新增一個只讀的許可權
docker run -it -v ~/datavolume:/data:ro --name dvt1 ubuntu /bin/bash
ls -l           檢視,目錄已經掛載上
ls data
vi data/c1
exit
docker inspect dvt1
使用dockerfile構建包含資料卷的映象
# For data volume
FROM ubuntu:16.01
VOLUME ['/datavolume1','datavolume2']
CMD /bin/bash
儲存退出
構建映象
docker build -t dormancypress/dvt .
建立一個容器,執行映象
docker run --name dvt3 -it dormancypress/dvt
ls      新建立的容器已經掛載了,指定的兩個目錄
exit
docker inpsect dvt3
以同樣的映象,再建立一個映象
docker run --name dvt4 -it dormancypress/dvt
exit
docker inspect dvt4       檢視新容器的資料卷地址,與dct3的地址不一樣!!映象啟動,映象中指定的資料卷都會進行完整的初始化

24)資料卷容器

什麼是資料卷容器?

命名的容器掛載資料卷,其它容器通過掛載這個容器,實現資料共享

掛載資料卷的容器,叫做資料卷容器

使用構建好的映象建立一個容器
docker run -it --name dvt4 darmancypress/dvt
ls    容器中包含了指定映象裡的兩個資料卷
在其中一個數據卷中寫入一個檔案
touch /datavolume1/dvt4_1
ls /datavolume1
exit
再建立一個容器,來掛載剛才建立的,包含資料卷的容器dvt4,使用--volumes-from選項
docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash
docker rm dvt5   如果容器存在,則刪除,重新建立
ls      此時已經成功掛載dvt4
ls /datavolume1    同樣檢視檢視剛才建立的檔案資料
再建立一個檔案
touch /datavolume1/dvt5_1
ls  /datavolume1     檢視檔案是否建立成功
exit
再啟動一個新的容器,掛載cvt4
docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash
ls
ls /datavolume1    資料同樣可檢視
docker inspect --format="{{.Volumes}}" dvt5  只檢視volumes資料
返回,資料卷容器所掛載的資料卷目錄
docker inspect --format="{{.Volumes}}" dvt5   返回值同上
刪除共享的資料卷容器dvt4
docker rm dvt4
docker restart
docker restart dvt5
docker attach dvt5
ls          目錄名還存在
建立一個新檔案
touch datavolume1/dvt5_2
ls datavolume1    即使刪除了dvt4,依舊可以訪問資料卷容器掛載的目錄
exit
再建立一個容器
docker run --name dvt8 darmancypress/dvt
建立執行容器dvt9 ,掛載dvt8資料卷容器
docker run --name dvt9 -it --volume-from dct8 ubuntu /bin/bash
寫檔案
touch /datavolume1/dvt9_1
ls /datavolume1
exit
刪除掛載容器
docker rm -v dvt8        -v  不刪除容器掛載的資料卷
docker restart dvt9
docker attach dvt9
ls
touch /datavolume1/dvt9_2
ls /datavolume1               檔案還是可以寫入
總結:
一個數據卷還在被容器使用,那麼它就會一直存在
使用資料卷容器來掛載資料,實際上容器所起到的作用,資料卷掛載配置傳遞到掛載資料卷容器的新容器中

25)Docker 資料卷的備份還原

資料備份方法:

docker restart dvt5
docker attach dvt5
ls
ls dtatvolume1
exit
啟動一個新的容器來執行備份命令
--volumes-from      指定需要備份的容器名字
-v                  指定備份檔案存放的位置
~                   本地
/backup:wr          設定讀寫許可權,預設值可以不寫
tar cvf /           壓縮檔案到指定目錄,並指定需要備份的目錄datavolume1
docker run --volumes-from dvt5 -v ~/backup:/backup --name dvt10 ubuntu tar cvf /vackup/dvt5.tar  /datavolume1
ls  backup
備份資料還原 xvf
docker run --volumes-from dvt10 -v/backup:/backup ubuntu tar xvf /backup/backup.tar  /xxxx

26)Docker 容器的跨主機連線

  • 使用網橋實現跨主機容器連線

    配置簡單,生存環境中不易實現

  • 使用Open vSwitch 實現跨主機容器連線

    虛擬交換機軟體實現

  • 使用weave 實現跨主機容器連線

    weave 開源的專案,簡化容器連線配置

網橋實現
網路拓撲,相當於VM橋接
sudo vim /etc/nerwork/itnerfaces  設定網橋配置
sudo vim /etc/default/docker      修改docker配置
DOCKER_OPTS='-b=br0  --fixed-cidr=10.255.22.54/23'
sudo reboot                     重啟系統,驗證配置是否成功
ifconfig
ps -ef |grep docker          檢視docker啟動選項,守護程序啟動時,啟動了指定選項
啟動一個互動式容器
docker run --it ubuntu /bin/bash
ifconfig
ping 同一網路另一臺虛擬機器10.211.22.11    網路連線成功
ping www.baidu.com               外網IP也可以
相同方式配置另一臺虛擬機器
總結:
優點:配置簡單,不依賴第三方軟體
缺點:
    與主機在同網段,需要小心劃分IP地址
    需要有網段控制權,在生存環境中不易實現
    不易管理
    相容性不佳

27 )使用Open vSwicth 實現跨主機容器連線

GRE:通用理由協議封裝

隧道技術:點對點的再封裝

host1上網路設定
ifconfig
sudo ovs-vsctl show
建立ovs網橋
sudo ovs-vsctl add-br obr0
新增GRE介面
sudo ovs-vsvtl add-port obr0 gre0
設定介面,指定連線型別gre,指定需要連線的遠端伺服器地址,另一臺虛擬機器IP
sudo ovs-vsvrl set interface gre0 type=gre options:remote_ip=192.222.11.2
sudo ovs-vsctl show
建立本機docker容器需要使用的虛擬網橋
sudo brctl addbr br0
為br0設定網路地址
sudo ifconfig br0 192.168.1.1 nermask 255.255.255.0
為br0網橋新增os網橋連線
sudo brctl addif br0 obr0
sudo btctl show             br0連線到os網橋上了
配置docker,用新建網橋替換預設的docker0
sudo vim /etc/default/docker
儲存退出
重啟docker服務
sudo service docker restart
建立docker容器
docker run --it ubuntu /bin/bash
ping 遠端主機IP        成功
同樣方式設定另一臺機器
docker run --it ubuntu /bin/bash
ifconfig
切換到剛才主機,ping該機不同?
不同網段需要查詢路由表,確定不同網段的網路地址
檢視路由表
route
新增路由表,via 告訴路由表從哪獲取,指定查詢裝置
sudo ip route add IP地址/24確定網段名 via 192.168.33.11 dev eth0
route      此時新增成功
docker run --it ubuntu /bin/bash
再ping IP地址   成功
總結:
     可使用shell指令碼自動化部署
     或者現有的工具進行配置

28)使用weave實現跨主機連線

  • 語義:組織

  • 建立一個虛擬網路,用於執行在不同主機上docker容器連線起來,github上的開源專案

host1機器,下載 weave
sudo wget -D /usr/bin/weave  https://raw.github...
修改許可權
sudo chmod a+x /usr/bin/weave
啟動
weave launch
docker ps -l
host2機器上,同樣下載安裝
啟動
weave launch host1的IP地址     使兩臺docker host 正確的連線在一起
使用weave建立一個容器
ip地址是  將要啟動容器中分配的ip地址,並由weave維護
結果返回給c2
c2=$(weave run 192.168.22.22/24 -it ubuntu /bin/bash)
檢視c2值
echo $c2                      返回值是使用weave建立執行的容器
進入該容器
docker attach $c2
ifconfig                      檢視容器網路裝置
回到docker host1中
weave run 192.168.22.22/24  --name wc1 ubuntu /bin/bash
docker attach wc1
ifconfig
ping host2IP地址
總結:
    使用weave非常方便的為docker容器指定一個我們任意希望的分配的IP地址,並且劃分IP地址段(192.168.22.22/24),從而將不同主機的IP劃分在不同的IP網段中,實現連線的控制
    同時也非常方便限定跨主機連線方式

Python 總結篇

1 知識點

####   1-1 自定義進度條

定義一個處理進度的類,呼叫該類的相關函式處理進度顯示-- 選三個值(當前處理進度,總共需要處理的次數,進度條長度)i = 0 max_steps = 0 max_arrow=100 infoDone= 'Done'

初始化函式,總共處理的次數: def init(self,max_step,infoDone='Done'):

顯示函式,顯示當前處理進度:def show_process(self,i=None):

關閉函式: def close(self): self.i = 0

函式呼叫:

前端使用 progressbar 實現,後端使用 Tqdm 庫

####  1-2  Pickle 模組
from copy import copy,deepcopy
from pickle import dumps,loads
# pickle 模組,簡單的持久化功能,將物件以檔案形式儲存在磁碟
# dumps() 序列化,將資料轉為二進位制流的形式,即機器碼
# loads() 反序列化,將檔案中資料轉為Python物件
a = [1,2,3]
b = [a]*3
c = copy(b)
d = deepcopy(b)
e = loads(dumps(b,4))
b[1].append(99)
c[1].append(99)
d[1].append(99)
e[1].append(99)
####    1-3  單例模式

單例模式是一種常見的軟體設計模式,目的:確保一個類中只有一個例項

實現單例模式的四種方式:

模組:自定義類封裝一個單例模式函式

####    1-4 Python資料型別

可變資料型別:list 和 dict 可變集合set

不可變資料型別:int float string tuple 不可變set

set 與 dict 類似,也是一組key集合,但不儲存value,要建立set,需要提供一個List 作為輸入集合

s = set([1,2,4])

blueprint 藍本 和 django 中的app 功能類似,一個獨立的應用,有自己的view,models,tempaltes,urls等
--------------------------------------------------------------
非同步任務框架:
	celery
	twisted
--------------------------------------------------------------
檢視程序狀態  ps  -aux
檢視網路狀態  netstat  natp|grep 80 檢視佔用埠80,的程序
			 t~tcp   p~process
		或者:lsof -i:80  (ls open file) i~interface
		埠,多個子程序可以複用一個80埠
--------------------------------------------------------------
每臺伺服器開啟幾個程序?
價格走勢分析,資料量多少?
scrapy-redis 效能?
twisted  ?
同步,非同步? 
	多工處理方式:one by one 客戶端;many to one 來回切換執行
軟連線,硬連線?
	win 硬連線,記憶體指向(inode)同一個記憶體地址,是對引用的操作,只	能在同一個分割槽建立,操作,不能跨分割槽,跨硬碟,裝置 ln -h
	軟連線下相對於建立一個快捷鍵,ln -s,指標的指標,記錄另外一個檔案	   的記憶體地址
--------------------------------------------------------------

--------------------------------------------------------------

--------------------------------------------------------------

2 Python 效能優化

增加快取:使用apache和nginx 作為web 伺服器;

優化資料庫:索引,表結構,分庫分表,垂直分表,不常用的資料存放在一張表中,較少磁碟io操作,使用MySQL的分片技術,減少外來鍵使用等;

採用分散式部署;使用多核處理策略;使用spark 的核心SDD,加快資料處理

3 資料庫優化策略

資料型別優化:比如整形代替字串(data,time,cla等),避免使用NULL

索引優化:B-Tree索引,雜湊索引

索引優化:索引不能參與計算、長字串使用字首索引、儘量擴充套件索引,不新建索引、對於like查詢,%不要放在前面、對於where on group by order by 中出現的列使用索引等https://www.cnblogs.com/wuchanming/p/6886020.html

查詢優化:避免使用 select * from ,重複查詢相同資料使用快取;重構查詢:複雜的語句簡單化(切分和分解關聯查詢)

避免在where 語句中使用< > != 比較運算子,否則會放棄索引,掃描全表,對欄位進行函式操作

4 Python 解決高併發方案

HTML靜態化:使用ajax處理,首頁模組化處理

圖片伺服器分離:圖片是最消耗資源的,將圖片和頁面進行分離

快取:redis  如;memcache

資料庫叢集和庫表雜湊:MySQL 採用的是主從master/slave 方案

5 程序 執行緒 協程

程序:具有一定功能的程式在某個資料集合上的一次執行活動,是系統資源排程和分配的獨立單位,佔獨立記憶體,開銷大,但穩定安全,便於維護

執行緒:程序的一個實體,一個程序至少有一個主執行緒,多個子執行緒,執行緒間通訊主要共享記憶體,上下文切換快,資源開銷小,但不穩定已丟失資料

協程:一種使用者態的輕量級執行緒,協程的排程有使用者控制,擁有自己的暫存器上下文和棧,基本沒有核心切換開銷,可以不加鎖訪問全域性變數,上下文切換非常快

區別

一個程序可以單獨用有多個協程,一個執行緒可以有多個協程,這樣 Python 可以利用多核 CPU

程序,執行緒是同步機制,協程是非同步機制

協程能保留上一次呼叫時狀態,每次過程重入,相當於進入上一次呼叫狀態

程序和執行緒都面臨使用者態和核心態切換的時間消耗問題,協程自己控制切換時機,不受系統核心態影響,yield 就是協程思想

程序 執行緒 協程在 Python 中的使用

多程序:一般使用 Multiprocessing 庫,來利用多核 CPU ,主要是 CPU 密集型程式上,多程序的好處:一個程序掛掉不會影響其他子程序和主程序的執行,但嚴重影響系統資源排程,特別是CPU使用率和負載

多執行緒:一般使用 Threading 庫,完成IO密集型併發操作,優勢:資源消耗低,切換快,但一個掛點影響其他,現實中使用執行緒池解決

協程:一般使用 Gevent庫,協程多在 Tornado 中處理 Web 應用,使 Tornado 做到單執行緒非同步,解決 C10K 問題

總結

處理 IO 密集型多使用,多程序或多執行緒

處理 CPU 密集型多使用,多程序

強調非同步非阻塞多使用,協程或多程序+執行緒池組合

備註

CPU 密集型:計算密集型,大量計算,邏輯判斷等CPU相關操作都成為 CPU BOUND,C 語言多執行緒

IO 密集型:涉及到網路,磁碟 IO ,資料庫僅提供建立查詢,插入等操作,複雜的業務邏輯依賴與程式的實現,需要資料庫和程式頻繁互動,指令碼語言開發多執行緒

對於高併發,資料量大的動態網站資料應為 IO 密集型,對於裝備有高速磁碟陣列的伺服器,可以實現 CPU 密集型

執行緒池

  1. 高併發、任務執行時間短的業務,執行緒池執行緒數可以設定為CPU核數+1,減少執行緒上下文的切換

  2. 併發不高、任務執行時間長的業務這就需要區分開看了

  • 假如是業務時間長集中在IO操作上,也就是IO密集型的任務,可以適當加大執行緒池中的執行緒數目,讓CPU處理更多的業務

  • 假如是業務時間長集中在計算操作上,也就是計算密集型任務,程池執行緒數可以設定為CPU核數+1,減少執行緒上下文的切換

  1. 併發高、業務執行時間長,解決這種型別任務的關鍵不在於執行緒池而在於整體架構的設計,這些業務裡面某些資料是否能做快取是第一步,我們的專案使用的時redis作為快取

  2. 增加伺服器是第二步

  3. 最後,看看能不能使用中介軟體(任務時間過長的可以考慮拆分邏輯放入佇列等操作)對任務進行拆分和解耦

6 執行緒池原理及實現

傳統的多執行緒方案:即時建立,即使銷燬,一個執行緒的執行時間分為三部分:執行緒啟動時間,執行緒體執行時間,執行緒銷燬時間,如果提交給執行緒的任務是,執行時間短,操作極其頻繁的使用執行緒池,提高效率,系統的穩定性

執行緒池的原理:

任務放入佇列中,開 N 個執行緒,每個執行緒從佇列中取一個任務,執行完都告訴系統我執行完了,然後取下一個 task 直至 佇列中任務為空,退出執行緒

工作描述:

  1. 建立 Queue.Queue() 例項,然後填充資料或任務

  2. 生成守護執行緒池,把執行緒設定成 daemon 守護執行緒

  3. 每個執行緒無限迴圈阻塞讀取 queue 佇列的專案 item,並處理

  4. 每完成一次工作後,使用queue.task_done() 函式向任務已完成的佇列傳送一個訊號

  5. 主執行緒設定 queue.join() 阻塞,直到任務佇列清空,解除阻塞,向下執行

備註 完成一定數量任務的佇列結束:queue.join();執行緒完成任務結束:thread.join()

7 Python三種方法

Python 語法中的三種方法:

例項方法:第一個引數 self ,表示一個具體的例項本身

靜態方法:@staticmethod 無 self 將這個方法當做一個普通的函式呼叫

類方法@classmethod 第一個引數 cls ,表示類本身

應用場景:

類方法用在模擬Java定義多個建構函式

推導式

dict = {key,value for (key,value) in iterable}
a = lambda x,y:x*y
list =[i for in range(10) if i%1 == 0]

8 資料庫的連結方式

INNER JOIN(內連線):一一對映關係,即兩張表都有才能顯示出來,求兩張表(集合)的交集

select A.pk as A_PK,A.value as A_VALUE,B.pk as B_PK,B.value as B_VALUE
或者
select * from table A inner join table b on A.PK = B.pk;

LEFT JOIN (左連線):左邊表資料全顯示出來,右邊表資料只顯示共同部分,沒有部分補空(null)

select A.pk as A_PK,A.value as A_VALUE,B.pk as B_PK,B.value as B_VALUE
from table a left join table b on A.PK = B.PK;

RIGHT JOIN (右連線) :右表資料全顯示,左表顯示共同部分,沒有不空(null)

OUTER JOIN(外連線,全連線):查詢左右兩表所有資料,去除重複資料

select A.pk as A_PK,A.value as A_VALUE,B.pk as B_PK,B.value as B_VALUE
或者
select * from table a full join table b on A.PK = B.PK;

9 快取資料庫 Redis

快取獲取資料流程:

  • 先從快取獲取,如果有直接返回

  • 如果沒有,從資料庫獲取,並將資料加入快取

快取更新策略:

  • 直接手動更新,手動刪除舊快取

  • 過期時間,自動更新

快取命中率: 企業中大部分資料都從快取獲取,提升服務效能

伺服器部署

  • ngnix 2臺

  • Web 15臺

  • 快取 16臺

    臨時資料直接放快取,新增過期時間即可

  • 資料庫 8臺

  • Worker (celery)