Redis學(xué)習(xí)筆記

1 服務(wù)端和客戶端的使用

1.1 服務(wù)端使用

1.1.1 啟動(dòng)

  1. 前臺(tái)啟動(dòng)
    redis-server
  2. 后臺(tái)啟動(dòng)
    • 需要修改 redis.conf 配置文件
      daemonize yes //表示開啟后臺(tái)守護(hù)
      bind 192.168.2.101 // 綁定IP
    • 啟動(dòng)命令
      redis-server /**/redis.conf
  3. docker方式啟動(dòng)
    docker run -d -p 6379:6379 redis(或redis的image id)

1.1.2 使用客戶端進(jìn)行關(guān)閉的方式

  1. 客戶端連接時(shí)關(guān)閉
    redis-cli shutdown
  2. 客戶端連接后關(guān)閉
    shutdown

1.2 客戶端使用

1.2.1 連接redis服務(wù)

  1. redis-cli
    redis-cli -h 192.168.2.101 -p 6379
    -h:即redis.conf中bind的值,默認(rèn)127.0.0.1
    -p:指定端口,默認(rèn)就是6379
  2. docker
    docker exec -it redis的ContainerId redis-cli
  3. 測(cè)試連接
    ping //若返回pone則表示連接無誤

1.2.2 退出客戶端

輸入quit即可

2 數(shù)據(jù)類型

2.1 String:字符串

  • 應(yīng)用場(chǎng)景很廣泛,比如可以利用其自增屬性,實(shí)現(xiàn)主鍵自增功能。

2.1.1 設(shè)置值

  1. 單個(gè)設(shè)置
    語法:set key value
  1. 批量設(shè)置
    語法:mset key1 value1 key2 value2

2.1.2. 獲取值

  1. 單個(gè)獲取
    語法:get key
  1. 批量獲取
    語法:mget key1 key2

2.1.3 獲取并設(shè)置值(先獲取舊值再設(shè)置新值)

語法:getset key newValue

2.1.4 刪除key

語法:del key1 key2 ...
返回:成功刪除的個(gè)數(shù)

2.1.5 自增

語法1:incr key //默認(rèn)增長量為1
語法2:incrby key increment //自定義每次增長量
注意:如果key不存在則自動(dòng)創(chuàng)建,且初始值為1

2.1.6 自減

語法1:decr key //默認(rèn)減少量為1
語法2:decrby key decrement //自定義減少量

2.1.7 追加拼接

語法:append key value
返回:拼接后value的長度

2.1.8 獲取字符串長度

語法:strlen key

2.2 Hash:哈希

  • 哈希類型,為字段(key)設(shè)置屬性(field)
  • 可以用來存儲(chǔ)一個(gè)對(duì)象,解決了使用String類型保存對(duì)象不便的問題。

2.2.1 設(shè)置字段屬性

語法1:hset key field fieldValue //單個(gè)設(shè)置
語法2:hmset key field1 field1Value field2 field2Value ...

2.2.2 獲取字段屬性

語法1:hget key field //單個(gè)獲取
語法2:hmget key field1 field2 ... //批量獲取

2.2.3 刪除字段屬性

語法:hdel key field1 field2 ...

2.2.4 字段屬性增加

語法:hincrby key field fieldIncrement
注意:沒有默認(rèn)自增1;也沒有減少計(jì)算,但是可以用增加一個(gè)負(fù)數(shù)來實(shí)現(xiàn)

2.2.5 獲取所有字段屬性

語法:hkeys key

2.2.6 獲取所有字段屬性值

語法:hvals key

2.2.7 判斷某個(gè)屬性是否存在

語法:hexists key field
返回:存在1,不存在0

2.2.8 獲取某個(gè)字段(key)的屬性(field)的個(gè)數(shù)

語法:hlen key

2.3 List:列表

  • 列表類型采用的是可以雙向操作的鏈表來存儲(chǔ)數(shù)據(jù)
  • 它是有序的,有序的實(shí)現(xiàn)方式是通過索引下標(biāo)
  • 應(yīng)用場(chǎng)景有評(píng)論、消息隊(duì)列、時(shí)間軸等

2.3.1 添加數(shù)據(jù)

語法1:lpush key value1 value2 ... //從左側(cè)添加
語法2:rpush key value1 value2 ... //從右側(cè)添加

