11

python常用數(shù)據(jù)類型 6種


不可變數(shù)據(jù)類型: 數(shù)值囤热, 字符串址儒, 元組
可變數(shù)據(jù)類型: 列表, 字典却盘, 集合


元組:
可以存儲數(shù)值丢烘,字符串入愧,元組,列表,字典,集合6種數(shù)據(jù)類型胁后, 
元組是有序的,元素可以重復,
元組不支持修改嗦枢,僅支持查詢攀芯,但可以使用del刪除元組對象。 若存儲的元素要是可變數(shù)據(jù)類型文虏,則可以進行對應操作侣诺。比如列表,就可以對其進行增刪改查氧秘。

定義:a = (1,2,2,3年鸳,[11,22])
操作:
a[4].append(33)
del a

列表:
可以存儲6種數(shù)據(jù)類型的數(shù)據(jù), 
列表是有序的
支持增刪改查


操作:
a = [1,2,3]
a.append(4) # 末尾添加
a,insert(2, 5) # 指定下標處 插入
a.pop() # 彈出最后一個元素
a.pop(2) # 彈出指定下標元素
a[0] = 7# 修改
a.remove(3) # 刪除指定元素丸相,多個時刪除第一個匹配的
a.extend(b) # 合并列表

字典:
key: 必須是不可變數(shù)據(jù)類型搔确, (數(shù)值, 字符串灭忠, 元組)膳算,不可重復
值:可以存儲6種基本數(shù)據(jù)類型的數(shù)據(jù)

