Redis如何單機(jī)版集群

一:redis的啟動方式

1:在基礎(chǔ)篇已經(jīng)介紹過redis的安裝了

前端啟動reids后默認(rèn)會出現(xiàn)這樣情況,一旦啟動了就不能干別的事,需要一直保持redis才能正常使用


up_redis_01.png
2: 所以要改成后端啟動:編輯/usr/local/redis/redis.conf文件
把daemonize設(shè)置為yes
把/root/redis-3.0.0/redis.conf復(fù)制到/usr/local/redis/bin目錄下
up_redis_02.png
3: 后端啟動redis命令(切換到bin目錄下): ./bin/redis-server ./redis.conf
zhengcx:bin apple$ ls
dump.rdb        redis-check-rdb     redis-sentinel.conf
redis-benchmark     redis-cli       redis-server
redis-check-aof     redis-sentinel      redis.conf
zhengcx:bin apple$ ./redis-server redis.conf
26968:C 11 Aug 2020 14:39:47.465 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
26968:C 11 Aug 2020 14:39:47.465 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=26968, just started
26968:C 11 Aug 2020 14:39:47.465 # Configuration loaded
4: 后端關(guān)閉redis命令:./bin/redis-cli shutdown
5: 打開redis客戶端,做一些基本操作如下圖, 需要啟動redis才能做操作
./redis-cli
[root@localhost bin]# ./redis-cli 
默認(rèn)連接localhost運(yùn)行在6379端口的redis服務(wù)。
[root@localhost bin]# ./redis-cli -h 192.168.1.77 -p 6379
-h:連接的服務(wù)器的地址
-p:服務(wù)的端口號
關(guān)閉redis:[root@localhost bin]# ./redis-cli shutdown

二:Redis五種數(shù)據(jù)類型

Redis 字符串(String)
String:key-value(做緩存)
Redis中所有的數(shù)據(jù)都是字符串。命令不區(qū)分大小寫,key是區(qū)分大小寫的。Redis是單線程的。Redis中不適合保存內(nèi)容大的數(shù)據(jù)
set、get
127.0.0.1:6379> set name zcx
OK
127.0.0.1:6379> get name
"zcx"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
incr:加一(生成id)
Decr:減一
127.0.0.1:6379> SET page_view 20
OK
127.0.0.1:6379> INCR page_view
(integer) 21
127.0.0.1:6379>  GET page_view
"21"
127.0.0.1:6379> DECR page_view
(integer) 20
127.0.0.1:6379>  GET page_view
"20"
127.0.0.1:6379>
Redis 哈希(Hash)
Hash:key-fields-values(做緩存)
相當(dāng)于一個key對于一個map,map中還有key-value
使用hash對key進(jìn)行歸類。
Hset:向hash中添加內(nèi)容
Hget:從hash中取內(nèi)容
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HGET myhash field1
"foo"
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> HGET myhash field1
(nil)
127.0.0.1:6379> HDEL myhash field2
(integer) 0
127.0.0.1:6379>

我們設(shè)置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。

127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
127.0.0.1:6379>
Redis 列表(List)
127.0.0.1:6379> LPUSH runooblist redis
(integer) 1
127.0.0.1:6379> LPUSH runooblist mongodb
(integer) 2
127.0.0.1:6379> LPUSH runooblist mysql
(integer) 3
127.0.0.1:6379> LRANGE runooblist 0 10
1) "mysql"
2) "mongodb"
3) "redis"
127.0.0.1:6379>
Redis 集合(Set)
127.0.0.1:6379> SADD runoobset redis
(integer) 1
127.0.0.1:6379> SADD runoobset mongodb
(integer) 1
127.0.0.1:6379> SADD runoobset mysql
(integer) 1
127.0.0.1:6379> SMEMBERS runoobset
1) "redis"
2) "mysql"
3) "mongodb"
127.0.0.1:6379>
Redis 有序集合(sorted set)
127.0.0.1:6379> ZADD runoobsort 1 redis
(integer) 1
127.0.0.1:6379> ZADD runoobsort 2 mongodb
(integer) 1
127.0.0.1:6379> ZADD runoobsort 3 mysql
(integer) 1
127.0.0.1:6379> ZADD runoobsort 4 mysql
(integer) 0
127.0.0.1:6379> ZRANGE runoobsort 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
127.0.0.1:6379>

