Redis筆記整理
一、 Redis特性
二、 Redis應用情境
三、Redis營運與最佳化
一、 Redis特性
1、 Redis是一個開源的、高效能的key-value資料庫。它運行在記憶體中但是可持久化到磁碟。
2、 Redis的優點:
l 讀寫速度快,效能極高。(基於記憶體的操作,單線程免去了線程間的環境切換)read 11w/s,write 8w/s。
l 原子性,所有的操作都是原子的。
l 支援多種資料類型:String、list、set、sort set、hash、hyperloglogs、Geo。
l 支援transaction(事務內的每條指令都會執行,不管中途是否報錯,沒有復原機制)、pub/sub、lua script、key到期等特性
l Redis sentinel提供高可用支援 master/slave,cluster的failover
l 支援資料持久化
二、 Redis應用情境
1、 緩衝
2、 MQ
使用list資料結構,LPush添加資料到隊尾,LPop從隊頭取出資料
3、 排名
使用sort set 資料結構,通過zadd給每個key添加設定一個score,擷取排名時使用zrang擷取前10名的資料
4、 分布式鎖
使用string資料結構,setnx命令只有當key不存在時添加key。大概流程如圖:
1) setnx(lockname,expiretime)擷取鎖
2) 成功結束,失敗繼續
3) get(lockname)得到expiretime,判斷expiretime是否到期,
4) 沒到期結束,到期繼續
5) getset(lockname,expiretime1),擷取鎖並重新設定到期時間,判斷returnvalue
6) returnvalue!= expiretime擷取鎖失敗可重試。returnvalue== expiretime擷取鎖成功。
5、 分頁最佳化
當分頁資料量大時,如分頁數超過幾百頁,可通過list資料結構緩衝最新的N條記錄,通過LPush插入資料,通過Ltrim來保持list鏈表的長度。
6、 共同好友,可能的好友
通過set資料結構進行實現,通過sdiff來判斷A,B集合之間的差集,返回集合A中所有與B集合不同的元素。通過sinter來擷取A,B兩個集合的交集。
7、 實作類別bitmap演算法
通過hyperLogLog資料結構來實現,PFADD對資料集進行插入操作,如果資料集有變化,返回1,無變化返回0。
三、 Redis營運
1、 主從複製
1) config配置實現
slaveof <masterIP> <port>
master存在密碼:masterauth <password>
2) 積壓空間的概念:
專門用來儲存資料修改的命令的緩衝空間。當有一個寫資料的請求進入時會將相應的命令儲存在該空間中,用於與slave伺服器進行同步。不直接發送給slave而採用該空間是為了適應主從斷開重連的情境。
3) 同步流程
slave首次串連到master,發起一個部分同步的請求(PSYNC 命令:master_runid 上次串連的主機身份 和offset積壓空間的位移量),master接受到請求進行資料驗證,看是否滿足部分同步的情況,不滿足返回全量同步,主機返回+FULLRESYNC master_runid offset(從機接收並記錄 master_runid 和 offset,並準備接收RDB 檔案)接著啟動 BGSAVE 產生 RDB 檔案,BGSAVE 結束後,向從機傳輸,首先向從機傳送rdb檔案,從機接受到rdb檔案儲存到磁碟,然後載入到記憶體中。接著master發送積壓空間中的資料給slave。 從而完成全量同步。
之後的資料同步都是由master有資料寫操作就直接推送給slave。
2、 資料淘汰機制
當執行個體的記憶體達到設定的最大記憶體時,進行資料的淘汰機制:
l volatile-lru:從已設定到期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
l volatile-ttl:從已設定到期時間的資料集(server.db[i].expires)中挑選將要到期的資料淘汰
l volatile-random:從已設定到期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
l allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
l allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
l no-enviction(驅逐):禁止驅逐資料 ,超過最大值請求直接返回錯誤
由此可知,Redis並不保證所有key在到期後才回被回收。
Redis執行命令時都會檢測使用的記憶體是否超額,超額後 mem_tofree = mem_used - server.maxmemory 計算出要釋放的記憶體。然後根據資料淘汰機制進行釋放空間,同時將這個資料變更訊息發布到本地(AOF 持久化)和從機(主從串連)。
3、 持久化策略
持久化策略包括 RDB和AOF兩種方式。AOF 持久化和 RDB 持久化的最主要區別在於,前者記錄了資料的變更,而後者是儲存了資料本身。
可以同時開啟兩種持續方式,在這種情況下,當Redis進行重啟時,會優先載入AOF檔案進行恢複,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。
如果想把正在啟動並執行redis資料庫,從RDB切換到AOF,建議先使用動態切換方式,再修改設定檔,重啟資料庫。(不能直接修改設定檔,重啟資料庫,否則資料庫中資料就為空白了。)
1) RDB策略:
將記憶體快照dump到磁碟進行備份儲存,由conf檔案進行設定,觸發條件“ N 秒內資料集至少有 M 個改動”。備份時主進程fork出一個子進程進行bgsave操作,備份完成後會將新的RDB檔案替換舊的RDB檔案,並刪除舊RDB檔案。
使用Copy-on-write方法進行備份,在備份過程中可能會消耗大量的主機記憶體。當同一主機上有多個執行個體時,避免同時進行RDB操作。
優點:
l 檔案儲存緊湊,儲存某個時間點的所有資料,便於備份,並且便於傳輸。
l 恢複大的資料集時,RDB的方式會更快些。
缺點:
l 因為是每隔一段時間進行一次備份,萬一在Redis意外宕機,你可能會丟失幾分鐘的資料。
l RDB時要經常fork子進程來儲存資料,當資料集較大時,fork的過程會比較耗時,這時可能會導致主進程無法響應用戶端的請求
2) AOF策略:
記錄每次對伺服器寫的操作儲存到AOF檔案末尾(fsync),fsync也是通過fork一個子進程來完成的。當AOF檔案過大時,Redis會對AOF檔案進行重寫(bgrewrite)。由conf檔案進行設定,預設每秒進行一次fsync。初次開啟AOF時,會進行AOF檔案初始化,將現有的資料集都AOF進AOF檔案中。
優點:
l 根據使用不同的fsync策略,可以保證丟失的資料最少。預設情況下丟失1秒資料
l AOF只是一個追加檔案的操作,當某些原因未執行完整寫入命令時,可使用redis-check-aof工具修複。
l AOF檔案易讀,便於人工修改
缺點:
l 相同資料量,AOF檔案比RDB檔案更大。
l 當資料量大時,Redis重啟所用時間比RDB長。
相關參考:
http://wiki.jikexueyuan.com/project/redis/master-slave-replication.html
http://www.redis.cn/topics/persistence.html
http://www.cnblogs.com/0201zcr/p/5942748.html