語法3:linsert key before/after pivot(中心點(diǎn)) value
解釋:在從左往右第一個(gè)值為pivot的數(shù)據(jù)的before/after插入數(shù)據(jù)value

2.3.2 獲取數(shù)據(jù)

語法1:lrange key start stop
解釋:start和stop為列表的索引,從0開始,-1表示最后一個(gè)

語法2:lindex key index
解釋:獲取指定索引的數(shù)據(jù)

2.3.3 刪除數(shù)據(jù)

語法1:lpop key //移除最左邊數(shù)據(jù)
語法2:rpop key //移除最右邊數(shù)據(jù)
返回:被移除的數(shù)據(jù)

語法3:lrem key count value
返回:成功刪除的個(gè)數(shù)
解釋:指要?jiǎng)h除count個(gè)值等于value的數(shù)據(jù),count大于0,從左往右刪;count小于0則從右往左刪

2.3.4 獲取長度

語法:llen key

2.3.5 削減列表

語法:ltrim key start stop
解釋:start和stop為索引,表示該列表只保留start-stop的數(shù)據(jù)

2.3.6 數(shù)據(jù)轉(zhuǎn)移

語法:rpoplpush sourceList destinationList
解釋:將source列表右邊彈出一個(gè)數(shù)據(jù),以lpush的方式移入到destination列表

2.4 Set:集合

  • 特點(diǎn)是唯一、無序
  • 應(yīng)用場(chǎng)景有標(biāo)簽、社交等

2.4.1 添加成員

語法:sadd key member1 member2 ...

2.4.2 刪除成員

語法1:srem key member1 member2 ... //刪除指定成員

語法2:spop key [count] //隨機(jī)彈出count個(gè),count默認(rèn)為1

2.4.3 獲取集合成員

語法:smembers key

2.4.4 判斷成員是否在集合中

語法:sismember key member
返回:存在則返回1;不存在則返回0

2.4.5 集合運(yùn)算

  1. 并集運(yùn)算
    語法:sunion key1 key2 ...
  2. 交集運(yùn)算
    語法:sinter key1 key2 ...
  3. 差集運(yùn)算
    語法:sdiff key1 key2 ...

2.4.6 集合長度(成員個(gè)數(shù))

語法:scard key

2.5 SortedSet:有序集合

  • 特點(diǎn)是唯一、有序
  • 又叫 zset
  • 有序的實(shí)現(xiàn)方式是通過分值,即為每個(gè)元素設(shè)置分?jǐn)?shù),根據(jù)分?jǐn)?shù)大小實(shí)現(xiàn)排序
  • 應(yīng)用場(chǎng)景有社交、排行榜系統(tǒng)、商品篩選等

2.5.1 添加成員

語法1:zadd key score1 member1 score2 member2 ...
注意:如果成員重復(fù)則后面的覆蓋前面的,且之后的返回成功數(shù)為0,即不計(jì)入成功數(shù),因?yàn)榈谝淮翁砑訒r(shí)已經(jīng)計(jì)入了

2.5.2 查看成員

語法1:zrange key start stop [WITHSCORES]
語法2:zrevrange key start stop [WITHSCORES]
解釋:zrange表示按分?jǐn)?shù)從低到高輸出指定范圍的成員,WITHSCORES表示同時(shí)輸出分?jǐn)?shù),zrevrange表示倒序,即分?jǐn)?shù)從高到低輸出

語法3:zrangebyscore key minScore maxScore [withscores] [limit offset count]
例如:zrangebyscore math 72 90 limit 0 2
解釋:輸出 [72, 90] 分之間的兩名成員

2.5.3 查看成員分?jǐn)?shù)

語法:zscore key member
注意:一次只能查看一個(gè)成員

2.5.4 查看成員排名(即成員位置)

語法1:zrank key member
語法2:zrevrank key member //降序排名

2.5.5 刪除成員

語法1:zrem key member1 member2 ...

語法2:zremrangebyscore key min max
例如:zremrangebyscore math 70 80
解釋:刪除math中 [70, 90] 分之間的成員

2.5.5 給成員添加分?jǐn)?shù)

語法:zincrby key increment member

2.5.6 查看成員個(gè)數(shù)

語法:zcard key

3 通用命令

3.1 key的匹配查找

語法:keys pattern

  • keys *:獲取所有的key
  • keys n*:獲取以n開始的key
  • keys *n*:獲取包含n的key

