redis開發相關

1.爲何要用緩存,緩存的使用場景
2.redis數據存儲類型 string/list/set/hash/sort set(zset)
3.redis的經常使用數據類型,使用方式
4.redis實現的跳躍表是什麼結構
5.redis支持哪些持久化方式
6.redis事務
7.redis實現分佈式鎖
8.經常使用的緩存使用模式
9.數據庫與緩存數據一致性
10.緩存穿透問題
11.如何解決緩存擊穿問題
12.如何解決緩存雪崩問題
13.redis如何作持久化?python

1.爲何要用緩存,緩存的使用場景
緩解mysql併發訪問壓力,熱點數據
減小響應時間:內存IO比磁盤快
提高吞吐量:redis等內存數據庫單機就能夠支持很高併發mysql

2.redis數據存儲類型 string/list/set/hash/sort set(zset)
查詢(操做)類型 批量操做 事務支持 每一個類型不一樣crud
發佈/訂閱 主從分區 序列化支持 腳本支持
網絡IO 單進程 單線程 IO多路複用 協程
持久化支持 RDB/AOF正則表達式

3.redis的經常使用數據類型,使用方式
string 用來實現簡單的KV鍵值對存儲,好比計數器
list 雙向鏈表(左右均可以追加值),好比用戶的關注,粉絲列表,隊列
hash 用來存儲彼此相關信息的鍵值對 用戶ID和name關聯
set 存儲不重複元素,好比用戶的關注者
sort set(zset)(有序集合) 實時信息排行榜redis

內置實現方式 各類類型的C底層實現方式
string 整數
list ziplist或double linked list
經過一個連續的內存塊實現list結構,其中的每一個entry節點頭部保存先後節點長度信息,實現雙向鏈表功能
hash ziplist或hashtable
set intset或hashtable
sortedset skiplist跳躍表
數據結構 時間與空間複雜度sql

4.redis實現的跳躍表是什麼結構數據庫

在大多數狀況先,跳躍表的效率能夠與平衡樹媲美,而且由於跳躍表的實現比平衡樹更爲簡單,因此有很多程序都使用跳躍表來代替平衡樹。django

Redis使用跳躍表做爲有序集合鍵的底層實現之一。後端

Redis的跳躍表由zskiplistNode和zskiplist兩個結構定義,其中zskiplistNode結構用於表示跳躍表節點,而zskiplist結構用於保存跳躍表節點的相關信息(如節點數量,表頭指針,表尾指針等)。緩存

5.redis支持哪些持久化方式
1.快照方式:把數據快照放在磁盤二進制文件中,dump.rdb 快照的實現方式是指定時間間隔把redis數據庫狀態保存到一個壓縮的二進制文件中
AOF(Append Only File):每個寫命令追加到appendonly.aof中
能夠經過修改redis配置實現服務器

6.redis事務
將多個請求打包,一次性,按序執行多個命令的機制
redis經過multi,exec,watch等命令實現事務功能
pipline=conn.pipline(transaction=True)

7.redis實現分佈式鎖
使用setnx實現加鎖,能夠同時經過expire添加超時時間
鎖的value值可使用一個隨機的uuid或者特定的命令
釋放鎖的時候,經過uuid判斷是不是該鎖,是則執行delete釋放鎖

8.經常使用的緩存使用模式
cache aside 同時更新緩存和數據庫
read/write through 先更新緩存,緩存負責同步更新數據庫
write behind caching 先更新緩存,緩存按期異步更新數據庫

9.數據庫與緩存數據一致性
先更新數據庫後更新緩存,併發寫操做可能致使緩存讀取的是髒數據
通常先更新數據庫後刪除緩存

10.緩存穿透問題
大量查詢不到的數據的請求落到後端數據庫,數據庫壓力增大
因爲大量緩存查不到就去數據庫取,數據庫也沒有要查的數據
不少無腦爬蟲經過自增id的方式爬取網站,網站查不到相關id的數據
解決:對於沒查到的返回爲None的數據也緩存
插入數據的時候刪除相應緩存,或者設置較短的超時時間

11.如何解決緩存擊穿問題
某些很是熱點的數據key過時,大量請求打到後端數據庫
熱點數據key失效致使大量請求打到數據庫增長數據庫壓力
分佈式鎖:獲取鎖的線程從數據庫拉數據更新緩存,其它線程等待
異步後臺更新:後臺任務針對過時的key自動刷新

12.如何解決緩存雪崩問題
緩存不可用或者大量緩存key同時失效,大量請求直接打到數據庫
多級緩存:不一樣級別的key設置不一樣的超時時間
隨機超時:key的超時時間隨機設置,防止同時超時
架構層:提高系統可用性.監控,報警完善

