[log]Redis 學習

http://redisbook.com/

簡介

是一個c語言編寫的數據緩存工具,以key-value形式進行數據存儲

daemonize  yes # redis-server 以守護進程的方式後臺運行

進入redis-cli
在這裏插入圖片描述
查看redis實例信息

  • server 服務器信息
  • clients 客戶端連接的狀態和指標
  • memory 大致的內存消耗指標
  • persistence 數據持久化相關的狀態和指標
  • state 總體統計數據
  • replication 主從複製相關的狀態和指標
  • cpu cpu使用情況
  • cluster cluster的狀態
  • keyspace 相關的統計數據

詳細的參數信息

https://blog.csdn.net/mysqldba23/article/details/68066322

redis 最大程度的利用了單線程、非阻塞的I/O模型來快速的處理請求

redis包含一個簡單但功能強大的異步事件庫,封裝了不同操作系統的polling機制
在這裏插入圖片描述

客戶端等待服務器的通知,收到服務器的通知後,自己取回結果

polling 過程中沒有線程或子進程的創建和交互,
是一個輕量級上下文切換的IO模型

可以通過tcp協議與redis進行通訊,
術語協議,代表網絡通信中服務器和客戶端之間使用的語言,
redis中這種協議叫做RESP redis序列化協議,Redis serialization protocol

keys 命令會使redis服務器阻塞,知道所有的鍵都返回,

scan 可以在不阻塞服務器的情況下在redis服務器上遍歷

數據類型

位圖

使用bit組成的數組,實際底層數據類型是字符串,本質上是二進制大對象
可以使用redis bitmap 用來統計用戶活躍數量,可以節省大量的內存空間

https://www.jianshu.com/p/62cf39db5c2f

有序集合

集合中的每個元素擁有一個可用於排序的權重,可以按順序從集合中獲取元素

可以用來實現 排行榜、等排名的功能

https://blog.csdn.net/loophome/article/details/50373202

有序集合的實現

https://www.cnblogs.com/WJ5888/p/4516782.html

使用了跳錶的數據結構,是一種隨機化的數據結構,

選取一些特定的元素做索引,當元素達到一定數量,繼續做二級索引等,
當查找元素時,可以先與索引做比較,縮小查找範圍,然後在進行進一步查找
以空間換時間

跳錶具有如下性質:

(1) 由很多層結構組成

(2) 每一層都是一個有序的鏈表

(3) 最底層(Level 1)的鏈表包含所有元素

(4) 如果一個元素出現在 Level i 的鏈表中,則它在 Level i 之下的鏈表也都會出現。

(5) 每個節點包含兩個指針,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素。

跳錶的基本原理

https://www.cnblogs.com/a8457013/p/8251967.html

redis管道

就是將多個命令打包一次性發送,來減少往返的延時

hyperloglog

原理,有點複雜

https://www.jianshu.com/p/55defda6dcd2

應用場景

https://blog.csdn.net/maoyuanming0806/article/details/81814610

事務

https://redisbook.readthedocs.io/en/latest/feature/transaction.html

發佈訂閱

subscribe 會自動創建頻道,
該頻道沒有訂閱者,發佈到該頻道的消息就會丟棄
不支持持久化,

複製機制

  • 部分重新同步
  • 完全重新同步

進行完全同步時,爲了將所有的數據複製到從實例中,
主實例需要將數據轉存儲到一個RDB文件中,然後將文件發送給從實例,
從實例接受到RDB文件後,會先將內存中的所有數據清除,再將RDB文件中的數據導入,
主實例上的複製過程是完全異步的。

部分同步不需要從主實例中傳輸完整的數據存儲文件。
將數據轉存儲到RDB文件中會創建一個後臺進程
在這裏插入圖片描述

主實例接受來自從實例的完全重新同步請求會,創建一個後臺進程將數據轉存儲到磁盤上,將轉存儲的數據發送給實例。

重啓後,會將進行部分重新同步,redis 能夠從RDB文件中重新加載master_replid和offset,從而使部分重新同步