在以上實(shí)例中我們通過命令 ZADD 向 redis 的有序集合中添加了三個值并關(guān)聯(lián)上分?jǐn)?shù)。可用圖形界面工具查看redis數(shù)據(jù)redis desktop manager


up_redis_04.png

三:Redis的持久化方案

Redis的所有數(shù)據(jù)都是保存到內(nèi)存中的。
Rdb:快照形式,定期把內(nèi)存中當(dāng)前時刻的數(shù)據(jù)保存到磁盤。Redis默認(rèn)支持的持久化方案。
1. 如果15min內(nèi), 有 >=1 個值發(fā)生了改變, 則15min保存一次快照文件
2. 如果5min內(nèi), 有 >=10 個值發(fā)生了改變, 則5min會保存一次快照文件
3. 如果每分鐘都有 >=10000 個值發(fā)生改變, 則每分鐘都會保存到磁盤中
 按照這種方式, 還是有可能會丟失數(shù)據(jù)的, 但是丟失數(shù)據(jù)的量會小很多. 這個是redis默認(rèn)的持久化方案.
up_redis_05.png
aof形式:append only file。把所有對redis數(shù)據(jù)庫操作的命令,增刪改操作的命令。保存到文件中。數(shù)據(jù)庫恢復(fù)時把所有的命令執(zhí)行一遍即可
up_redis_06.png

四:Redis集群的搭建

(1)所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測失效時才生效.
(3)客戶端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個可用節(jié)點(diǎn)即可
(4)redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value
(5)Redis 集群中內(nèi)置了 16384 個哈希槽,當(dāng)需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結(jié)果,然后把結(jié)果對 16384 求余數(shù),這樣每個 key 都會對應(yīng)一個編號在 0-16383 之間的哈希槽,redis 會根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽映射到不同的節(jié)點(diǎn)
1. 進(jìn)入下載的目錄,因為剛才redis就是下載到該目錄了
cd Desktop/
#創(chuàng)建一個目錄
mkdir redisCluter
#進(jìn)入這個目錄
cd redisCluter/
#創(chuàng)建6個節(jié)點(diǎn)目錄
mkdir 6000 6001 6002 6003 6004 6005

zhengcx:redisCluter apple$ cd /Users/apple/Desktop/redisCluter
zhengcx:redisCluter apple$ mkdir 6000 6001 6002 6003 6004 6005
zhengcx:redisCluter apple$ 
2: 把剛才解壓的包更改一下配置
# 端口號,每個目錄都不同
port 6000
# 開啟集群模式
cluster-enabled yes
#節(jié)點(diǎn)超時實(shí)際,單位毫秒
cluster-node-timeout 5000
#集群內(nèi)部配置文件(默認(rèn)為 nodes-6379.conf)
cluster-config-file nodes.conf#
#啟動 AOFappendonly yes# 默認(rèn)是no,改成 yes,意思是是否要后臺啟動。
daemonize yes
3: redis-4.0.11目錄 執(zhí)行命令,redis啟動,然后在關(guān)閉他,我就簡單粗暴了
ps -ef|grep redis

找到redis進(jìn)程 ,kill -9 進(jìn)程id。這步啟動然后關(guān)閉,其目的是為生成一些文件


up_redis_08.png
4: 配置的最后一步是 把 端口號,(每個目錄都不同)port 6000 改成相應(yīng)目錄的端口號。也是剛才的步驟,進(jìn)入每一個redis.conf,修改端口
up_redis_09.png
5:啟動6個節(jié)點(diǎn)的redis

分別進(jìn)入每一個端口下的redis 執(zhí)行啟動命令,例如

cd /Users/apple/Downloads/redisCluter/6005/redis-4.0.11
redis-server redis.conf

6個節(jié)點(diǎn)都啟動成功后,自己看一下

ps -ef|grep redis
up_redis_10.png
6:關(guān)聯(lián)所有節(jié)點(diǎn)