默認字段是無序的, 使用from collections import Orderdict 可以定義有序字典
a = {"name": [1,2,3]}
a["age"] = 12
del a["age]



集合:
集合只能存儲不可變數(shù)據(jù)類型的數(shù)據(jù)
內部數(shù)據(jù)沒有重復的弛作。
集合是無序列的
可以對兩個集合操作:
交集(&)涕蜂, 
并集(|), 
異或即去掉公共部分(^)映琳,
差集(-), 
判讀子集(set1.issubset(set2) set1是set2的子集 set1.issuperset(set2) set1是set2的的父集 返回布爾值   )
a = {1机隙,2,3萨西,"aa"}
a.add([11,22],(1,2,3))
a.remove(1) # 不存在 會報錯
a.discard("addr")# 不存在 不會報錯

參數(shù):
位置參數(shù)黍瞧, 
默認參數(shù);
關鍵字參數(shù):key_val形式
可變參數(shù) *arge 和**kwargs  *arge包裹以元組形式存儲的參數(shù)原杂, **kwars中包裹以字典形式存儲的參數(shù)

可變類型數(shù)據(jù)印颤,引用傳毒
不可變類型數(shù)據(jù):值傳遞


類方法, 實例方法穿肄, 靜態(tài)方法
類方法:使用裝飾器@classmethod, 第一個參數(shù)形參”cls“ 表示當前類對象年局, 用來傳遞類屬性和方法 類和實例對象都能調用
實例方法:第一個參數(shù)是self, 表示實例對象咸产, 用來傳遞實例的屬性和方法矢否, 只能由實例對象調用
靜態(tài)方法:使用裝飾器@staticmethod, 參數(shù)隨意脑溢, 沒有cls 和self參數(shù)僵朗。 但是方法體中不能使用類或實例的任何屬性和方法赖欣。類和實例對象都可以調用。


hash沖突解決: 開放尋址法 拉鏈法----已解決
開放尋址法:如果哈希函數(shù)返回的位置已經有值验庙,則可以向后探查新的位置來存儲這個值
  線性探查:如果位置i被占用顶吮,則探查i+1,i+2,......
  二次探查:如果位置i被占用粪薛,則探查i+1^2, i-1^2, i+2^2, i-2^2......
  二度哈希:有多個哈希函數(shù)悴了,當使用第1個哈希函數(shù)h1發(fā)生沖突時,則嘗試使用h2,h3
拉鏈法:哈希表每個位置都連接一個鏈表违寿,當沖突發(fā)生時湃交,沖突的元素將被加到該位置鏈表的最后



redis的數(shù)據(jù)結構:
字符串,一個key對應一個字符串藤巢, 底層是 簡單動態(tài)字符串搞莺, 包括已占用空間,剩余空間和數(shù)據(jù)空間掂咒, 在返回產犢時 時間復雜度為O(1), 存儲數(shù)據(jù)時才沧,先判斷有無可用空間。

列表:一個key對用一個字符串列表俏扩,底層使用雙向鏈表實現(xiàn)糜工。

哈希:hash結構體  類似于python的字段  key-val存儲。

集合:使用intset或字典實現(xiàn)录淡, 當數(shù)據(jù)全是數(shù)值捌木,且數(shù)量小于512個時,使用intset嫉戚, 是一個有序集合刨裆;  其他情況使用字典,將value設置為NUll彬檀, 處理hash沖突使用拉鏈法帆啃。

有序集合:有序集合每個元素包含數(shù)據(jù)本身和一個對應和的分數(shù)(score),數(shù)據(jù)結構:字典+跳表窍帝。跳表-> 有序單鏈表努潘。


redis持久化: RDB快照和AOF 

DRB: 周期性的遍歷數(shù)據(jù),將其以二進制格式坤学,存入RDB文件疯坤。通過fork一個子進程完成。
周期持久化策略:三種深浮。 
1. save 900 1
2. sav2 300 10
3. save 60 10000  60秒內有10000個寫入

AOF: 將執(zhí)行的每一次寫命令压怠,以類似于mysql二進制文件binlog形式,寫入AOF文件飞苇, 
隨著命令記錄的寫入菌瘫,AOF文件會越來越大蜗顽,會對其進行壓縮,會有重寫AOF操作雨让。 AOF重寫時雇盖,有新的寫命令時,會追加到aof_rewrite_buf緩沖區(qū)中宫患, 待重寫完成后刊懈,將其追加到最后这弧,最后替換原AOF文件娃闲。

AOF同步策略:
參數(shù)appendfsync指定同步策略:always每個事件周期都同步一次, everysec每秒同步刷新匾浪, no操作系統(tǒng)決定寫入的時機皇帮。



redis緩存 穿透, 雪崩蛋辈,擊穿
穿透:
解釋:請求的key在緩存中不存在属拾,去后端持久化層查找,導致后端過載冷溶,甚至宕機渐白。
解決:
1. 緩存空對象。沒有命中時逞频, set(key,null) 
2.布隆過濾器纯衍。在訪問緩存層和存儲曾之前,將存在的key用布隆過濾器提前保存起來苗胀,做第一層攔截襟诸,存在則進入緩存層和存儲層。(一句話:檢索一個元素是否在一個集合中)


雪崩:緩存層宕機或大量緩存由于超時時間相同在同一時間失效基协,大量請求直接達到存儲層歌亲,存儲層壓力過大導致崩潰。
解決:
1. 緩存層設計為高可用澜驮,RedisCluster集群部署
2. 多級緩存陷揪,本地一級緩存, redis二級緩存杂穷, 設置超時時間不同悍缠,岔開
3. 緩存過期時間使用隨機值,盡量避免大量key過期時間相同亭畜。

擊穿:熱點key 在緩存失效的瞬間扮休,大量線程來重建緩存,導致后端負載過大拴鸵,
解決:
1.使用分布式互斥鎖玷坠。只允許一個線程重建緩存蜗搔,其他線程等待重建完成后重新獲取數(shù)據(jù)即可。
2. 熱點key設置永不過期

redis分布式鎖的實現(xiàn)八堡,setnx: 原理:因為Rediskey必須保證是唯一的樟凄,只要誰能夠創(chuàng)建成功誰就能夠獲取鎖 zookeeper創(chuàng)建的是臨時節(jié)點,臨時節(jié)點也是唯一的兄渺。


redis主從復制:缺點:主宕機了缝龄,寫服務就不可用了, 引入集群模式挂谍。
  從服務器指向主服務器的ip和端口
  一旦主服務器有任何寫操作叔壤,都會有快照記錄
  當快照發(fā)生變化時, 主服務器通知下面所有的從服務器口叙,更新數(shù)據(jù)
  


redis集群模式: 
哨兵模式:
  Master的故障發(fā)現(xiàn):單個哨兵會向主的master節(jié)點發(fā)送ping的命令炼绘,如果master節(jié)點沒有及時的響應,哨兵會認為該master節(jié)點為“主觀不可用狀態(tài)”會發(fā)送給其他都哨兵確認該Master節(jié)點是否不可用妄田,
  當前確認的哨兵節(jié)點數(shù)>=quorum(可配置)俺亮,會實現(xiàn)重新選舉。
redisCluster模式




迭代器 :
迭代是訪問集合元素的一種方式疟呐。
可迭代對象:以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable脚曾。可以使用isinstance()判斷一個對象是否是可迭代對象(Iterable)
迭代器:迭代器是一個可以記住遍歷位置的對象启具,可以被next()函數(shù)調用并不斷返回下一個值本讥。 迭代器只能往前不能后退。富纸, 有兩個基本的方法 iter()和next 
可以使用iter()函數(shù)獲取可迭代對象的迭代器


生成器:
在python中囤踩,一邊循環(huán)一邊計算的機制,稱為生成器:generator. 生成器的兩種方法 __next__()和send()方法晓褪,生成器只能遍歷一次堵漱。
生成器函數(shù):常規(guī)函數(shù)定義,但是使用yield語句而不是return語句返回結果涣仿。yield語句每次返回一個結果勤庐,但每個結果中間,掛起函數(shù)的狀態(tài)好港,以便下次從它離開的地方繼續(xù)執(zhí)行



閉包  :
外部函數(shù)中又定義了一個內部函數(shù)愉镰,且內部函數(shù)使用了外部函數(shù)的局部變量,最后返回內部函數(shù)的引用钧汹。成為閉包

裝飾器:
裝飾器是一個閉包丈探,可以在不修改原函數(shù)功能的情況下,增加一些額外的功能拔莱, 一般使用語法糖@表示碗降,多個裝飾器作用域同一函數(shù)時隘竭,從上到下依次執(zhí)行。 應用(異常捕獲讼渊, 重試機制)




設計模式:
單例模式: 一個類只有一個實例动看,且由他自己實現(xiàn),并對外提供唯一訪問點爪幻。有餓漢式和懶漢式
  餓漢式: 在函數(shù)加載時就進行實例化菱皆。線程安全的
  懶漢式: 將實例化延遲,可以通過get_instance方法去實例化挨稿, 線程非安全仇轻, 安全的懶漢式,需要增加互斥鎖叶组。
  


工廠模式:定義一個創(chuàng)建對象的接口拯田,讓其子類決定實例化哪一個工廠類历造, 使實例化的過程延遲到子類進行

抽象工廠模式:提供一個創(chuàng)建一系列或相互依賴對象的接口甩十,而無需指定他們具體的類, 每個生成的工廠都能按照工廠模型提供對象吭产, 簡而言之就是工廠的工廠

策略模式:定義一系列的算法侣监,把他們一個個封裝起來,并且使他們可以相互替換臣淤。
結構:客戶端 策略接口橄霉,具體策略
主要技術:使用裝飾器@property將策略接口類中的方法變?yōu)閷傩裕约笆褂醚b飾器@方法名.setter來動態(tài)的修改屬性邑蒋,已達到在客戶端動態(tài)改變策略的目的


