日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis-集群分片

發(fā)布時(shí)間:2025/6/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis-集群分片 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis 分區(qū)

??分區(qū)是分割數(shù)據(jù)到多個(gè)Redis實(shí)例的處理過程,因此每個(gè)實(shí)例只保存key的一個(gè)子集。

分區(qū)的優(yōu)勢(shì)

??1.通過利用多臺(tái)計(jì)算機(jī)內(nèi)存的和值,允許我們構(gòu)造更大的數(shù)據(jù)庫。

??2.通過多核和多臺(tái)計(jì)算機(jī),允許我們擴(kuò)展計(jì)算能力;通過多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)適配器,允許我們擴(kuò)展網(wǎng)絡(luò)帶寬。

分區(qū)的不足

??1.redis的一些特性在分區(qū)方面表現(xiàn)的不是很好:

??2.涉及多個(gè)key的操作通常是不被支持的。舉例來說,當(dāng)兩個(gè)set映射到不同的redis實(shí)例上時(shí),你就不能對(duì)這兩個(gè)set執(zhí)行交集操作。

??3.涉及多個(gè)key的redis事務(wù)不能使用。

??4.當(dāng)使用分區(qū)時(shí),數(shù)據(jù)處理較為復(fù)雜,比如你需要處理多個(gè)rdb/aof文件,并且從多個(gè)實(shí)例和主機(jī)備份持久化文件。

??5.增加或刪除容量也比較復(fù)雜。redis集群大多數(shù)支持在運(yùn)行時(shí)增加、刪除節(jié)點(diǎn)的透明數(shù)據(jù)平衡的能力,但是類似于客戶端分區(qū)、代理等其他系統(tǒng)則不支持這項(xiàng)特性。然而,一種叫做presharding的技術(shù)對(duì)此是有幫助的。

?

分區(qū)類型

??1.范圍分區(qū):最簡(jiǎn)單的分區(qū)方式是按范圍分區(qū),就是映射一定范圍的對(duì)象到特定的Redis實(shí)例,比如,ID從0到10000的用戶會(huì)保存到實(shí)例R0,ID從10001到 20000的用戶會(huì)保存到R1,以此類推。

??2.哈希分區(qū):另外一種分區(qū)方法是hash分區(qū)。這對(duì)任何key都適用,也無需是object_name:這種形式,像下面描述的一樣簡(jiǎn)單:用一個(gè)hash函數(shù)將key轉(zhuǎn)換為一個(gè)數(shù)字,比如使用crc32 hash函數(shù)。對(duì)key foobar執(zhí)行crc32(foobar)會(huì)輸出類似93024922的整數(shù)。對(duì)這個(gè)整數(shù)取模,將其轉(zhuǎn)化為0-3之間的數(shù)字,就可以將這個(gè)整數(shù)映射到4個(gè)Redis實(shí)例中的一個(gè)了。93024922 % 4 = 2,就是說key foobar應(yīng)該被存到R2實(shí)例中。注意:取模操作是取除的余數(shù),通常在多種編程語言中用%操作符實(shí)現(xiàn)。

?

下面我嘗試在本機(jī)(mac,其他系統(tǒng)思路一樣)上開啟3個(gè)redis-service來模擬多機(jī)器環(huán)境。

