Redis 分區(qū)
分區(qū)是分割數(shù)據(jù)到多個Redis實(shí)例的處理過程喊熟,因此每個實(shí)例只保存key的一個子集。
分區(qū)的優(yōu)勢
- 通過利用多臺計(jì)算機(jī)內(nèi)存的和值胧奔,允許我們構(gòu)造更大的數(shù)據(jù)庫逊移。
- 通過多核和多臺計(jì)算機(jī),允許我們擴(kuò)展計(jì)算能力龙填;通過多臺計(jì)算機(jī)和網(wǎng)絡(luò)適配器胳泉,允許我們擴(kuò)展網(wǎng)絡(luò)帶寬。
分區(qū)的不足
redis的一些特性在分區(qū)方面表現(xiàn)的不是很好:
- 涉及多個key的操作通常是不被支持的岩遗。舉例來說扇商,當(dāng)兩個set映射到不同的redis實(shí)例上時,你就不能對這兩個set執(zhí)行交集操作宿礁。
- 涉及多個key的redis事務(wù)不能使用案铺。
- 當(dāng)使用分區(qū)時,數(shù)據(jù)處理較為復(fù)雜梆靖,比如你需要處理多個rdb/aof文件控汉,并且從多個實(shí)例和主機(jī)備份持久化文件。
- 增加或刪除容量也比較復(fù)雜返吻。redis集群大多數(shù)支持在運(yùn)行時增加姑子、刪除節(jié)點(diǎn)的透明數(shù)據(jù)平衡的能力,但是類似于客戶端分區(qū)测僵、代理等其他系統(tǒng)則不支持這項(xiàng)特性街佑。然而,一種叫做presharding的技術(shù)對此是有幫助的捍靠。
分區(qū)類型
Redis 有兩種類型分區(qū)沐旨。 假設(shè)有4個Redis實(shí)例 R0,R1榨婆,R2磁携,R3,和類似user:1良风,user:2這樣的表示用戶的多個key颜武,對既定的key有多種不同方式來選擇這個key存放在哪個實(shí)例中。也就是說拖吼,有不同的系統(tǒng)來映射某個key到某個Redis服務(wù)。
范圍分區(qū)
最簡單的分區(qū)方式是按范圍分區(qū)这吻,就是映射一定范圍的對象到特定的Redis實(shí)例吊档。
比如,ID從0到10000的用戶會保存到實(shí)例R0唾糯,ID從10001到 20000的用戶會保存到R1怠硼,以此類推鬼贱。
這種方式是可行的,并且在實(shí)際中使用香璃,不足就是要有一個區(qū)間范圍到實(shí)例的映射表这难。這個表要被管理,同時還需要各 種對象的映射表葡秒,通常對Redis來說并非是好的方法姻乓。
哈希分區(qū)
另外一種分區(qū)方法是hash分區(qū)。這對任何key都適用眯牧,也無需是object_name:這種形式蹋岩,像下面描述的一樣簡單:
- 用一個hash函數(shù)將key轉(zhuǎn)換為一個數(shù)字,比如使用crc32 hash函數(shù)学少。對key foobar執(zhí)行crc32(foobar)會輸出類似93024922的整數(shù)剪个。
- 對這個整數(shù)取模,將其轉(zhuǎn)化為0-3之間的數(shù)字版确,就可以將這個整數(shù)映射到4個Redis實(shí)例中的一個了扣囊。93024922 % 4 = 2,就是說key foobar應(yīng)該被存到R2實(shí)例中绒疗。注意:取模操作是取除的余數(shù)侵歇,通常在多種編程語言中用%操作符實(shí)現(xiàn)。
多數(shù)據(jù)庫實(shí)現(xiàn)
那么忌堂,redis有沒有什么方法使不同的應(yīng)用程序數(shù)據(jù)彼此分開同時又存儲在相同的實(shí)例上呢盒至?就相當(dāng)于mysql數(shù)據(jù)庫,不同的應(yīng)用程序數(shù)據(jù)存儲在不同的數(shù)據(jù)庫下士修。
redis下枷遂,數(shù)據(jù)庫是由一個整數(shù)索引標(biāo)識,而不是由一個數(shù)據(jù)庫名稱棋嘲。默認(rèn)情況下酒唉,一個客戶端連接到數(shù)據(jù)庫0。redis配置文件中下面的參數(shù)來控制數(shù)據(jù)庫總數(shù):
databases 16
可以通過下面的命令來切換到不同的數(shù)據(jù)庫下
redis> select 2
OK
隨后沸移,所有的命令將使用數(shù)據(jù)庫3痪伦,知道你明確的切換到另一個數(shù)據(jù)庫下。
每個數(shù)據(jù)庫都有屬于自己的空間雹锣,不必?fù)?dān)心之間的key沖突网沾。
不同的數(shù)據(jù)庫下,相同的key取到各自的值蕊爵。
flushdb命令清除數(shù)據(jù)辉哥,只會清除當(dāng)前的數(shù)據(jù)庫下的數(shù)據(jù),不會影響到其他數(shù)據(jù)庫。
flushall命令會清除這個實(shí)例的數(shù)據(jù)醋旦。在執(zhí)行這個命令前要格外小心恒水。
數(shù)據(jù)庫的數(shù)量是可以配置的,默認(rèn)情況下是16個饲齐。修改redis.conf下的databases指令:
databases 64
redis沒有提供任何方法來關(guān)聯(lián)標(biāo)識不同的數(shù)據(jù)庫钉凌。
因此,需要你來跟蹤什么數(shù)據(jù)存儲到哪個數(shù)據(jù)庫下捂人。
因此上面的快開啟200個實(shí)例的場景御雕,可以使用不同的數(shù)據(jù)庫來存儲,而不必開啟如此那么多的實(shí)例先慷。