Nginx+ lvs+keepalived
Nginx七層負載均衡 

nginx的負載均衡策略:輪詢姓蜂, 加權輪詢, ip_hash, url_hash


lvs 四層負載均衡 VRRP(虛擬路由冗余協(xié)議)  
三種模型:
NAT模型:在服務器中修改目標ip達到轉發(fā)目的医吊,返回的請求重新到代理服務器钱慢,由代理服務器將數(shù)據(jù)返回給請求端。壓力較大

UN模型:在代理服務器中通過增加一層ip層卿堂,達到轉發(fā)束莫。 解析請求后,進行響應草描,修改源ip為VIP览绿,目標IP為CIP 通過真實服務的io接口的etho網卡 將數(shù)據(jù)響應給請求端。

DR模型:通過在代理服務器中修改MAC地址達到轉發(fā)目的穗慕,真實服務器收到請求饿敲,解析發(fā)現(xiàn)mac地址時自己的,處理請求逛绵,完成后通過RS的i接口的etho網卡怀各,將數(shù)據(jù)響應給請求端栗竖,mac尋址也是統(tǒng)一網絡中尋址的方法。但代理服務器合真實服務器(RS)必須在同一網絡中

8種調度算法:輪詢渠啤,加權輪詢狐肢,最少鏈接,加權最少鏈接沥曹,源地址散列調度算法份名, 目標地址散列調度算法。(基于局部的最少連接調度算法妓美, 復雜的基于局部最少連接調度算法)


mysql三范式 事務僵腺,索引 數(shù)據(jù)結構 索引分類 索引優(yōu)化 

