網上看見了關於redis的文章寫的賊好,人類的本質 偷過來
redis是啥?用redis官方的話來說就是:
redis是乙個c 語言開發的開源的、高效能鍵值對(key-value)的記憶體資料庫,可以用作資料庫、快取和訊息中介軟體。它是一種 nosql(not-only sql,泛指非關係型資料庫)的資料庫。
redis 與其他 key - value 快取產品有以下三個特點:
我:首先 redis 內部使用乙個 redisobject 物件來表示所有的 key 和 value。
redisobject 最主要的資訊如上圖所示:type 表示乙個 value 物件具體是何種資料型別,encoding 是不同資料型別在 redis 內部的儲存方式。
比如:type=string 表示 value 儲存的是乙個普通字串,那麼 encoding 可以是 raw 或者 int。
五種資料型別
①string是 redis 最基本的型別,可以理解成與 memcached一模一樣的型別,乙個 key 對應乙個 value。value 不僅是 string,也可以是數字。
string 型別是二進位制安全的,意思是 redis 的 string 型別可以包含任何資料,比如 jpg 或者序列化的物件。string 型別的值最大能儲存 512m。
②hash是乙個鍵值(key-value)的集合。redis 的 hash 是乙個 string 的 key 和 value 的對映表,hash 特別適合儲存物件。常用命令:hget,hset,hgetall 等。
③list 列表是簡單的字串列表,按照插入順序排序。可以新增乙個元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。
應用場景:list 應用場景非常多,也是 redis 最重要的資料結構之一,比如 twitter 的關注列表,粉絲列表都可以用 list 結構來實現。
資料結構:list 就是鍊錶,可以用來當訊息佇列用。redis 提供了 list 的 push 和 pop 操作,還提供了操作某一段的 api,可以直接查詢或者刪除某一段的元素。
實現方式:redis list 的是實現是乙個雙向鍊錶,既可以支援反向查詢和遍歷,更方便操作,不過帶來了額外的記憶體開銷。
④set是 string 型別的無序集合。集合是通過 hashtable 實現的。set 中的元素是沒有順序的,而且是沒有重複的。常用命令:sdd、spop、smembers、sunion 等。
應用場景:redis set 對外提供的功能和 list 一樣是乙個列表,特殊之處在於 set 是自動去重的,而且 set 提供了判斷某個成員是否在乙個 set 集合中。
⑤zset 和 set 一樣是 string 型別元素的集合,且不允許重複的元素。常用命令:zadd、zrange、zrem、zcard 等。
使用場景:sorted set可以通過使用者額外提供乙個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。
當你需要乙個有序的並且不重複的集合列表,那麼可以選擇 sorted set 結構。
型別簡介
特性場景
string
二進位制安全
可以包含任何資料,比如 jpg 或者序列化物件
dddhash
鍵值對集合 map
適合儲存物件,並且可以像資料庫中的update乙個屬性一樣只修改乙個項屬性值
儲存、讀寫、修改使用者屬性
list
鍊錶(雙向鍊錶)
增刪快,提供操作某一元素的api
最新訊息排行、訊息佇列
sethash表實現,元素不重複
增刪查的複雜度都是o(1),提供了求交集並集差集的操作
共同好友;利用唯一性統計訪問**的所有ip
sort set
將set中元素加權重引數sort,元素按sort排序
資料插入時已經是天然排序
排行榜;帶權重的訊息佇列
redis 為何這麼快
我:您是想問 redis 這麼快,為什麼還是單執行緒的吧。redis 確實是單程序單執行緒的模型,因為redis 完全是基於記憶體的操作,cpu 不是 redis 的瓶頸,redis 的瓶頸最有可能是機器記憶體的大小或者網路頻寬。
既然單執行緒容易實現,而且 cpu 不會成為瓶頸,那就順理成章的採用單執行緒的方案了(畢竟採用多執行緒會有很多麻煩)。
面試官:嗯,是的。那你能說說 redis 是單執行緒的,為什麼還能這麼快嗎?
我:可以這麼說吧,總結一下有如下四點:
redis 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常迅速,資料存在記憶體中,類似於 hashmap,hashmap 的優勢就是查詢和操作的時間複雜度是 o(1)。資料結構簡單,對資料操作也簡單。採用單執行緒,避免了不必要的上下文切換和競爭條件,不存在多執行緒導致的 cpu 切換,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有死鎖問題導致的效能消耗。使用多路復用 io 模型,非阻塞 io。
淘汰策略
面試官:那你說說你知道的 redis 的淘汰策略有哪些?
我:redis 有六種淘汰策略,如下圖:
持久化
面試官:你對 redis 的持久化機制了解嗎?能講一下嗎?
我:redis 為了保證效率,資料快取在了記憶體中,但是會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案中,以保證資料的持久化。
redis 的持久化策略有兩種:
rdb:快照形式是直接把記憶體中的資料儲存到乙個 dump 的檔案中,定時儲存,儲存策略。
aof:把所有的對 redis 的伺服器進行修改的命令都存到乙個檔案裡,命令的集合。redis 預設是快照 rdb 的持久化方式。
當 redis 重啟的時候,它會優先使用 aof 檔案來還原資料集,因為 aof 檔案儲存的資料集通常比 rdb 檔案所儲存的資料集更完整。你甚至可以關閉持久化功能,讓資料只在伺服器執行時存。
面試官:那你再說下rdb 是怎麼工作的?
我:預設 redis 是會以快照"rdb"的形式將資料持久化到磁碟的乙個二進位制檔案 dump.rdb。
工作原理簡單說一下:當 redis 需要做持久化時,redis 會 fork 乙個子程序,子程序將資料寫到磁碟上乙個臨時 rdb 檔案中。
當子程序完成寫臨時檔案後,將原來的 rdb 替換掉,這樣的好處是可以 copy-on-write。
我:rdb 的優點是:這種檔案非常適合用於備份:比如,你可以在最近的 24 小時內,每小時備份一次,並且在每個月的每一天也備份乙個 rdb 檔案。
這樣的話,即使遇上問題,也可以隨時將資料集還原到不同的版本。rdb 非常適合災難恢復。
rdb 的缺點是:如果你需要盡量避免在伺服器故障時丟失資料,那麼rdb不合適你。
面試官:那你要不再說下aof?
我頓了一下,繼續說:使用 aof 的優點是會讓 redis 變得非常耐久。可以設定不同的 fsync 策略,aof的預設策略是每秒鐘 fsync 一次,在這種配置下,就算發生故障停機,也最多丟失一秒鐘的資料。
缺點是對於相同的資料集來說**,aof 的檔案體積通常要大於 rdb 檔案的體積**。根據所使用的 fsync 策略,aof 的速度可能會慢於 rdb。
面試官又問:你說了這麼多,那我該用哪乙個呢?
我:如果你非常關心你的資料,但仍然可以承受數分鐘內的資料丟失,那麼可以額只使用 rdb 持久。
aof 將 redis 執行的每一條命令追加到磁碟中,處理巨大的寫入會降低redis的效能,不知道你是否可以接受。
資料庫備份和災難恢復:定時生成 rdb 快照非常便於進行資料庫備份,並且 rdb 恢復資料集的速度也要比 aof 恢復的速度快。
當然了,redis 支援同時開啟 rdb 和 aof,系統重啟後,redis 會優先使用 aof 來恢復資料,這樣丟失的資料會最少。
還有看不懂的就沒貼過來 這把這些看完再偷吧。知識點記錄
1 jensen不等式 jensen不等式表述如下 如果f是凸函式,x是隨機變數,那麼 特別地,如果f是嚴格凸函式,那麼 e f x f e x 當且僅當p x e x 1,也就是說x是常量。2 unet結構,卷積的三種模式 full,same,valid 其實這三種不同模式是對卷積核移動範圍的不同...
記錄知識點
03d 輸出三位寬度的整數,不足時前補0 3d 輸出三位寬度的整數,不足時後補空格 3d 輸出三位寬度的整數,不足時前補空格 d 輸出整數 未指定寬度,以實際寬度輸出 floor x 為1的值範圍是 1,2 而floor x 0.5 為1的範圍是 0.5,1.5 四捨五入 c語言函式總結大全 例如 ...
知識點記錄
資料結構與演算法 目的就是 達到 速度快和空間省 時間複雜度 細緻分析每一行 執行的次數,核心 執行次數的 n 的量級,就是整段要分析 的時間複雜度 加法法則 乘法法則 巢狀迴圈 複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o 2n 和 o n 當資料規...