redis 是用c語言編寫的記憶體中的資料結構儲存系統,可以用來作資料庫、快取、訊息中介軟體.
資料結構
字串(strings):值是任何種類的字串
雜湊(hashs):值是map 字典,陣列+鍊錶,不管讀多還是寫多都能很好的效能
列表(lists):鍊錶或佇列或棧
集合(sets):無序集合,可用交集、差集、並集
有序集合(sorted sets):有序集合
key設計技巧
可以模擬表設計方法,比如 表名:主鍵:欄位名
key 不要設計太長也不要太短
分布式鎖
在分布式系統裡面,我們常常是先執行查詢,如果查出結果滿足條件則執行更新或插入等操作,因為查詢是無鎖狀態,查詢和更新或插入又不是原子操作,所以會出現幻讀或髒讀,即併發問題,以至影響我們的業務,比如對庫存、積分、優惠劵等關鍵資料的控制;redis 為我們提供 setnx (set if not exists )指令,來實現分布式鎖效果,在同一時間只能有乙個客戶端訪問處理資料,其它客戶端進行等待,直到指定的expire 過期,對expire 要慎重設定,記住分布式鎖是悲觀鎖,且無法解決超時問題.
事務
redis 事務命令是multi 類似於開始事務;exec 類似於提交事務;discard 類似於回滾事務; 嚴格意義上不支援事務,因為它不滿足事務的原子性原則,並且不支援回滾操作,即沒有操作前的日誌記錄,如果使用事務,裡面有個規則是執行多個命令語句,有任意乙個命令語句錯誤(比如 set 命令寫成 met ),則做exec 時全部命令執行失敗,如果全部命令編寫成功則做exec 時即便是執行失敗的情況則也會有執行成功的命令,這個規則對於開發人員來說透明,因為開發人員更多的是通過封裝的庫或中介軟體來操作reids ; 另外記住redis 提供 watch 命令來對key進行監控,即可實現樂觀鎖.
持久化
rdb redis 通過多程序機制來實現快照持久化(rdb),在持久化時會fork 乙個子程序來對資料進行讀取並存到磁碟中,由於會遍歷讀取記憶體寫磁碟所以會比較消耗伺服器資源,由於不是實時保持資料且操作有可能持續比較長,所以會丟資料及重啟服務資料比較慢.
aof 是重放redis 命令;底層是執行 作業系統的 fsync 函式來寫磁碟,但是fsync 操作效能比較慢,所以redis 有三種規則包含來呼叫fsync :
1.定時呼叫
2.決不呼叫
3.執行乙個命令就呼叫一次
另外 aof 檔案會比較長的問題,可以定期通過bgrewriteaof命令來減少aof 的長度.
在實際使用當中,可以rdb 和 aof 混合使用提高重啟效率,且多從庫做持久化避免丟失資料.
限流
使用 redis-cell 模組實現漏斗演算法限流.限流演算法有兩個關鍵點:乙個是漏斗初始化容量,乙個是限流最大限流速率(單位時間內請求量).
單執行緒
redis 雖然是單執行緒但效能非常好,可了解下io的多路復用模型,雖然redis是單執行緒,但並不是乙個執行緒,而且有些操作是非同步執行緒完成的,比如 key 的過期策略,超過最大虛擬記憶體時使用的lru 清除key 演算法策略,持久化 等都使用了非同步執行緒;另外記住這些redis 命令在生產環境請禁用;keys*,del key ,flushdb , flushall ,aof 等;因為這些命令有可能會導致redis 卡頓.
tags: lru、過期key、記憶體資料庫、非同步執行緒、多路復用、哨兵、集群
程式設計師眼中的語言
語言是一種工具,語言應需要產生,並應需要而發展。原始的語言和詞彙是一種直接 具體的符號及符號組合。感性是理性的啟端,發展了的語言是建立在自我描述之上的一種抽象。詞彙是語言的材料,詞法是語言的模板,語義則是語言的精神。抽象是實際需要,是選擇的結果,一致性是抽象的目的,而抽象本身卻是二義的。抽象意味著表...
我眼中的程式設計師
從事專案管理工作也有很長時間了,合作過的程式設計師也有幾十位了吧,跟他們的合作大多都是愉快的,我也很喜歡跟他們合作,因為很多的好想法只有通過程式設計師才能實現。跟我合作的程式設計師很多都不是軟體專業,而是物理,數學,無線電等等專業的,但是他們比起軟體專業的人毫不遜色,也許還要強一些。怎麼跟程式設計師...
程式設計師眼中的CPU
cpu是暫存器的集合體。高階語言經過編譯轉化為機器語言之後,通過暫存器進行運算 累加暫存器 和儲存處理。根據功能將暫存器分為8類 1.累加暫存器 accumulator register 2.程式計數器 program counter 3.基址暫存器 base register 4.變址暫存器 in...