3.2 判斷某個(gè)key是否存在

語法:exists key
返回:存在1,不存在0

3.3 查看key的數(shù)據(jù)類型

語法:type key

3.4 對(duì)key進(jìn)行重命名

語法:rename key

3.5 設(shè)置key的生存時(shí)間

  1. 設(shè)置生存時(shí)間
    語法:expire key second
  2. 查看生存時(shí)間
    語法:ttl key
    返回:-1表示永久;-2表示已清除
  3. 清除生存時(shí)間的設(shè)置
    語法:persist key

3.6 清空緩存

語法:flushall

4 redis的持久化方式和持久化策略

4.1 概述

redis是一個(gè)內(nèi)存數(shù)據(jù)庫,所有的數(shù)據(jù)都保存在內(nèi)存中,這樣就存在一個(gè)風(fēng)險(xiǎn),那就是一旦redis異常退出,數(shù)據(jù)將不復(fù)存在。對(duì)此redis有兩種數(shù)據(jù)持久化方式(RDB和AOF),用于將內(nèi)存中的數(shù)據(jù)保存到磁盤文件中。

  • 根據(jù)兩種持久化方式的組合,redis有4種持久化策略
  1. RDB(數(shù)據(jù)快照模式)
    定期存儲(chǔ),保存的是數(shù)據(jù)本身
  2. AOF(追加模式)
    每次修改數(shù)據(jù)時(shí),同步到硬盤,保存的是數(shù)據(jù)變更記錄
  3. 同時(shí)關(guān)閉RDB和AOF
    當(dāng)希望將數(shù)據(jù)只保存在內(nèi)存中時(shí),可以將這兩個(gè)策略都關(guān)閉
  4. 同時(shí)開啟RDB和AOF【推薦】
    當(dāng)redis重啟的時(shí)候,AOF文件會(huì)用于重建原始數(shù)據(jù)(AOF優(yōu)先級(jí)高)

4.2 RDB:redis database

  • 默認(rèn)的持久化方式
  • RDB定時(shí)備份內(nèi)存中的數(shù)據(jù),服務(wù)啟動(dòng)的時(shí)候可以從RDB中恢復(fù)數(shù)據(jù)集

4.2.1 優(yōu)點(diǎn)

  1. 適用于備份,方便恢復(fù)不同版本的數(shù)據(jù)
  2. 適用于容災(zāi)恢復(fù),備份文件可以在其他服務(wù)器恢復(fù)
  3. 數(shù)據(jù)保存比AOF快
  4. 最大化Redis的性能,備份的時(shí)候是啟動(dòng)子進(jìn)程進(jìn)行備份,父進(jìn)程不需要執(zhí)行IO操作

4.2.2 缺點(diǎn)

存在數(shù)據(jù)丟失的風(fēng)險(xiǎn),因?yàn)槿绻鸕edis異常關(guān)閉,由于到上個(gè)保存點(diǎn)的數(shù)據(jù)未來得及備份,故而造成這部分?jǐn)?shù)據(jù)丟失

4.2.3 觸發(fā)RDB備份

4.2.3.1 手動(dòng)觸發(fā)

指通過在客戶端中發(fā)送一條命令的方式,讓服務(wù)端執(zhí)行RDB備份,生成備份文件,備份命令有兩種:

  1. 同步命令
    save命令,這種方式會(huì)阻塞服務(wù)端當(dāng)前的服務(wù),使服務(wù)端暫時(shí)去執(zhí)行備份命令,期間服務(wù)端不再接受客戶端的請(qǐng)求,故而一般不會(huì)去使用
  2. 異步命令
    bgsave命令,通過fork一個(gè)子進(jìn)程去執(zhí)行備份命令,服務(wù)端主進(jìn)程依舊可以正常工作

4.2.3.2 自動(dòng)觸發(fā)

