心智圖資源庫 Redis
這是一篇關於Redis的心智圖,介紹詳細,描述全面,希望對有興趣的朋友有幫助!
編輯於2023-12-21 17:36:42Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
Redis
事務
定義
事務是一個單獨的隔離操作,事務中的所有操作都將序列化,有順序的執行,事務執行的過程中不會被其他客服端發來的命令打斷
作用
串聯多個命令防止其他命令插隊
命令
WATCH key [key ...]
在執行multi之前,先執行watch key1 [key2],可以監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
Multi
輸入的命令都會進入命令隊列,但是不會執行,將等待Exec命令執行,然後依次執行
Exec
執行命令隊列
discard
丟棄命令隊列
事務的錯誤處理
組隊成功,執行成功,所有的命令都將有序執行
組隊成功,選擇discard,所有的指令都不會執行
組隊中某個指令出錯,執行時整個佇列的指令都會被取消
組隊成功,執行時某個命令出錯,除了出錯的命令,其他的命令都將執行
Redis事務沒有原子性
Redis事務的三大特性
單獨的隔離操作
事務中的所有指令都會序列化、依序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
沒有隔離等級的概念
佇列中的命令沒有提交之前都不會實際被執行,因為事務提交前任何指令都不會被實際執行
不保證原子性
事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾
Redis事務與Mysql事務的區別(圍繞ACID)
持久化
RDB
核心配置
dbfilename 設定檔名稱
save
在多少秒內進行了多少次操作
觸發RDB
自動觸發save
會阻塞主程序,直到完成RDB持久化
手動儲存: bgsave
Redis會在背景非同步進行快照操作, 快照同時還可以回應客戶端請求。
透過lastsave可以取得最後一次執行快照的時間
不會阻塞主進程
執行flushall命令
執行flushall指令,也會產生dump.rdb檔,但裡面是空的,沒有意義
flushdb指令不會產生dump.rdb文件
正常退出Redis
redis.conf中更多配置
stop-writes-on-bgsave-error
當Redis無法寫入磁碟的話,直接關掉Redis的寫入操作。推薦yes
rdbcompression 壓縮文件
如果你不想消耗CPU來進行壓縮的話,可以設定為關閉此功能。推薦yes.
rdbchecksum 檢查完整性
在儲存快照後,也可以讓redis使用CRC64演算法進行資料校驗
持久化流程(記憶體快照)
Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到 一個暫存檔案中,待持久化過程都結束了,再用這個臨時檔案取代上次持久化好的檔案。 整個過程中,主進程是不進行任何IO操作的,這就確保了極高的性能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效能。 RDB的缺點是最後一次持久化後的資料可能會遺失
Fork的作用是複製一個與目前流程一樣的流程。新進程的所有資料(變數、環境變數、程式計數器等) 數值都和原進程一致,但是是一個全新的進程,並作為原始進程的子進程
優勢
適合大規模的資料恢復
對資料完整性和一致性要求不高更適用
節省磁碟空間
恢復速度快
劣勢
可能會遺失最後一次快照所有的修改
AOF
介紹
以日誌的形式記錄每一次寫入操作,只可以追加文件但不能改寫文件
預設不開啟
appendonly no
AOF和RDB同時開啟會優先選擇AOF
持久化流程
客戶端的請求寫入指令會被追加到AOF緩衝區
AOF緩衝區根據AOF持久化策略將操作同步到磁碟的AOF檔案中
AOF檔超過重寫策略或手動重寫時,會對AOF檔rewrite重寫,壓縮AOF檔容量
Redis伺服器重開機時,會load載入AOF檔中的寫入操作
同步頻率設定
appendfsync always
永遠同步,每次Redis的寫入都會立刻記入日誌;效能較差但資料完整性比較好
appendfsync everysec
每秒同步,先將日誌寫到AOF檔的記憶體緩衝區,每隔一秒再把緩衝區的內容寫入磁碟,如果宕機,本秒的資料可能遺失
appendfsync no
redis不主動進行同步,把同步時機交給作業系統。
優勢
備份機制更穩健,資料不容易遺失
可讀的日誌檔,可以處理錯誤操作
劣勢
比RDB佔用更多的磁碟空間
恢復速度慢
每次都進行讀寫同步的話,效能有壓力
存在個別bug,造成不能恢復
Redis過期鍵刪除策略
Redis採用的是定期刪除和惰性刪除兩種結合的策略
定期刪除:每隔一段時間,隨機抽取設定了過期時間的key,檢查是否過期,過期刪除
每1秒重複10次,隨機抽取20個key檢查是否過期,如果25%的key過期了,就重複該行為
會漏掉很多的過期鍵
惰性刪除:資料過期時,先不處理,當過期鍵被存取時,在進行刪除
用空間換時間
如果漏掉了很多的過期鍵,並且沒有去檢查,也就不會走惰性刪除,大量的過期鍵堆積在內存中,導致Redis內存耗盡,此時就要走內存淘汰機制
主從複製
是什麼
主機資料更新後,根據策略,自動將資料同步到master/slave機制.master負責寫,slave負責讀
能乾嘛
讀寫分離,效能擴展
容災快速復原,提高可用性
怎麼玩
啟動多個redis服務
配置從庫
執行 slaveof IP port
查詢主從訊息
info replication
常見情況
一主二僕
從機是否可以寫? set可否?
不可以寫,set也不行
主機shutdown後狀況如何?從機是上位還是原地待命?
從機原地待命
主機回來了後,主機新增記錄,從機還能順利複製?
可以
其中一台從機down後狀況如何?依照原有它能跟上大部隊嗎?
可以
薪資相傳
master和slave雙重身分的機器是否可以寫入資料呢? ?
不可以,只要有從機的身份,就不能寫數據
反客為主
主機宕機了,可以手動使從機變成主機
複製原理
slave啟動成功連線到master後會傳送一個sync指令
Master接到指令啟動後台的記憶體進程,同時收集所有接收到的用於修改資料集指令, 在後台程序執行完畢之後,master將傳送整個RDB資料檔到slave,以完成一次完全同步
全量複製:而slave服務在接收到資料庫檔案資料後,將其記憶體並載入到記憶體中。
增量複製:Master繼續將新的所有收集到的修改指令依序傳給slave,完成同步
但是只要是重新連接master,一次完全同步(全量複製)將會自動執行
哨兵模式
哨兵就是一個運作在特性模式下的Redi流程,主要有三個任務
監控
給所有的主從庫發送PING命令,檢查是否存活,沒有在規定的時間內響應判定為下線
主觀下線
如果哨兵發現主庫或從庫對 PING 指令的回應逾時了,那麼,目前哨兵就會先把它標記 為「主觀下線
客觀下線
如果 N/2 1 的哨兵都將該主庫標記為主觀下線,那麼該主庫就會被標記為 "客觀下線"
只有主庫被標記為客觀下線,哨兵才會去選舉新的主庫
如果只有一個哨兵,當因為網路原因或主庫壓力過大,主庫沒有及時響應哨兵,被哨兵標記為主觀下線,而此時又只有一個哨兵,將直接選舉新的主庫而如果有哨兵集群,必須要N/2 1以上的哨兵標記主庫為主觀下線,主庫才會被標記為客觀下線,哨兵才會去選舉新的主庫能減少誤判
選主
主庫掛了將在從機中選出新的主庫
選舉新的主庫過程
篩選
從庫的當前在線狀態,也要判斷它之前的網路連線狀態
評分
從庫優先級
從庫複製進度
從庫ID號
通知
將新的主庫資訊傳送給其他的從庫,讓其他的從庫和新的主庫建立連線,進行資料複製
是什麼
反客為主的自動版,能夠後台監控主機是否有故障,如果故障了根據投票數自動將從庫轉換為主庫
怎麼玩
新建sentinel.conf文件,名字絕對不能錯
配置哨兵,填寫內容
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster為監控物件起的伺服器名稱, 1 為至少有多少個哨兵同意遷移的數量。
啟動哨兵
/usr/local/bin
執行redis-sentinel /myredis/sentinel.conf
當主機掛掉,將在從機中選取新的主機
選舉規則
優先權
在redis.conf中預設:replica-priority 100,值越小優先權越高
偏移量
偏移量是指獲得原主機資料最全的
runid
每個redis實例啟動後都會隨機產生一個40位元的runid(透過info server取得檢視)
叢集
什麼是集群
對Redis的水平擴容
叢集中有一部分節點失效或無法進行通訊, 叢集也可以繼續處理指令請求。
主機宕機,從機自動提升為Master
配置
redis cluster配置修改
cluster-enabled yes 開啟叢集模式
cluster-config-file nodes-6379.conf 設定節點設定檔名
cluster-node-timeout 15000 設定節點失聯時間,超過該時間(毫秒),叢集會自動進行主從切換。
啟動
redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11. .168.11.101:6391
不要用127.0.0.1, 請用真實IP位址
什麼是slots
一個 Redis 叢集包含 16384 個插槽(hash slot), 資料庫中的每個按鍵都屬於這 16384 個插槽的其中一個
不在一個slot下的鍵值,是不能使用mget,mset等多鍵操作。
集群的不足
多鍵操作是不被支援的
多鍵的Redis事務是不被支援的。 lua腳本不被支持
複雜度較大
為什麼叢集需要至少三個節點
一個節點掛了,有一半以上的節點通過ping-pong方式的投票機制認為它掛了,那麼這個集群就掛了.如果只有兩個節點,一個節點掛了,另外一個節點投票.只有50%,不過半數,這個集群就不會掛,所以至少需要三個節點
為什麼叢集至少需要六台伺服器
因為一個叢集至少需要三個節點,而每一個節點需要一個備份機,所以一個叢集需要至少六台伺服器
JAVA連接開發 Jedis
依賴: <artifactId>jedis</artifactId>
JedisPool 連接池
setBlockWhenExhausted
/連線耗盡時是否阻塞, false封包異常,ture阻塞直到逾時, 預設true
setTestOnBorrow
從連接池取連接的時候檢查是否失活
自動裝配JedisPool對象
五大數據類型
應用
基本使用
安裝目錄
redis-benchmark:效能測試工具,可以在自己本子運行,看看自己本子效能如何
redis-check-aof:修復有問題的AOF文件,rdb和aof後面講
redis-check-dump:修復有問題的dump.rdb文件
redis-sentinel:Redis叢集使用
redis-server:Redis伺服器啟動指令
redis-cli:客戶端,操作入口
設定檔 redis.conf
後台啟動
daemonize no 改成 yes
啟動伺服器 redis-server /myredis/redis.conf
用客戶端存取 redis-cli
-p 指定連接埠
-c 集群方式
網路相關配置
bind
不寫即無限制接受所有的IP位址的訪問
protected-mode保護模式
預設開啟 即使接受所有IP位址的存取,也不能存取成功
Port 連接埠號碼
預設 6379
tcp-backlog 連線佇列
timeout 逾時時間
一個空閒的客戶端多久會關閉 0關閉該功能 即永遠不斷開連接
tcp-keepalive 對客戶端的心跳偵測
設定為0即不會進行keepalive偵測
通用配置
daemonize 守護線程
預設 no 設定為yes是守護程式,可以後台啟動
pidfile 存放pid檔案的位置
loglevel 日記的級別
debug:會列印產生大量訊息,適用於開發/測試階段
verbose:包含很多不太有用的信息,但不像debug等級那麼混亂
notice:適度冗長,適用於生產環境
warning:僅記錄非常重要、關鍵的警告訊息
logfile 日誌檔名稱
預設是 logfile stdout
databases 設定資料庫的數量
預設資料庫數量是16 預設選擇資料庫是0
限制
maxclients 最大伺服器連線數
預設1W個連線,達到上限將拒絕連接
maxmemory
建議必須設置,否則,將記憶體佔滿,造成伺服器宕機
maxmemory-policy 記憶體淘汰策略
volatile-lru:使用LRU演算法移除key,只對設定過期時間的鍵;(最近最少使用)
volatile-ttl:移除那些TTL值最小的key,即那些最近要過期的key
volatile-random:在過期集合中移除隨機的key,只對設定了過期時間的鍵
allkeys-lru:在所有集合key中,使用LRU演算法移除key
allkeys-random:在所有集合key中,移除隨機的key
noeviction:不進行移除。針對寫入操作,只是傳回錯誤訊息
IO限制
io-threads-do-reads 是否開啟IO多線程
預設no,如果開啟,修改為yes
io-threads IO線程數量
4核的機器建議設定為 2 或 3 個線程,8 核的建議設定為 6 個線程,線程數一定要小於機器核數,盡量不超過8個
Redis關閉
單一實例關閉
redis-cli shutdown
多實例關閉
redis-cli -p 6379 shutdown
單線程 多路IO復用
Redis6.0引入了多線程
NoSQL資料庫
什麼是NoSQL資料庫
不遵循SQL標準
不支援ACID
原子性
一致性
隔離性
持久性
遠超SQL的效能
適用場景
對資料高併發的讀寫
海量資料的讀寫
對資料高擴展性的
不使用場景
需要事務支持
需要結構化查詢儲存,處理複雜關係,需要即席查詢
即席查詢:使用者根據自己的需求,彈性的選擇查詢條件,系統依使用者的選擇產生對應的統計報表
Redis五大數據類型
String類型
增
set <key><value>新增鍵值對
setex <key><過期時間><value> 設定鍵值的同時,設定過期時間,單位秒。
setnx <key><value>只有在 key 不存在時 設定 key 的值
mset <key1><value1><key2><value2>同時設定一個或多個 key-value對
查
get <key>查詢對應鍵值
strlen <key>獲得值的長度
mget <key1><key2><key3> 同時取得一個或多個 value
getrange <key><起始位置><結束位置> 獲得值的範圍,類似java中的substring,前包,後包
改
incr <key>
將 key 中儲存的數字值增加1
只能對數字值操作,如果為空,新增值為1
decr <key>
將 key 中儲存的數字值減1
只能對數字值操作,如果為空,新增值為-1
incrby / decrby <key><步長>將 key 中儲存的數字值增減。自訂步長。
刪
del key
特殊
append <key><value>將給定的<value> 追加到原值的結尾
getset <key><value>
以新換舊,設定了新值同時獲得舊值
商品編號、訂單號碼採用string的遞增數字特性產生。
List類型
增
lpush/rpush <key><value1><value2><value3> .... 從左邊/右邊插入一個或多個值。
查
lrange <key><start><stop>
依索引下標取得元素(從左到右)
lindex <key><index>依索引下標取得元素(由左至右)
llen <key>獲得清單長度
改
lset<key><index><value>將列表key下標為index的值替換成value
刪
lrem <key><n><value>從左邊刪除n個與value相等的元素(從左到右)
特殊
lpop/rpop <key>從左邊/右邊吐出一個數值。值在鍵在,值光鍵亡。
rpoplpush <key1> <key2>從<key1>列表右邊吐出一個值,插到<key2>列表左邊。
linsert <key> before <value><newvalue>在<value>的後面插入<newvalue>插入值
如好友列表,粉絲列表,訊息佇列,最新訊息排行等。 rpush方法就等於將訊息放入到佇列中,lpop/rpop就等於從佇列中拿去訊息進行消費
Hash類型
增
hset <key><field><value>給<key>集合中的 <field>鍵賦值<value>
hmset <key1><field1><value1><field2><value2>... 批次設定hash的值
查
hget <key1><field>從<key1>集合<field>取出 value
hmget <key1><field1> <field2>... 批次取得hash的值
hlen <key> 取得hash中field-value的數量
hexists<key1><field>查看哈希表 key 中,給定域 field 是否存在
改
hincrby <key><field><increment>為雜湊表 key 中的域 field 的值加上增量 (為負既是減去)
hsetnx <key><field><value>將雜湊表 key 中的域 field 的值設為 value ,當且僅當域 field 不存在
刪
hdel <key><field> 刪除<key>集合中指定<field>
特殊
hgetall <key> 取得中所有的field和value
hkeys <key>列出該hash集合的所有field
hvals <key>列出該hash集合的所有value
用一個物件來儲存使用者訊息,商品訊息,訂單資訊等等
ZSet類型
增
zadd <key><score1><member 1><score2><member 2>…
將一個或多個 member 元素及其 score 值加入到有序集 key 當中
查
zcard<key>傳回該有序集合的元素個數
zcount <key><min><max>統計此集合,分數區間內的元素個數
zrange <key><start><stop> [WITHSCORES] 從小到大排序
傳回有序集 key 中,下標在<start><stop>之間的元素
帶WITHSCORES,可以讓分數一起和值返回到結果集
zrevrange <key><start><stop> [WITHSCORES] 從大到小排序
zrangebyscore key min max [withscores] [limit offset count]
在傳回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序集成員依 score 值遞增(從小到大)次序排列。
zrevrangebyscore key max min [withscores] [limit offset count] (注意參數 是 大 小)
同上,改為由大到小排列。
zrank <key><member > 傳回有序集 key 中成員member 的排名。其中有序集成員依 score 值遞增(從小到大)順序排列。排名以 0 為底,也就是說, score 值最小的成員排名為 0 。
zrevrank <key><member > 取得成員依 score 值遞減(由大到小)排列的排名。
改
zincrby <key><increment><member > 為元素的score加上增量
刪
zrem <key><member >刪除該集合下,指定值的元素
特殊
排行榜:例如影片網站需要對使用者上傳的影片做排行榜.
Set類型
增
sadd <key><value1><value2> .....
將一個或多個 member 元素加入集合 key 中,已經存在的 member 元素將被忽略
查
smembers <key>取出該集合的所有值
scard<key>傳回該集合的元素個數
ismember<key> <value> 查詢集合中值是否已經存在
改
刪
srem <key><value1><value2> .... 刪除集合中的某個元素
特殊
spop <key>隨機從該集合中吐出一個值
smove <source><destination>value把集合中一個值從一個集合移到另一個集合
sinter <key1><key2>傳回兩個集合的交集元素。
sunion <key1><key2>傳回兩個集合的並集元素。
sdiff <key1><key2>傳回兩個集合的差集元素(key1中的,不包含key2中的)
投票記錄 共同好友、共同興趣、分類標籤