三范式:
1NF: 強調列的原子性, 即不能再分為其他幾列(比如地址壶栋, 需拆分為國籍辰如,省,區(qū))
2NF: 在1NF的基礎上贵试, 另外包含兩部分內容琉兜, 1. 表必須有一個主鍵, 2毙玻,沒有包含在主鍵種的列必須完全依賴于主鍵豌蟋,而不能只依賴主鍵的一部分
3NF: 在2NF的基礎上, 非主鍵列要直接依賴于主鍵桑滩,不能存在依賴傳遞梧疲。

mysql事務  事務的特性ACID(原子性, 一致性运准, 隔離性幌氮, 持久性)
事務:事務是應用程序種一系列嚴密的操作,所有操作必須全部成功胁澳,否則每個操作中所作的所有更改都會被撤銷该互。
原子性:所有操作必須全部成功,否則每個操作中所作的所有更改都會被撤銷听哭。
一致性:事務執(zhí)行的結果必須使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)慢洋。
隔離性:事務的執(zhí)行不能相互干擾
持久性:一個事務一旦提交,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就應該是永久的陆盘。接下來的其他操作或故障不應該對其執(zhí)行結果有任何影響普筹。


事務的隔離級別4種:
未提交讀   問題:臟讀  問題原因:讀取到其他事務 未提交的數(shù)據(jù)

已提交讀  問題:不可重復讀, 同一事務多次讀取隘马,可能會讀取到不同的結果 問題原因:多次讀取中  其他事務對該數(shù)據(jù)做了修改 且已提交太防。 解決:加鎖  讀,行級共享鎖, 寫蜒车,行級排他鎖

可重復讀: 問題:幻讀 事務在之后讀物同一數(shù)據(jù) 與其啟動時第一次讀取的數(shù)據(jù)一致讳嘱, 實現(xiàn)原理:讀取,共享鎖 直到事務結束  寫 排他鎖 直到事務結束釋放酿愧。

序列化:將事務排序沥潭,原理,每個讀的數(shù)據(jù)行上加上共享鎖嬉挡。


進程 線程 協(xié)程

進程是資源分配的最小單位钝鸽, 多進程:切換需要系統(tǒng)開銷, 適合計算密集型任務庞钢。

線程是cpu調度的最小單位    多線程拔恰,適合I/O密集型任務

協(xié)程:一種用戶級的輕量級線程,協(xié)程擁有自己的寄存器上下文和棧基括,協(xié)作式的多任務颜懊,在一個線程內,無需切換风皿, 只是用戶控制執(zhí)行河爹。  可以用yeild實現(xiàn)協(xié)程, 高級用法揪阶,使用yeild from一個生成器 可以指定切換的另一個局部任務昌抠。

一個進程中可以有多個線程, 這些線程共享進程中的系統(tǒng)資源鲁僚, 除了cpu為其分配的寄存器和棧空間裁厅。


GIL:
全局解釋器鎖: 在python中 多進程其實是并行的而不是并發(fā)的冰沙。 一個進程中有一個全局解釋器鎖, 只有獲得鎖的線程才能運行其任務执虹。 多線程適合I/O密集型任務拓挥, 因為線程在執(zhí)行I/O操作時會釋放GIL. 一般采用多進程+協(xié)程方式。
線程安全
進程安全

進程池 from multiprocessing import Pool
線程池 

垃圾回收機制(GC):
引入計數(shù)為主袋励,標記清理和分代回收為輔侥啤。

引用計數(shù):在對象被創(chuàng)建的時候,同時創(chuàng)建該對象的計數(shù)器茬故, 對象被創(chuàng)建,引用或加入list等容器時盖灸,引用計數(shù)+1. 當對象超出作用域,引用被重新賦值時磺芭,引用計數(shù)-1. 當一個對象的引用計數(shù)為0時赁炎,就會被回收。 但是如果存在兩個對象相互引用時钾腺,引用計數(shù)都為1徙垫,此時不會被回收讥裤,需要使用標記清理的方式進行垃圾回收。

標記清理:以對象為節(jié)點姻报,以引用為邊己英,構成一個有向圖, 從根對象出發(fā)吴旋,可以被訪問的對象剧辐,標記為活躍對象,遍歷訪問完成后邮府,未被標記為活躍對象的對象荧关,就會被回收。 但是每次都遍歷一邊所有對象褂傀,比較耗時忍啤。所以就引入了分代回收機制。