指的是通過在redis.conf中配置相應(yīng)的備份觸發(fā)策略,使達(dá)到策略中的條件時(shí),服務(wù)端自動(dòng)調(diào)用bgsave命令實(shí)現(xiàn)備份。
相關(guān)配置項(xiàng)有:

  1. save
    save 900 1
    save 300 10
    save 60 10000
    表示如果900秒內(nèi)至少有1個(gè)key發(fā)生改變時(shí),觸發(fā)bgsave的調(diào)用
  2. dbfilename
    dbfilename dump.rdb
    指定備份文件的文件名,默認(rèn)為dump.rdb
  3. rdbcompression
    rdbcompression yes
    是否啟用壓縮,默認(rèn)啟用,此時(shí)在rdb備份文件生成時(shí),如果遇到字符串對(duì)象且該字符串對(duì)象占用字節(jié)數(shù)超過20,則對(duì)該字符串采用LZF算法進(jìn)行壓縮
  4. stop-writes-on-bgsave-error
    stop-writes-on-bgsave-error yes
    默認(rèn)開啟,表示調(diào)用gbsave過程中遇到錯(cuò)誤時(shí),將停止備份
  5. dir
    dir ./
    配置備份文件的存放路徑
  6. rdbchecknum
    rdbchecksum yes
    是否使用CRC64校驗(yàn)算法檢驗(yàn)RDB文件是否有損壞,默認(rèn)開啟,關(guān)閉可提高性能

4.3 AOF:appendonly file

基于命令操作日志,指的是當(dāng)有命令更新命令,如set key value,del key等,就會(huì)將該命令保存到AOF緩存區(qū),然后在配置的時(shí)間節(jié)點(diǎn)寫入到磁盤文件中

4.3.1 優(yōu)點(diǎn)

  1. 數(shù)據(jù)可靠性比RDB的更好,適用于做完整的數(shù)據(jù)備份
  2. 一些誤操作可以直接在AOF備份文件中進(jìn)行回退

4.3.2 缺點(diǎn)

備份文件較RDB的要大,恢復(fù)效率不及RDB,不適用于快速可用的容災(zāi)恢復(fù)

4.3.3 AOF啟用


serverCore函數(shù)
在redis中,常規(guī)操作由serverCore函數(shù)實(shí)現(xiàn),而它的每一次調(diào)用,都會(huì)嘗試進(jìn)行 AOF 或 RDB 持久化操作
延遲寫 和 fsync 函數(shù)
當(dāng)數(shù)據(jù)寫入文件時(shí),系統(tǒng)內(nèi)核(UNIX)通常先將該數(shù)據(jù)復(fù)制到一個(gè)緩沖區(qū)中,并且如果該緩沖區(qū)尚未寫滿,則先不將其放到輸出隊(duì)列,只有等到該緩沖區(qū)寫滿,或者內(nèi)核需要重用該緩存區(qū)以便存放其他磁盤塊數(shù)據(jù)時(shí),再將其放到輸出隊(duì)列,然后再等到該數(shù)據(jù)到達(dá)隊(duì)首時(shí),才進(jìn)行真正的I/O操作,這就是寫延遲 -- delayed write。
fsync函數(shù)的特點(diǎn)是,可以等待數(shù)據(jù)真正寫入到文件中。


以下為啟用AOF策略的相關(guān)配置項(xiàng)(均在redis.conf中):

  1. appendonly
    appendonly no
    表示是否開啟AOF策略,默認(rèn)不開啟
  2. appendfliename
    appendfilename "appendonly.aof"
    生成的aof備份文件的文件名,默認(rèn)是appendonly.aof
  3. hz
    hz 10
    hz參數(shù)可以用來指定每秒中執(zhí)行serverCore的次數(shù),默認(rèn)每秒執(zhí)行10次
  4. appendfsync
    appendfsync everysec
    當(dāng)有一個(gè)key更新命令時(shí),首先將該命令日志寫入到AOF緩存區(qū),再將緩存區(qū)中的內(nèi)容寫入到AOF備份文件中,appendfsync指定的是寫入備份文件的頻率以及寫入的方式,它有三個(gè)選項(xiàng):
    • everysec
      指的是每隔1秒,就將AOF緩存區(qū)的操作命令日志寫入到AOF文件中,寫入時(shí)會(huì)調(diào)用fsync函數(shù),即完成磁盤同步
    • always
      指每次serverCore執(zhí)行時(shí),就刷新AOF緩存區(qū)一次,并且每次寫入AOF時(shí)都調(diào)用fsync,完成磁盤同步,不建議,因?yàn)樗窒男阅?/strong>
    • no
      不做控制,由操作系統(tǒng)決定什么時(shí)候刷新緩沖區(qū),并且每次寫入AOF時(shí)不調(diào)用fsync,由系統(tǒng)自動(dòng)進(jìn)行磁盤同步

4.3.4 AOF重寫

