一、Redis支持的數據類型redis
String類型:字符串類型是二進制文件,能夠將圖片和視頻存入到string中,string類型支持incr操做,能夠用作統計計算算法
List類型:列表是指key對應的value是一個雙向鏈表結構,能夠實現消息隊列功能,減輕數據庫壓力數據庫
Set類型:是一種無序集合,在redis內部經過hashtable實現,查找和刪除元素的複雜度爲0(1),優勢:快速查找元素是否存在,用於記錄一些不能重複的數據緩存
Sort Set類型:是一種有序集合,經過一個double類型的整數score進行排序,內部經過跳躍表和hashtable組合完成,能夠實現一個優先級的隊列,好比排行榜服務器
Hash類型:哈希類型是每一個key對應一個hashtable,添加、刪除和修改操做的時間複雜度0(1),hash類型適合存儲對象app
二、Redis排序命令memcached
sort key:不設置任何選項是對集合元素進行簡單排序,默認正序性能
sort key [ASC | DESC | ALPHA]:默認排序ASC(從小到大),DESC(從大到小),ALPHA(字母順序)spa
sort key [by pattern]:按照給你模式(parttern)將集合元素內容自合成新key,並按新key對應的內容排序,完成後返回排好序的集合元素。操作系統
舉例:
lpush list 1 從list集合頭部添加一個值爲1的數據
lpush list 2 從list集合頭部再添加一個值爲2的數據
set name1 102 設置一個name1的key,值爲102
set name2 101 設置一個name2的key,值爲101
sort list by name*:name*表示將list裏的元素填充到*,按照name*裏面的值進行排序,返回的是排序後的list集合中的元素
sort key [limit start count]:limit選項可以限定返回結果的數據。下標從start開始,獲取count個元素
sort key [store dstkey]:按照固定模式排序後,將排序後的集合緩存在dstkey中,能夠減小cpu的開銷
三、事務處理
原理:redis接收到一個客戶端鏈接發出的multi命令,此鏈接會進入一個事務上下文,redis把此鏈接發來的命令存入一個隊列中。當此鏈接發出exec命令,redis便開始按順序執行隊列中的全部命令,並將全部命令執行結果打包一塊兒返回給客戶端鏈接,結束事務上下文。
保證一個client發起事務中的命令能夠連續執行,而中間不會插入其餘client命令,multi:打開一個務 exec:按順序執行 discard:取消一個事務。
缺點:某個命令不成功,事務中其餘命令正常執行,事務不會回滾。
watch命令監視給定的key,至關於給key加一個樂觀鎖。
四、兩種持久化機制:
快照(snapshotting):redis數據是保存在內存中,默認是以快照(RDB)的方式將數據持久化到磁盤上。如下是配置文件中的默認配置
save 900 1:表示900秒內若是至少有一個key的值變化,則保存快照
save 300 10:表示300秒內若是至少10個key的值變化,則保存快照
save 60 1000:表示60秒內若是至少有1000個key的值變化,則保存快照
工做原理:redis會fork一個子進程,子進程會將數據寫到磁盤上的一個臨時rdb文件中。當子進程完成寫臨時文件,將原來的rdb替換掉。這樣的好處是能夠copy-on-write。
缺點:若是遇到redis不正常關機,會致使最近的數據會丟失
Append-only file(AOF): 將redis的配置文件中的appendonly yes開啓就可使用aof方式持久化。redis每執行一個修改數據的命令,都會添加到aof文件中,當redis重啓後,會讀取aof文件進行恢復到redis關閉前的最後時刻。
aof三種刷新方式:appendfsync alaways(每次更新操做後手動調用fsync將數據寫到磁盤中)、appendfsync eveysec(表示每秒同步一次,推薦)、appendfsync no(等操做系統進行緩存同步到磁盤中)
工做原理:redis會fork一個子進程,子進程將最新的aof寫入到一個臨時文件,父進程增量的把內存中最新的執行命令寫入到就得aof文件,當子進程完成重寫臨時文件後,父進程收到一個信號,把以前內存中增量的修改寫入到臨時文件的末尾,而後將aof文件重命名,臨時文件重命名,開始向新的aof中寫入。
缺點:因爲都會存在aof文件中,會致使aof文件愈來愈大,雖然數據不會丟失redis性能會差些。可是能夠經過bgrewriteaof命令將當前內存中最短序列的命令寫到磁盤中來縮小aof文件的大小。
五、主從同步
特色:一臺主服務器能夠有對個從服務器。多個從服務器能夠鏈接同一個主服務器外,還能夠鏈接其餘從服務器。主從複製不會阻塞主服務器,再同步數據時,只服務器繼續能夠處理client請求。
過程:
第一階段
1)slave服務器主動鏈接到master服務器
2)slave服務器發送sycn命令到master服務器請求同步
3)master服務器備份數據庫到rdb文件中(備份期間,會將接收到的命令緩存起來)
4)master服務器把rdb文件傳輸給slave服務器
5)slave服務器清空數據庫數據,把rdb文件導入到數據庫中
第二階段
6)接下來master服務器把用戶全部更改數據的操做,經過命令的形式轉發給全部slave服務器
7)salve服務器執行master服務器發送過來的命令,就能夠實現同步
六、消息訂閱
實現原理:當客戶端執行subscribe命令訂閱頻道時,服務器會將客戶端與被訂閱頻道在pubsub_channels字典中進行關聯,若是頻道已經有其餘的訂閱者,那麼字典必有相應的訂閱者鏈表。
七、虛擬內存(VM)
redis把數據庫中的數據存放在內存中,隨着數據的不斷增長,會致使內存不足的狀況,從而可使用VM功能,將不多訪問的value保存到磁盤中。VM系統只能把value對應的object交換在磁盤中,而把全部key的object放在內存中,保證了查詢性能
交換過程:
1)計算保存這個對象須要佔用的swap文件中的多少頁
2)在swap文件中尋找一段連續頁空間來保存這個對象
3)把對象寫入swap文件
阻塞式VM與非阻塞式VM:將配置文件中vm-max-threads設置爲0爲阻塞式VM,大於0則採用的I/O線程進行交換,只有內存佔用超過vm-max-memory設定值時,纔會觸發VM交換。阻塞式VM優勢是簡單,當客戶端訪問被換出的數據或者redis正在將數據換出時,redis將不能處理其餘客戶端請求,從而阻塞其餘客戶端
八、內存淘汰
當數據庫內存不足時,redis能夠採用啓用虛擬內存(vm-enabled設置爲yes)或者啓用內存淘汰(將maxmemory設置大於0的整數)
redis淘汰算法:
1)隨機淘汰算法:從數據庫中隨機刪除一個key
2)LRU淘汰算法:從數據庫中刪除一個最近最少使用的key(memcached只有此方式)
3)TTL淘汰算法:從數據中刪除一個最快過時的key
九、對象引用計數
原理:給對象添加一個引用計數器,每當有地方引用它時,計數值就加1,當引用失效時,計數器值就減1,當計數器爲0時,將對象從內存中刪除
十、自動關閉超時鏈接
當有一個客戶端鏈接在必定時間內不進行任何操做時,redis自動關閉它,由於redis只能處理有限的客戶端鏈接,這個功能有效的防止一些用戶惡意佔用鏈接。開啓:timeout設置爲大於0的整數
十一、清除過時數據
redis爲每一個存儲的數據設定一個過時時間,當到達這個設定的過時時間後,redis便會把過時的數據從內存中刪除
redis清除過時數據的兩個階段:
1)在定時器中進行:隨機刪除一些過時數據
2)用戶獲取數據是進行