分代回收:將對象按照存活時間分為不同的“代”仙辟,“代”可以理解為一種對象集合同波, 新創(chuàng)建的對象一般都會被放在第0代中, 久一點的放在第1代中  最久的放在第2代中叠国。 第0代中的對象被遍歷的間隔時間較短未檩,遍歷一遍后,會將存活時間久一點的對象粟焊,放在第1代中冤狡,依次類推。 一般第2代被遍歷則第1代會被觸發(fā)遍歷项棠, 第1代遍歷則第0代會被觸發(fā)遍歷悲雳, 三者遍歷的觸發(fā)機制不同,按照存活比例計算(700香追, 10合瓢, 10)


I/O模型  select poll epoll
在網絡環(huán)境下I/O分為兩部分: 
1.等待:等待數(shù)據(jù)準備好,也就是到達內核的某個緩沖區(qū)
2.復制透典;將數(shù)據(jù)從內核緩沖區(qū)晴楔,復制到應用程序緩沖區(qū)

同步/異步:關注的是消息通知機制,調用后能否向后執(zhí)行峭咒。
  同步:等待對方返回消息
  異步: 被調用者通過狀態(tài)通知或者回調機制通知調用者税弃,被調用者的運行狀態(tài)。
  
阻塞/非阻塞:關注的是調用者在等待結果返回之前所處的狀態(tài)讹语。
  阻塞:blocking 調用結果返回之前钙皮,調用者被掛起(只針對同步)  第一步和第二部都是阻塞的
  非阻塞:noblocking調用結果返回之前,調用者不會被掛起        第一步是非組阻塞的,但第二步是阻塞的短条。
  
同步I/O: 
  阻塞I/O: 第一步和第二部都阻塞
  非阻塞I/O: 第一步不阻塞导匣, 第二步阻塞。
      s = socket(AF_INET, SOCK_STREAM)
      s.setblocking(False) 
  信號驅動I/O茸时,
      先建立一個SIGIO信號處理程序贡定,數(shù)據(jù)準備好后,通過信號處理程序通知應用程序可都。
  I/O復用:阻塞I/O和非阻塞I/O缓待, 應該程序都是阻塞在recvfrom系統(tǒng)調用上, 而I/O復用將阻塞狀態(tài)轉移到上一層渠牲, 如select.poll或epoll等旋炒。  可以同時監(jiān)聽多個文件描述符,高并發(fā)時很有優(yōu)勢签杈,
      實現(xiàn)I/O多路復用的機制: 
          select() 最多監(jiān)控1024個I/O瘫镇, 會過濾沒有數(shù)據(jù)的socket.
          poll沒有監(jiān)控數(shù)量限制,select和poll 必須遍歷所有socket, 篩選效率比較低
          epoll答姥,套接字有數(shù)據(jù)了就主動通知調用者處理铣除,通過回調機制實現(xiàn)效率提升。

異步I/O:
  異步I/O


組合:
  同步阻塞
  同步非阻塞
  異步非阻塞






?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鹦付,一起剝皮案震驚了整個濱河市尚粘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敲长,老刑警劉巖郎嫁,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潘明,居然都是意外死亡行剂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門钳降,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腌巾,你說我怎么就攤上這事遂填。” “怎么了澈蝙?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵吓坚,是天一觀的道長。 經常有香客問我灯荧,道長礁击,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮哆窿,結果婚禮上链烈,老公的妹妹穿的比我還像新娘。我一直安慰自己挚躯,他們只是感情好强衡,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著码荔,像睡著了一般漩勤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缩搅,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天越败,我揣著相機與錄音,去河邊找鬼硼瓣。 笑死究飞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的巨双。 我是一名探鬼主播噪猾,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筑累!你這毒婦竟也來了袱蜡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤慢宗,失蹤者是張志新(化名)和其女友劉穎坪蚁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜沽,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡敏晤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缅茉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘴脾。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔬墩,靈堂內的尸體忽然破棺而出译打,到底是詐尸還是另有隱情,我是刑警寧澤拇颅,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布奏司,位于F島的核電站,受9級特大地震影響樟插,放射性物質發(fā)生泄漏韵洋。R本人自食惡果不足惜竿刁,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搪缨。 院中可真熱鬧食拜,春花似錦、人聲如沸勉吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齿桃。三九已至惑惶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間短纵,已是汗流浹背带污。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留香到,地道東北人鱼冀。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悠就,于是被迫代替她去往敵國和親千绪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容