4.3.4.1 重寫的作用

可以對(duì)AOF備份文件進(jìn)行優(yōu)化和壓縮,比如有以下更新key的操作命令:
set key1 value1
set key 2 value2
del key1
經(jīng)過重寫,只會(huì)保留:
set key 2 value2

4.3.4.2 重寫的說明

  • 重寫的執(zhí)行也是通過fork一個(gè)子進(jìn)程進(jìn)行的

4.3.4.3 重寫的觸發(fā)

4.3.4.3.1 手動(dòng)觸發(fā)

通過在客戶端中發(fā)送bgrewriteaof命令,就可以觸發(fā)重寫

4.3.4.3.2 自動(dòng)觸發(fā)

指在redis.conf中進(jìn)行觸發(fā)重寫條件的相關(guān)配置,當(dāng)達(dá)到重寫觸發(fā)的條件時(shí),服務(wù)端將進(jìn)行重寫。
以下是觸發(fā)重寫的相關(guān)配置項(xiàng):

  1. no-appendfsync-on-rewrite
    no-appendfsync-on-rewrite no
    有一種情況,主進(jìn)程在執(zhí)行將AOF緩沖區(qū)操作命令刷到AOF文件的過程時(shí),同時(shí)還有一個(gè)AOF重寫命令被調(diào)用了,而二者均需要對(duì)AOF文件進(jìn)行寫操作,且如果重寫命令先進(jìn)行,這樣主進(jìn)程就出現(xiàn)了阻塞的情況。
    no-appendfsync-on-rewrite參數(shù)的作用就是為了解決這種情況,他的默認(rèn)取值是no,表示當(dāng)進(jìn)行重寫時(shí)依舊要進(jìn)行appendfsync,即主進(jìn)程形成阻塞;當(dāng)取值yes時(shí),則相當(dāng)于appendfsync的取值時(shí)no,即主進(jìn)程寫入AOF文件時(shí),不調(diào)用fsync函數(shù),只是將數(shù)據(jù)放入到緩沖區(qū),這樣就不存在阻塞的情況了。
    設(shè)置為yes時(shí),如果redis宕機(jī),則尚未真正執(zhí)行I/O寫入到AOF文件的那些緩沖區(qū)的數(shù)據(jù)都將丟失,在linux系統(tǒng)的默認(rèn)設(shè)置下,最多會(huì)丟失30秒的數(shù)據(jù)。
  2. auto-aof-rewrite-percentage
    auto-aof-rewrite-percentage 100
    表示當(dāng)AOF文件相較于上一版本AOF文件大小的百分比達(dá)到多少時(shí)將觸發(fā)AOF重寫,如auto-aof-rewrite-percentage 選項(xiàng)配置為 100,上一版本的 aof 文件大小為 100M,那么當(dāng)AOF文件達(dá)到 200M 的時(shí)候,觸發(fā) AOF 重寫
  3. auto-aof-rewrite-min-size
    auto-aof-rewrite-min-size 64mb
    當(dāng)AOF文件超過64M(默認(rèn))時(shí),將進(jìn)行重寫

5 主從模式

指一個(gè)主數(shù)據(jù)庫Master,設(shè)置多個(gè)從數(shù)據(jù)庫Slave的主從組合方式 [注:Slave還可以繼續(xù)擁有自己的Slave],以此可以實(shí)現(xiàn)讀寫分離、哨兵模式[當(dāng)Master宕機(jī),Slave可以成為新的Master]等功能

5.1 主從搭建

可以使用不同的機(jī)器,通過ip區(qū)分主從;也可以使用同一個(gè)機(jī)器,通過port區(qū)分主從,比如使用后者方式進(jìn)行搭建,只需要對(duì)后者配置上slaveof配置項(xiàng),指明他的Master機(jī)器的ip和port即可,其中slaveof的設(shè)置可以直接在slave的redis-cli中直接指定,但是這種方式是臨時(shí)性的,重啟slave時(shí)失效,另外一種就是在slave的redis.conf中進(jìn)行配置,永久有效。

5.2 讀寫分離

指在Redis的主從節(jié)點(diǎn)中,Master可讀可寫,而Slave只讀不可寫,所有的寫只能在Master中進(jìn)行,適用于少量寫,大量讀的場(chǎng)景。

圖中左邊6380端口為slave節(jié)點(diǎn),進(jìn)行寫操作時(shí)直接拋出只讀警告

