目錄redis
Redis: Remote Dictionary Server(遠程字典服務器)算法
是一個高性能的(key/value) 分佈式內存數據庫,是當前熱門的NoSql數據庫之一數據庫
redis官網緩存
redis中文網安全
String是redis最基本的類型,能夠理解成與Memcached如出一轍的類型,一個key對應一個value。服務器
String類型是二進制安全的。String類型的值最大能存儲512MB網絡
Redis hash 是一個鍵值(key->value)對集合。app
Redis hash 是一個string 類型的 field 和 value的映射表 , hash 特別適合用於存儲對象異步
Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。分佈式
Redis的Set是string類型的無序集合。它是經過哈希表來實現的。因此添加,刪除,查找的複雜度都是O(1)
Redis Zset和Set 同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大排序的。Zset的成員是惟一的,但分數(score)卻能夠重複。
各個數據類型應用場景:
Redis從2.2.0版本開始新增了setbit
,getbit
,bitcount
等幾個bitmap相關命令。雖然是新命令,可是並無新增新的數據類型,由於setbit
等命令只不過是在set
上的擴展。在bitmap上可執行AND,OR,XOR以及其它位操做。
HyperLogLog 能夠接受多個元素做爲輸入,並給出輸入元素的基數估算值:
理的範圍以內。
HyperLogLog 的優勢是,即便輸入元素的數量或者體積很是很是大,計算基數所需的空間老是固定的、而且是很小的。
每一個 HyperLogLog 鍵只須要花費 12 KB 內存,就能夠計算接近 2^64 個不一樣元素的基
數。可是,由於 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素自己,因此
HyperLogLog 不能像集合那樣,返回輸入的各個元素。
使用HyperLogLog進行數據統計時,須要考慮三要素:
首先,hyperloglog有必定的錯誤率,在使用hyperloglog進行數據統計的過程當中,hyperloglog給出的數據不必定是對的
按照維基百科的說法,使用hyperloglog處理10億條數據,佔用1.5Kb內存時,錯誤率爲2%其次,無法從hyperloglog中取出單條數據,這很容易理解,使用16KB的內存保存100萬條數據,此時還想把100萬條數據取出來,顯然是不可能的
GEO即地址信息定位
能夠用來存儲經緯度,計算兩地距離,範圍計算等
流水線功能,容許客戶端能夠一次發送多條命令,而不等待上一條命令執行的結果,主要的核心就是下降了多命令交互時網絡通訊的時間。
在指定的時間間隔內將內存中的數據集快照寫入磁盤,它恢復時是將快照文件直接讀到內存裏
Redis會單首創建(fork)一個子進程來進行持久化,會將數據寫入到一個臨時文件,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。整個過程當中,主進程是不進行IO操做的,確保了極高的性能。
若是須要進行大規模數據的恢復,且對於數據恢復的完整性不是很是敏感,那麼RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的數據可能丟失。
RDB 保存的是 dump.rdb 文件
SAVE: save時只管保存,其餘無論,所有阻塞
BGSAVE: redis會在後臺異步進行快照操做,快照同時能夠響應客戶端請求
以日誌的形式來記錄到每一個寫操做,將Redis執行過的全部寫指令記錄下來
AOF保存的是 appendonly.aof文件
正常恢復:
啓動: 設置YES,修改默認的 appendonly no,改成yes
將有數據的 aof 文件複製一份保存到對應目錄 (config get dir)
恢復:重啓redis而後從新加載
異常恢復:
啓動:設置YES,修改默認的 appendonly no,改成yes
備份被寫壞的AOF文件
修復:Redis-check-aof --fix 進行修復
恢復:重啓redis而後從新加載
Rewrite:
是什麼: AOF採用文件追加的方式,文件會愈來愈大爲避免出現此種狀況,新增了重寫機制,當AOF文件的大小超過設定的閥值時,Redis就會啓動AOF文件的內容壓縮,只保留能夠恢復數據的最小指令集,可使用命令bgrewriteaof
重寫機制: AOF文件持續增加而過大時,會fork出一條新進程來將文件重寫 (也就是先寫臨時文件最後再rename),遍歷新進程的內存中的數據,每條記錄有一條的Set語句。重寫aof文件的操做,並無讀取舊的aof文件,而是將整個內存中的數據庫內容用命令的方式,重寫了一個新的aof文件,這點和快照相似
觸發機制: Redis會記錄上次重寫時的AOF大小,默認配置是當AOF文件大小是上次rewrite後大小的一倍且文件大於64M時觸發
每修改同步:appendfsync always 同步持久化 每次發生數據變動會被當即記錄到磁盤 性能較差
每秒同步:appendfsync everysec 異步操做,每秒記錄 若是一秒內宕機,有數據丟失
不一樣步:appendfsync no 從不一樣步
RDB 持久化方式可以在指定的時間間隔能對你的數據進行快照存儲
AOF持久化方式記錄每次對服務器寫的操做,當體積過大時會觸發重寫機制
只作緩存:固然也能夠不使用任何持久化方式
同時開啓兩種持久化的方式:
在這種狀況下,當redis重啓的時候會優先載入AOF文件來恢復原始的數據,由於在一般狀況下AOF文件保存的數據集要比RDB文件保存的數據集要完整.
RDB的數據不實時,同時使用二者時服務器重啓也只會找AOF文件。那要不要只使用AOF呢?做者建議不要,由於RDB更適合用於備份數據庫(AOF在不斷變化很差備份),快速重啓,並且不會有AOF可能潛在的bug,留着做爲一個萬一的手段。