在實(shí)際的項(xiàng)目中揪垄,Redis常被用作緩存、分布式鎖奉芦、消息隊(duì)列等的解決方案憾儒。但是在搭建好Redis服務(wù)后钉寝,Redis默認(rèn)創(chuàng)建了16個(gè)數(shù)據(jù)庫(kù)(db0~db15),而在Redis集群下只有一個(gè)db0數(shù)據(jù)庫(kù)。如下圖所示。
一售淡、16個(gè)數(shù)據(jù)庫(kù)的由來
Redis是一個(gè)類似于字典結(jié)構(gòu)的存儲(chǔ)服務(wù)器,一個(gè)Redis實(shí)例提供了多個(gè)用來存儲(chǔ)數(shù)據(jù)的字典慷垮,在客戶端可以指定將數(shù)據(jù)存儲(chǔ)于哪個(gè)字典中揖闸。這與在一個(gè)關(guān)系數(shù)據(jù)庫(kù)實(shí)例中創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)類似,所以料身,可以將Redis中的每個(gè)字典都理解為一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)汤纸。
??我們講過Redis默認(rèn)支持16個(gè)數(shù)據(jù)庫(kù),這可以通過修改Redis的配置文件/redis/redis.conf中的databases字段的值芹血,設(shè)置完畢并重啟Redis即可完成配置贮泞。
??此外,客戶端與Redis建立連接之后祟牲,默認(rèn)會(huì)選擇0號(hào)數(shù)據(jù)庫(kù)即db0,但可以使用
select
命令更換存儲(chǔ)的數(shù)據(jù)庫(kù)抖部。
也可以通過修改配置文件的方式選擇默認(rèn)數(shù)據(jù)庫(kù)说贝。
二、正解Redis數(shù)據(jù)庫(kù)概念
可以看到慎颗,Redis的數(shù)據(jù)庫(kù)都以db+編號(hào)的方式命名乡恕,這是因?yàn)镽edis不支持自定義數(shù)據(jù)庫(kù)名。開發(fā)者則需要自己記錄存儲(chǔ)的數(shù)據(jù)與數(shù)據(jù)庫(kù)之間的對(duì)應(yīng)關(guān)系俯萎。此外傲宜,Redis不支持為每個(gè)數(shù)據(jù)庫(kù)設(shè)置不同的訪問密碼,即客戶端要么可以訪問全部的數(shù)據(jù)庫(kù)夫啊,要么所有的數(shù)據(jù)庫(kù)都不能被訪問函卒。
Redis中存在這么一個(gè)命令flushall
,該命令可以清空當(dāng)前Redis實(shí)例下所有數(shù)據(jù)庫(kù)的數(shù)據(jù)撇眯。這與類似于mysql的關(guān)系型數(shù)據(jù)庫(kù)不同报嵌,關(guān)系型數(shù)據(jù)庫(kù)的每個(gè)數(shù)據(jù)庫(kù)常用于存儲(chǔ)不同應(yīng)用程序的數(shù)據(jù)虱咧,且不提供清除當(dāng)前實(shí)例下所有數(shù)據(jù)庫(kù)數(shù)據(jù)的方法。
因此锚国,對(duì)于Redis來說腕巡,用命名空間的方式理解Redis提供的db0~db15數(shù)據(jù)庫(kù)會(huì)更合適,且一個(gè)Redis實(shí)例不適合存儲(chǔ)多個(gè)應(yīng)用程序的數(shù)據(jù)血筑。比如绘沉,我們可以這么做:使用db0數(shù)據(jù)庫(kù)存儲(chǔ)應(yīng)用程序在生產(chǎn)環(huán)境的數(shù)據(jù),用db1數(shù)據(jù)庫(kù)存儲(chǔ)測(cè)試環(huán)境的數(shù)據(jù)豺总。但是车伞,不適合用db0數(shù)據(jù)庫(kù)存儲(chǔ)應(yīng)用程序A的數(shù)據(jù),用db1存儲(chǔ)應(yīng)用程序B的數(shù)據(jù)园欣。****不同的應(yīng)用程序應(yīng)使用不同的Redis實(shí)例帖世。此外,我們不必?fù)?dān)心使用過多的Redis實(shí)例造成數(shù)據(jù)庫(kù)服務(wù)壓力過大沸枯,因?yàn)镽edis是非常輕量級(jí)的日矫,一個(gè)空的Redis實(shí)例占用的內(nèi)存只有1MB左右。
三绑榴、集群環(huán)境下的Redis實(shí)例
在單體Redis的情況下可以使用select
命令來實(shí)現(xiàn)數(shù)據(jù)庫(kù)的切換哪轿,但在集群環(huán)境下,Redis不支持使用select
命令來切換數(shù)據(jù)庫(kù)翔怎,這是因?yàn)樵诩涵h(huán)境下只有一個(gè)db0數(shù)據(jù)庫(kù)窃诉。集群與單體Redis的區(qū)別如下:
1、key批量操作支持有限:例如mget赤套、mset必須在一個(gè)slot飘痛;
2、Key事務(wù)和Lua支持有限:操作的key必須在一個(gè)節(jié)點(diǎn)容握;
3宣脉、key是數(shù)據(jù)分區(qū)的最小粒度:不支持bigkey分區(qū);
4剔氏、不支持多個(gè)數(shù)據(jù)庫(kù):集群模式下只有一個(gè)db0塑猖;
5、復(fù)制只支持一層:不支持樹形復(fù)制結(jié)構(gòu)谈跛。
12345
四羊苟、總結(jié)
- Redis實(shí)例默認(rèn)創(chuàng)建了16個(gè)數(shù)據(jù)庫(kù),且不支持自定義命名感憾,以dbX的方式命名(db0~db15)蜡励;
- 默認(rèn)數(shù)據(jù)庫(kù)的數(shù)量可以在配置文件中修改;
- 應(yīng)以命名空間的方式理解Redis數(shù)據(jù)庫(kù)db,多個(gè)應(yīng)用程序不應(yīng)使用同一個(gè)Redis的不同庫(kù)巍虫,而應(yīng)一個(gè)應(yīng)用程序?qū)?yīng)一個(gè)Redis實(shí)例彭则,不同的數(shù)據(jù)庫(kù)可用于存儲(chǔ)不同環(huán)境的數(shù)據(jù)。
- Redis集群下只有db0占遥,不支持多db俯抖。