剛剛我們已經(jīng)把所有的節(jié)點(diǎn)啟動了,但此時他們都是互相獨(dú)立的單個集群節(jié)點(diǎn)。要想實(shí)現(xiàn)集群,必須將他們關(guān)聯(lián)起來,隨便進(jìn)入一個節(jié)點(diǎn)的 redis-cli.

進(jìn)入6000節(jié)點(diǎn)的redis目錄中執(zhí)行命令,進(jìn)入控制臺
redis-cli -p 6000

依次執(zhí)行下面的命令


up_redis_11.png
7:分配 slot

redis Cluster 是由 16384 個 slot 組成的,那么我們需要將這些槽分散到這其中 3 個節(jié)點(diǎn)里(3 主 3 從)

進(jìn)入6002的redis目錄中執(zhí)行命令
zhengcx:redis-4.0.11 apple$ redis-cli -p 6000 cluster addslots {0..5461}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6001 cluster addslots {5462..10922}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6002 cluster addslots {10923..16383}
OK
zhengcx:redis-4.0.11 apple$

此時節(jié)點(diǎn)已經(jīng)分配好了。通過以下命令驗證:

redis-cli -p 6000 cluster nodes
up_redis_12.png
現(xiàn)在6個節(jié)點(diǎn)都是主節(jié)點(diǎn),并且給6000 、6001 、6002分配了槽slot
錯誤提示是說:slot插槽被占用了、這是因為 搭建集群前時,以前redis的舊數(shù)據(jù)和配置信息沒有清理干凈。

解決方案:用redis-cli 登錄到每個節(jié)點(diǎn)執(zhí)行 flushall 和 cluster reset 就可以了

zhengcx:redis-4.0.11 apple$ redis-cli -p 6001
127.0.0.1:6001> flushall
OK
127.0.0.1:6001> cluster reset
OK
127.0.0.1:6001>
8:主從復(fù)制
主節(jié)點(diǎn)已經(jīng)有了 slot,那么最后一步就是將主節(jié)點(diǎn)和從節(jié)點(diǎn)進(jìn)行關(guān)聯(lián),形成主從復(fù)制的關(guān)系。
命令如下:注意:需要在從節(jié)點(diǎn)的 cli 命令窗口關(guān)聯(lián)主節(jié)點(diǎn)。不能反著來
redis-cli -p 6000 cluster replicate 6003的NodeID
redis-cli -p 6001 cluster replicate 6004的NodeID
redis-cli -p 6002 cluster replicate 6005的NodeID
看到我框上的那一串 16 進(jìn)制字符串,其實(shí)就是后面對應(yīng)進(jìn)程節(jié)點(diǎn)的NodeId,這個是用處的,先放著。

然后分別設(shè)置6003、 6004 、6005節(jié)點(diǎn)的主庫,執(zhí)行下面命令,你們要對應(yīng)自己的NodeId。

這時候在執(zhí)行
redis-cli -p 6000 cluster nodes
up_redis_13.png

到這里三主三從已經(jīng)設(shè)置好了

8:設(shè)置下操作redis
6000節(jié)點(diǎn)數(shù)據(jù)只和6003 同步 6001和6004 6002和6005,這正是我前面設(shè)置的,當(dāng)時我也很懵,是不是數(shù)據(jù)沒有在其他5個節(jié)點(diǎn)同步呢? 錯,其實(shí)數(shù)據(jù)已經(jīng)在其他節(jié)點(diǎn)同步了,只是我們執(zhí)行 redis-cli -c -p 6001 這個命令進(jìn)入控制臺的時候set的數(shù)據(jù) 是在當(dāng)初我分配相應(yīng)的槽下加了數(shù)據(jù),而你去進(jìn)入其他節(jié)點(diǎn)get key時是取當(dāng)前節(jié)點(diǎn)下槽內(nèi)的數(shù)據(jù),而不是整個redis 的數(shù)據(jù),所以我們需要使用圖形化工具連接到我們的redis進(jìn)行查看
up_redis_14.png

五:告訴一個秘訣,有時候集群失敗報錯,重新來都不行,電腦重新啟動,重新來過就解決了。搞了半天時間。redis集群到這里結(jié)束了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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