13.redis如何作持久化?
由於Redis是內存型數據庫,因此爲了防止由於系統崩潰等緣由致使數據丟失的問題,Redis提供了兩種不一樣的持久化方法來將數據存儲在硬盤裏面,一種方法是快照(RDB),它能夠將存在於某一個時刻的全部數據都寫入到硬盤裏面,另一種方法是隻追加文件(AOF),它會在執行寫命令時,將被執行的寫命令都寫入到硬盤裏面。

快照持久化:Redis能夠經過建立快照來得到在內存裏面的數據在某一個時間點上的副本。在建立快照以後,用戶能夠對快照進行備份,能夠將快照複製到其它服務器從而建立具備相同數據的服務器副本,還能夠將快照留在原地以便重啓服務器時使用。在只使用快照持久化來保存數據時,若是系統真的發生崩潰,用戶將丟失最近一次生成快照以後更改的全部數據。所以,快照持久化只適用於那些即便丟失一部分數據也不會形成問題的應用程序。有兩個命令能夠用於生成RDB文件,一個是SAVE,另一個BGSAVE。

SAVE特色:SAVE命令會阻塞Redis服務器進程,直到RDB文件建立完畢,在服務器進程阻塞期間,服務器不能處理任何命令請求。缺點:服務器持久化期間沒法接受其它請求。

BGSAVE特色:BGSAVE命令則會派生出一個子進程,而後由子進程負責建立RDB文件,服務器進程則繼續處理命令請求。缺點:建立子進程所耗費的時間會隨着Redis佔用的內存而增長。

文件持久化:AOF持久化會將被執行的寫命令寫到AOF文件的末尾,以此來紀錄數據所發生的變化,所以,Redis只要從頭至尾從新執行一次AOF文件所包含的全部寫命令,就能夠恢復AOF文件所記錄的數據集。由於Redis會不斷的將被執行的寫命令紀錄到AOF文件裏面,因此隨着Redis不斷執行,AOF文件的體積也會不斷增加,極端條件下,AOF甚至可能會用完硬盤的全部可用空間。爲了解決上面的缺點,Redis提供了BGREWRITEAOF命令,這個命令會經過移除AOF文件中的冗餘命令來重寫AOF文件,使得AOF文件儘量的小。它的原理和BGSAVE命令類似,Redis會建立一個子進程,而後由子進程負責對AOF文件進行重寫,由於AOF文件重寫也須要用到子進程,因此一樣存在快照持久化由於建立子進程所致使的性能問題和內存佔用問題。

 

django裏Queryset的get和filter方法的區別?

get得到是一個對象,filter獲得是一個對象列表,即便只有一個知足條件

簡述django對http請求的執行流程。
一個 HTTP 請求,首先被轉化成一個 HttpRequest 對象,而後該對象被傳遞給 Request 中間件處理,若是該中間件返回了Response,則直接傳遞給 Response 中間件作收尾處理。不然的話 Request 中間件將訪問 URL 配置,肯定哪一個 view 來處理,在肯定了哪一個 view 要執行,可是尚未執行該 view 的時候,系統會把 request 傳遞給 View 中間件處理器進行處理,若是該中間件返回了Response,那麼該Response 直接被傳遞給 Response 中間件進行後續處理,不然將執行肯定的 View 函數處理並返回 Response,在這個過程當中若是引起了異常並拋出,會被 Exception 中間件處理器進行處理。

簡述django下的(內建的)的緩存機制
緩存是將一些經常使用的數據保存內存或者memcache中,在必定的時間內有人來訪問這些數據時,則再也不去執行數據庫及渲染等操做,而是直接從內存或memcache的緩存中去取得數據,而後返回給用戶.django提供了6中內存緩存機制,分別爲:

開發調試緩存(爲開發調試使用,實際上不使用任何操做);

內存緩存(將緩存內容緩存到內存中);

文件緩存(將緩存內容寫到文件 );
數據庫緩存(將緩存內容存到數據庫);

memcache緩存(包含兩種模塊,python-memcached或pylibmc.)。

以上緩存均提供了三種粒度的應用。

django中model的slugfeild類型字段有什麼用途?
只包含字母、數字、下劃線和鏈接符,一般用於urls

Web開發中有哪些技術手段防止sql注入?sql注入:在sql語句中,若是存在'--'字符,則執行sql語句時會註釋掉--字符後面的內容。凡是有SQL注入漏洞的程序,都是由於程序要接受來自客戶端用戶輸入的變量或URL傳遞的參數,而且這個變量或參數是組成SQL語句的一部分。放置方式有:一、使用預編譯綁定變量的SQL語句 如execute()2.嚴格加密處理用戶的機密信息3.不要隨意開啓生產環境中Webserver的錯誤顯示4.使用正則表達式過濾傳入的參數5.字符串過濾6.檢查是否包函非法字符

相關文章
相關標籤/搜索