發佈與訂閱
- redis訂閱分爲精準的頻道訂閱與模糊匹配的模式訂閱;
- redis將全部頻道的訂閱關係都保存在服務器狀態pubsub_channels字典裏,鍵是頻道名,值是一個記錄全部訂閱此頻道的客戶端鏈表,退訂則是今後鏈表中刪除客戶端,若是刪除後鏈表爲空,則在字典中刪除此鍵;
- 全部模式訂閱關係都保存在pubsub_patterns鏈表中,表中的每一個節點包含一個pubsub pattern結構,這個結構的client屬性記錄訂閱的客戶端,pattern屬性記錄被訂閱的模式;
- 當客戶端執行publish命令將消息發送給頻道channel的時候,服務器須要執行如下動做:
- 將該消息發送給對應該頻道的全部訂閱者;
- 若是有一個或多個模式與頻道匹配,則將消息也發送給這個pattern模式的訂閱者
- redis 2.8新增pubsub命令,pubsub channel 查看當前被訂閱的頻道數量;pubsub numsub 查看具體頻道對應的訂閱客戶端數;pubsub numpat 查看被訂閱模式的數量;
事務
- multi set exec 一次性按先進先出順序執行一批命令;
- watch命令因爲在exec執行前監視任意數量鍵的值變化狀況,watched_keys字典中的鍵爲被監視的鍵,而值爲全部監視該鍵的客戶端;
- 全部對數據庫進行修改的命令如set、lpush、sadd、zrem、del、flushdb等在執行以後都會對watched_key字典中的鍵進行檢查,若有有對應的鍵被修改,則會將監視該鍵的客戶端的redis_dirty_cas標識打開,這樣當服務器開始執行客戶端發來的exec時會檢查此標識,若是此標識被打開則拒絕執行事務;
- redis事務的acid特性:
- 原子性:命令按FIFO順序執行,包括保障原子性,可是若是中途某個命令出現錯誤,整個事務會不予理會,繼續執行直到全部命令完成,不支持事務回滾;
- 一致性:任務狀態redis執行事務時都不會包含非法或無效的錯誤數據;
- 隔離性:redis使用單線程方式來執行事務,保障隔離性;
- 持久性:有redis的持久化模式決定
所以redis的事物老是具備acid中的原子性、一致性和隔離性,當服務器運行在aof持久化模式下而且appendfsync選項的值爲always時,事務也具備持久性。
lua環境
- redis在服務器內對lua環境進行了一些修改,如建立環境、載入函數庫、建立全局表格、改造隨機函數、排序輔助函數、錯誤報告函數、保護全局環境參數等;
- lua環境經過僞客戶端與命令執行器就行通訊;
- lua_scripts裏存儲了lua腳本的sha1校驗和以及lua腳本體,使得被執行一次的eval的lua腳本能夠經過evalsha直接調用sha1校驗和就能再次執行;
- script flush 狀況服務器lua_scripts字典中保存的腳本、script exists檢查sha1校驗和賭贏的腳本是否存在;script load爲腳本建立函數並保存到lua_scripts中;
- 服務器在執行lua腳本前會設置一個超時鉤子,當超時出現時能夠電泳script kill讓鉤子來中止正在運行的腳本;
- eval、script flush、script load能夠像普通redis命令同樣傳播到從服務器,而evalsha有可能會先轉換成等效的eval命令後在傳播到從服務器。
排序
- sort命令經過將被排序的鍵包含的元素載入到數據裏,利用快速排序算法實現排序;
- sort 集合鍵 alpha(按字符串方式,默認爲數字)asc/desc(升序/降序) by(其餘鍵做爲權重) limit(只保留排序結果集中指定的元素)get(根據模式過濾出匹配的鍵) store 鍵(將排序結果保存到指定的鍵裏);
- 出get外,其餘選項的擺放位置不影響sort命令的排序結果;
二進制位數組
- redis使用sds並逆序來保存位數;
- setbit key 偏移位置 0/1 設置指定偏移位置上的0或1;
- getbit key 偏移位置 獲得指定偏移位置的0或1;
- bitcout使用查表算法以及swar算法來優化獲取位數組中的非0二進制位的數量;
- bitop and/or/xor/not 使用C語言內置的位操做來實現
慢查詢日誌
- redis慢查詢日誌功能用於記錄執行時間超過給定時長的命令請求,包括slowlog-log-slower-than微秒制定超過改值會被記錄到日誌上,slowlog-max-len指定服務器最多保存多少條慢查詢日誌;
- 慢查詢日誌被保存在slowlog鏈表中,表中的每一個節點包含一個slowlogEntry結構表明一條慢查詢日誌;
監視器
- 客戶端執行monitor命令給服務器將本身變成一個監視器,服務器將這個客戶端的redis_monitor標識打開並把客戶端添加到monitors鏈表的表尾;
- 服務器在每次處理命令請求以前,都會調用replicationFeedMonitors函數將被處理的命令請求相關信息發送給monitors鏈表中的全部監視器;
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ redis