從實例被提升爲主實例時,新主實例會記錄舊主實例的master_replid和offset

repl-backlog-size

redis主實例失去與從實例的網絡連接期間,主實例上的一段內存(實際是一個環形緩衝區)會跟蹤最近所有寫入命令,這個緩衝區實際上是一個固定長度的列表。

這個緩衝區稱爲replication backlog,
用來決定是完全重新同步還是部分重新同步。

發出SLACEOF命令後,
從實例使用最後一個offset和最後一個主實例的ID(master_replid) 向主實例發送一個部分重新同步請求,
請求建立之後,會檢查master_replid是否一致,
主實例檢查請求中offset能否中backlog緩衝區中獲取,在不在backlog的範圍內,

backlog緩衝區的大小是1mb,只能容納少量的寫命令,
當斷開連接時生成的數據大於緩衝區,就會執行完全重新同步.
在這裏插入圖片描述

主實例斷開連接後,重新連接從實例,主從複製可以繼續複製,斷點續傳,

當從實例斷開後,重新連接之後,會重現連接主實例

主從複製建立之後,主實例首先以RDB文件形式將內存中的數據發送給從實例,
在這期間執行的寫命令會會被緩存在一個slave client buffer 的緩衝區,
rdb加載之後,主實例會將這個緩衝區的內容發送給從實例

redis的鍵過期機制是由主實例驅動的,過期時,會向所有的從實例發送一個del命令,

redis服務器的命令處理引擎是單線程的,阻塞會導致複製超時.
repl-ping-slave-period的值必須小於repl-timeout的值

持久化

RDB:某一時間點上的快照,適合於備份和災難恢復
AOF:寫入操作的日誌,在服務器啓動時被重放

AOF的數據一致性比RDB更高

AOF功能被啓用時,
redis將會在數據目錄中創建AOF文件,
默認文件名是appendonly.aof,
當接收到一個會實際修改內存數據的寫入命令時,
就會追加到AOF文件中.

操作系統實際上維護了一個緩衝區,redis的命令首先會被寫入這個緩衝區中.
緩衝區中的數據必須被刷新到磁盤中才能被永久保存.
這個過程時通過linux系統調用fsync完成的,是一個阻塞調用,
只有磁盤設備報告緩衝區中的數據寫入完成後纔會返回
通過appendfsync來調整調用fsync的頻率

  • always 每個命令都調用fsync
  • everysec 每秒調用一次
  • no 永遠不調用

AOF重寫 來壓縮AOF文件
redis中的某些鍵可能已經被刪除或過期了,
可以在AOF文件中將其清楚

混合持久化模式

redis保證RDB轉儲和AOF重寫不會同時進行。

redis 啓動時,RDB和AOF持久化同時啓用且AOF、RDB文件都存在,redis總是會先加載aof文件,因爲aof文件能夠提供可靠的一致性。

當啓用了混合持久化,那麼redis首先檢查aof的前五個字符,如果是redis,那麼該aof文件就是混合模式,
redis服務器會加載rdb部分,再加載aof部分。

redis 集羣部署

哨兵模式 一主兩從

https://www.jianshu.com/p/06ab9daf921d

cluster-enabled yes # 來啓用集羣功能

三主三從

https://blog.csdn.net/youngflycode/article/details/81274092

分佈式原理

https://blog.csdn.net/andy86869/article/details/81668317

– raw # 顯示中文

memory usage key # 估算一個鍵的內存使用情況

常見問題

在這裏插入圖片描述

slowlog-log-slower-than 指定閥值,超過這個閥值的操作都會被記錄下來,
通過 slowlog get 獲取所有的慢日誌
在這裏插入圖片描述
通過 redis-cli 的 – latency-history 和 -i 選項來監控redis服務器的ping 延遲實現

在這裏插入圖片描述

分佈式鎖

redisson

https://www.jianshu.com/p/6f7d6a1c3bc2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章