過期key的處理
slave不會(huì)對(duì)key進(jìn)行過期處理,master才會(huì),當(dāng)master對(duì)某個(gè)key進(jìn)行過期清除時(shí),將發(fā)送一條del命令給slave,以模擬key過期

5.3 主從復(fù)制

指的是為了保證數(shù)據(jù)庫的數(shù)據(jù)的一致性,需要將Master的數(shù)據(jù)復(fù)制到Slave中,其中復(fù)制數(shù)據(jù)的方式又分為全量同步和增量同步兩種

5.3.1 全量同步

全量同步一般發(fā)生在Slave初始化階段,具體步驟如下

  1. slave連接上master后,會(huì)發(fā)送一條psync (舊版本為sync)指令給master
  2. master接收到psync指令后,會(huì)執(zhí)行bgsave命令生成rdb文件,同時(shí)將從[master]客戶端中接收到的所有的命令,緩存在內(nèi)存中。
  3. 待bgsave命令執(zhí)行完成,master向所有的slave發(fā)送rdb快照
  4. 在接收到快照之前,slave一直使用舊數(shù)據(jù)提供服務(wù),此時(shí)將丟棄所有的舊數(shù)據(jù),開始載入收到的快照
  5. master將快照發(fā)送完畢之后,開始將緩存的寫命令發(fā)送給slave
  6. slave完成快照的載入后,開始接收命令請(qǐng)求,并執(zhí)行來自master緩沖區(qū)的寫命令

5.3.2 增量同步

  • 增量同步指的是Slave初始化完成后,開始正常工作時(shí)將Master的寫操作進(jìn)行同步的過程。
  • 同步過程主要就是當(dāng)Master每執(zhí)行一條寫操作命令,就會(huì)將該寫命令發(fā)送給Slave,Slave接收并執(zhí)行該寫命令。

5.3.3 斷點(diǎn)續(xù)傳

  • 從redis2.8版本開始支持,指的是在主從復(fù)制過程中,如果slave和master發(fā)生異常斷開連接,再次連接時(shí)將從上次復(fù)制的斷點(diǎn)開始繼續(xù)復(fù)制,而不是從頭開始復(fù)制。
  • 原理
    在主從復(fù)制中,Master會(huì)在內(nèi)存中維護(hù)一個(gè)backlog,同時(shí)Master和Slave的內(nèi)存中都維護(hù)著一個(gè)復(fù)制偏移量 replication offset 和 master run id。當(dāng)連接斷開重連時(shí),Master會(huì)檢測(cè)PSYNC中的master run id和replication offset,如果二者的id相同,且offset在有效范圍內(nèi),則開始斷點(diǎn)續(xù)傳。
    由于id和offset都保存在內(nèi)存中,所以無論Master還是Slave,如果是直接宕機(jī),而非單純的網(wǎng)絡(luò)中斷,則將無法斷點(diǎn)續(xù)傳,只能進(jìn)行全量同步。

5.3.4 無磁盤化復(fù)制

指的是在全量復(fù)制過程中,對(duì)于rdb的創(chuàng)建,直接在磁盤中進(jìn)行,然后發(fā)送給slave,而無需落地磁盤后在發(fā)送給slave,相關(guān)配置項(xiàng)如下:

  1. repl-diskless-sync
    repl-diskless-sync no
    是否開啟,默認(rèn)不開啟
  2. repl-diskless-sync-delay
    repl-diskless-sync-delay 5
    默認(rèn)等待5秒后才開始復(fù)制,為了確保slave完成連接,即slave端能夠進(jìn)行到待傳送的目標(biāo)隊(duì)列中

6 集群架構(gòu)

指多個(gè)主從模式結(jié)合起來,組成的彼此能夠互相通信的集群,各節(jié)點(diǎn)分布式部署,可以解決單點(diǎn)故障、實(shí)現(xiàn)負(fù)載均衡

6.1 集群搭建

有三臺(tái)機(jī)器bigdata1、bigdata2、bigdata3,每臺(tái)機(jī)器上有6379和6380兩個(gè)redis