??1.去官網(wǎng)( https://redis.io/download )上把redis下載了

??2.解壓之后切cd到第一層目錄之后 執(zhí)行 mark install

??3.把redis.conf文件找到,在第一層目錄下

??4.執(zhí)行上面之后就能在src文件夾下找到redis-cli和redis-server其他的文件都不用

??5.ok 目前是這三個(gè)文件 redis-serve/redis-cli/redis.conf

??6.現(xiàn)在模擬三個(gè)機(jī)器(端口6379/6380/6381),只要對(duì)應(yīng)制作三個(gè)redis.conf就行,以redis.conf為基礎(chǔ)模板改??

??7.改三個(gè)地方(其他部分別動(dòng),用redis.conf當(dāng)模板),得到如下三個(gè)配置文件

?

??redis6379.conf

????port 6379

????pidfile /var/run/redis_6379.pid

????dbfilename dump-6379.rdb

??redis6380.conf

????port 6380

????pidfile /var/run/redis_6380.pid

????dbfilename dump-6380.rdb

??redis6381.conf

????port 6381

????pidfile /var/run/redis_6381.pid

????dbfilename dump-6381.rdb

?

??8.嘗試把這三個(gè)redis-service 啟動(dòng)起來

????redis-server redis6379.conf

????redis-server redis6380.conf

????redis-server redis6381.conf

??

??9.ps -a | grep redis-server 產(chǎn)看啟動(dòng)結(jié)果,如下:

????1892 ttys001 ???0:03.28 redis-server 127.0.0.1:6381

????1863 ttys003 ???0:03.74 redis-server 127.0.0.1:6379

????1864 ttys004 ???0:04.01 redis-server 127.0.0.1:6380

?

然后是開始分片測(cè)試,java的話直接用 JedisShardInfo/ShardedJedisPool 就行,我是用的node,但是沒找到相關(guān)的庫,我手寫了下,代碼如下:

//npm install redis const redis = require("redis");//開3個(gè)redis節(jié)點(diǎn),可以在一個(gè)服務(wù)器上,也可以分散多個(gè)服務(wù)器 //PS:如果是自己搭建集群,可以直接一個(gè)節(jié)點(diǎn),指向負(fù)載均衡的節(jié)點(diǎn)上 const client_machine0 = redis.createClient(6379); const client_machine1 = redis.createClient(6380); const client_machine2 = redis.createClient(6381); //造999個(gè)用戶請(qǐng)求出來 const quaryCount = 999; let cacheDatas = []; for (let index = 0; index < quaryCount; index++) { const nowData = { userId: index, cacheKey: 'k' + index, cacheValue: 'v' + index } cacheDatas.push(nowData); } //分片算法,主流式根據(jù)id分區(qū)域或者key hash出來 //我這按照id然后mod服務(wù)器個(gè)數(shù)做的 //這里可以自定義算法,一是考慮負(fù)載均衡,而是考慮擴(kuò)展,三是考慮machine死掉怎么救 //運(yùn)行起來的服務(wù),如果要臨時(shí)更改,一定一定一定要考慮周全。 //PS:如果是集群的話,這部分邏輯是需要寫在集群里,使用者只是訪問唯一的地址(通常是某個(gè)負(fù)載均衡地址)const getMachine = (quaryData) => { let redisMachine = null; switch (quaryData.userId % 3) { case 0: redisMachine = client_machine0; break; case 1: redisMachine = client_machine1; break; case 2: redisMachine = client_machine2; break; default: break; } return redisMachine; }//開始請(qǐng)求模擬 for (let index = 1; index < quaryCount; index++) { const cacheData = cacheDatas[index]; const machine = getMachine(cacheData); if(!machine){ console.log('Error: not find machine!!!'); }else{ machine.set(cacheData.cacheKey, cacheData.cacheValue, redis.print); } }//關(guān)閉所有連接 client_machine0.quit(); client_machine1.quit(); client_machine2.quit();

關(guān)于在線擴(kuò)容:Redis的作者提出了一種叫做presharding

??1.在新機(jī)器上啟動(dòng)好對(duì)應(yīng)端口的Redis實(shí)例。

??2.配置新端口為待遷移端口的從庫。

??3.待復(fù)制完成,與主庫完成同步后,切換所有客戶端配置到新的從庫的端口。

??4.配置從庫為新的主庫。

??5.移除老的端口實(shí)例。

??6.重復(fù)上述過程遷移好所有的端口到指定服務(wù)器上。

?

增加高可用的思路就是主從復(fù)制

基本命令

??成為別人的從庫: SLAVEOF host port

??取消成為別人的從庫 ?SLAVEOF NO ONE

主從配置更詳細(xì)的解釋跟更多細(xì)節(jié),看下這個(gè):

https://www.jianshu.com/p/ba3cc187da9c

?

?

總結(jié)

以上是生活随笔為你收集整理的redis-集群分片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。