6.1.1 配置redis.conf

  1. cluster-enabled yes
    表示開啟集群
  2. cluster-node-timeout 15000
    網(wǎng)絡(luò)抖動(dòng)配置項(xiàng),生產(chǎn)環(huán)境中,網(wǎng)絡(luò)可能會(huì)常出現(xiàn)問題,該配置項(xiàng)表示這段時(shí)間一直無法訪問,則該節(jié)點(diǎn)fail,進(jìn)行主從切換,如果未設(shè)置此配置項(xiàng),可能會(huì)造成頻繁的主從切換
  3. cluster-config-file bigdata1-6379
    集群中每個(gè)結(jié)點(diǎn)都會(huì)生成一個(gè)自己的集群配置文件,這個(gè)文件最好每個(gè)redis都不一樣
  4. slaveof
    將該配置項(xiàng)注釋,由redis自動(dòng)分配master和slave節(jié)點(diǎn)

6.1.2 環(huán)境準(zhǔn)備

  1. redis-tri.rb
    在src目錄下,是redis的集群管理器工具,可以使用它啟停、管理集群
  2. ruby 和 rubygems
    redis-tri.rb是由ruby語言編寫,使用它需要先要安裝ruby和rubygems(ruby通信接口):
    sudo yum -y install ruby
    sudo yum -y install rubygems
    可使用ruby -v檢查是否安裝成功
  3. redis.gem
    讓集群管理器和redis進(jìn)行通信,還需要安裝redis驅(qū)動(dòng) redis-3.2.1.gem:
    gem install redis-3.2.1.gem
    這種方式需要提前準(zhǔn)備好驅(qū)動(dòng),也可以直接在線安裝:gem install redis,但它要求ruby在2.2.2版本以上。
可以單獨(dú)創(chuàng)建cluster目錄方便管理,并將src/redis-trib.rb復(fù)制過來

6.1.3 清空數(shù)據(jù)

  1. 啟動(dòng)所有的redis
  2. 進(jìn)入redis-cli,執(zhí)行命令:
    flushall
    全新安裝的redis可以跳過,如果是復(fù)制于其他已經(jīng)使用過的redis,可能存在rdb文件,如果未刪除該rdb直接啟動(dòng),則啟動(dòng)的redis中有緩存數(shù)據(jù)存在,而cluster的創(chuàng)建要求所有節(jié)點(diǎn)都是空的不能有數(shù)據(jù),所以必須先進(jìn)行上面的清除操作

6.1.4 啟動(dòng)集群

./redis-trib.rb create --replicas 1 192.168.2.101:6379 192.168.2.101:6380 192.168.2.102:6379 192.168.2.102:6380 192.168.2.103:6379 192.168.2.103:6380

  1. --replicas 1 表示每個(gè)master中slave的個(gè)數(shù),后面有6個(gè)cluster節(jié)點(diǎn),將會(huì)自動(dòng)生成3個(gè)master和3個(gè)slave
  2. cluster node必須要使用ip的形式,不能直接使用域名,否則可能會(huì)報(bào)錯(cuò)
啟動(dòng)成功截圖

6.1.5 驗(yàn)證

  1. 連接集群
    redis-cli -h (任一cluster node的ip) -p port -c
    -c:表示連接到集群
  2. 查看集群信息
    cluster info
  3. 查看集群節(jié)點(diǎn)
    cluster nodes

6.2 負(fù)載均衡:插槽機(jī)制

redis cluster的負(fù)載均衡是通過插槽機(jī)制實(shí)現(xiàn)的

6.2.1 插槽計(jì)算

對(duì)key的有效部分進(jìn)行CRC16算法計(jì)算出對(duì)應(yīng)的哈希值,再將哈希值對(duì)16834進(jìn)行取余,最終的結(jié)果就是這個(gè)key的插槽值

有效部分

  • 指的是key中如果有{},則{}中的內(nèi)容就是有效部分,否則整個(gè)key就是有效部分
  • 比如:key = {hello}world,有效部分就是hello
  • 比如:key = helloworld,有效部分就是helloworld

6.2.2 插槽分配

  • 由插槽值計(jì)算可知,集群的插槽數(shù)有 16384(0 ~ 16383) 個(gè),每個(gè)redis負(fù)責(zé)處理一部分的插槽。
  • 可以使用redis-trib.rb將未分配的插槽分給節(jié)點(diǎn),或者將已經(jīng)分配的插槽轉(zhuǎn)移到指定節(jié)點(diǎn)(插槽中的數(shù)據(jù)同時(shí)也會(huì)被轉(zhuǎn)移到該指定節(jié)點(diǎn))。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容