Redis是一個(gè)開源的,先進(jìn)的 key-value 存儲(chǔ)可用于構(gòu)建高性能,可擴(kuò)展的 Web 應(yīng)用程序的解決方案。Redis官方網(wǎng)網(wǎng)站是:http://www.redis.io/,如下:
Redis 有三個(gè)主要使其有別于其它很多競(jìng)爭(zhēng)對(duì)手的特點(diǎn):
- Redis是完全在內(nèi)存中保存數(shù)據(jù)的數(shù)據(jù)庫(kù),使用磁盤只是為了持久性目的;
- Redis相比許多鍵值數(shù)據(jù)存儲(chǔ)系統(tǒng)有相對(duì)豐富的數(shù)據(jù)類型;
- Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器中;
Redis優(yōu)點(diǎn)
- ?異常快速 : Redis是非常快的,每秒可以執(zhí)行大約110000設(shè)置操作,81000個(gè)/每秒的讀取操作。
- ?支持豐富的數(shù)據(jù)類型 : Redis支持最大多數(shù)開發(fā)人員已經(jīng)知道如列表,集合,可排序集合,哈希等數(shù)據(jù)類型。這使得在應(yīng)用中很容易解決的各種問題,因?yàn)槲覀冎滥男﹩栴}處理使用哪種數(shù)據(jù)類型更好解決。
- ?操作都是原子的 : 所有 Redis 的操作都是原子,從而確保當(dāng)兩個(gè)客戶同時(shí)訪問 Redis 服務(wù)器得到的是更新后的值(最新值)。
- ?MultiUtility工具:Redis是一個(gè)多功能實(shí)用工具,可以在很多如:緩存,消息傳遞隊(duì)列中使用(Redis原生支持發(fā)布/訂閱),在應(yīng)用程序中,如:Web應(yīng)用程序會(huì)話,網(wǎng)站頁面點(diǎn)擊數(shù)等任何短暫的數(shù)據(jù);
Redis環(huán)境
要在 Ubuntu 上安裝 Redis,打開終端,然后輸入以下命令:
1
2
|
$ sudo apt-get update |
這將在您的計(jì)算機(jī)上安裝Redis
啟動(dòng) Redis
1
|
$redis-server |
查看 redis 是否還在運(yùn)行
1
|
$redis-cli |
這將打開一個(gè) Redis 提示符,如下圖所示:
1
|
redis 127.0.0.1:6379> |
在上面的提示信息中:127.0.0.1 是本機(jī)的IP地址,6379是 Redis 服務(wù)器運(yùn)行的端口。現(xiàn)在輸入 PING 命令,如下圖所示:
1
2
|
redis 127.0.0.1:6379> ping PONG |
這說明現(xiàn)在你已經(jīng)成功地在計(jì)算機(jī)上安裝了 Redis。
在Ubuntu上安裝Redis桌面管理器
要在Ubuntu 上安裝 Redis桌面管理,可以從 http://redisdesktop.com/download 下載包并安裝它。
Redis 桌面管理器會(huì)給你用戶界面來管理 Redis 鍵和數(shù)據(jù)。
Redis數(shù)據(jù)類型
Redis 支持5種數(shù)據(jù)類型,說明如下:
字符串
Redis 字符串是一個(gè)字節(jié)序列。在 Redis 中字符串是二進(jìn)制安全的,這意味著它們沒有任何特殊終端字符來確定長(zhǎng)度,所以可以存儲(chǔ)任何長(zhǎng)度為 512 兆的字符串。
示例
1
2
3
4
|
redis 127.0.0.1:6379> SET name "yiibai" OK redis 127.0.0.1:6379> GET name "yiibai" |
在上面的例子中,SET 和 GET 是 Redis 命令,name 和 "yiibai" 是存儲(chǔ)在 Redis 的鍵和字符串值。
哈希
Redis哈希是鍵值對(duì)的集合。 Redis哈希是字符串字段和字符串值之間的映射,所以它們用來表示對(duì)象。
示例
1
2
3
4
5
6
7
8
9
10
|
redis 127.0.0.1:6379> HMSET user :1 username yiibai password yiibai points 200 OK redis 127.0.0.1:6379> HGETALL user :1 1) "username" 2) "yiibai" 3) "password" 4) "yiibai" 5) "points" 6) "200" |
在上面的例子中,哈希數(shù)據(jù)類型用于存儲(chǔ)包含用戶基本信息的用戶對(duì)象。這里 HSET,HEXTALL 是 Redis 命令同時(shí) user:1 也是一個(gè)鍵。
列表
Redis 列表是簡(jiǎn)單的字符串列表,通過插入順序排序。可以添加一個(gè)元素到 Redis 列表的頭部或尾部。
示例
1
2
3
4
5
6
7
8
9
10
11
|
redis 127.0.0.1:6379> lpush tutoriallist redis ( integer ) 1 redis 127.0.0.1:6379> lpush tutoriallist mongodb ( integer ) 2 redis 127.0.0.1:6379> lpush tutoriallist rabitmq ( integer ) 3 redis 127.0.0.1:6379> lrange tutoriallist 0 10 1) "rabitmq" 2) "mongodb" 3) "redis" |
列表的最大長(zhǎng)度為 232 - 1 個(gè)元素(4294967295,每個(gè)列表的元素超過四十億)。
集合
Redis 集合是字符串的無序集合。在 Redis 可以添加,刪除和測(cè)試成員存在的時(shí)間復(fù)雜度為 O(1)。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
|
redis 127.0.0.1:6379> sadd tutoriallist redis ( integer ) 1 redis 127.0.0.1:6379> sadd tutoriallist mongodb ( integer ) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq ( integer ) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq ( integer ) 0 redis 127.0.0.1:6379> smembers tutoriallist 1) "rabitmq" 2) "mongodb" 3) "redis" |
注:在上面的例子中 rabitmq 被添加兩次,但由于它是只集合具有唯一特性。集合中的成員最大數(shù)量為 232 - 1(4294967295,每個(gè)集合有超過四十億條記錄)。
集合排序
不同的是,一個(gè)有序集合的每個(gè)成員都可以排序,就是為了按有序集合排序獲取它們,按權(quán)重分值從最小到最大排序。雖然成員都是獨(dú)一無二的,按權(quán)重分?jǐn)?shù)值可能會(huì)重復(fù)。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
|
redis 127.0.0.1:6379> zadd tutoriallist 0 redis ( integer ) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb ( integer ) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq ( integer ) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq ( integer ) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq" |
Redis鍵
Redis 中的 keys 命令用于管理 redis 中的鍵。Redis keys命令使用的語法如下所示:
語法
1
|
redis 127.0.0.1:6379> COMMAND KEY_NAME |
示例
1
2
3
4
|
redis 127.0.0.1:6379> SET yiibai redis OK redis 127.0.0.1:6379> DEL yiibai ( integer ) 1 |
在上面的例子中 DEL 是一個(gè)命令,而 yiibai 是一個(gè)鍵。如果鍵被成功刪除,則該命令的輸出將是(整數(shù))1,否則這將是(整數(shù))0;
Redis字符串
Redis 的字符串命令用于管理 redis 的字符串值。Redis 的字符串命令語法的使用如下所示:
語法
1
|
redis 127.0.0.1:6379> COMMAND KEY_NAME |
示例
1
2
3
4
|
redis 127.0.0.1:6379> SET yiibai redis OK redis 127.0.0.1:6379> GET yiibai "redis" |
在上面示例中 SET 和 GET 是 Redis 的命令,這里 yiibai 就是一個(gè)鍵(key);
Redis哈希
Redis哈希是字符串字段和字符串值之間的映射,所以它是用來表示對(duì)象的一個(gè)完美的數(shù)據(jù)類型,Redis 的哈希值最多可存儲(chǔ)超過4十億字段-值對(duì)。
示例
1
2
3
4
5
6
7
8
9
10
11
12
|
redis 127.0.0.1:6379> HMSET yiibai name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL yiibai 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" |
在上面的例子,我們?cè)谠O(shè)置一個(gè)名為 yiibai Redis的哈希的教程詳細(xì)信息(name, description, likes, visitors)。
Redis列表
Redis列表是簡(jiǎn)單的字符串列表,通過插入順序排序。您可以在Redis 列表的頭或列表尾添加元素。列表的最大長(zhǎng)度為 232 - 1 個(gè)元素(4294967295,每個(gè)列表可有超過四十億個(gè)元素)。
示例
1
2
3
4
5
6
7
8
9
10
11
|
redis 127.0.0.1:6379> LPUSH tutorials redis ( integer ) 1 redis 127.0.0.1:6379> LPUSH tutorials mongodb ( integer ) 2 redis 127.0.0.1:6379> LPUSH tutorials mysql ( integer ) 3 redis 127.0.0.1:6379> LRANGE tutorials 0 10 1) "mysql" 2) "mongodb" 3) "redis" |
在上面的例子中的三個(gè)值由命令LPUSH 插入到 redis 名稱為 tutorials 的列表。
Redis集合
Redis集合是唯一字符串的無序集合。唯一集合是不允許數(shù)據(jù)有重復(fù)的鍵的。在 Redis 集合中添加,刪除和測(cè)試成會(huì)是否存的時(shí)間復(fù)雜度為O(1)(恒定的時(shí)間,無論集合內(nèi)包含元素的數(shù)量)。集合的最大長(zhǎng)度為 232 - 1 個(gè)元素(4294967295,每個(gè)集合中超過四十億個(gè)元素)。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
|
redis 127.0.0.1:6379> SADD yiibai redis ( integer ) 1 redis 127.0.0.1:6379> SADD yiibai mongodb ( integer ) 1 redis 127.0.0.1:6379> SADD yiibai mysql ( integer ) 1 redis 127.0.0.1:6379> SADD yiibai mysql ( integer ) 0 redis 127.0.0.1:6379> SMEMBERS yiibai 1) "mysql" 2) "mongodb" 3) "redis" |
在上面的例子中的三個(gè)值被 Redis 的命令SADD插入到一個(gè)名為 yiibai 集合。
Redis有序集合
Redis的有序集合類似于 Redis 的集合,但是存儲(chǔ)的值在集合中具有唯一性。另外有序集合的每個(gè)成員都使用分值(score)的東西,這個(gè)分值就是用于將有序集合排序,從分值最小到最大來排序。
在 Redis 有序集合添加,刪除和測(cè)試成員的存在的時(shí)間復(fù)雜度為 O(1)(恒定時(shí)間,無論集合內(nèi)包含元素的數(shù)量)。列表的最大長(zhǎng)度為 232 - 1 個(gè)元素(4294967295,每個(gè)集合的元素超過四十億)。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
redis 127.0.0.1:6379> ZADD yiibai 1 redis ( integer ) 1 redis 127.0.0.1:6379> ZADD yiibai 2 mongodb ( integer ) 1 redis 127.0.0.1:6379> ZADD yiibai 3 mysql ( integer ) 1 redis 127.0.0.1:6379> ZADD yiibai 3 mysql ( integer ) 0 redis 127.0.0.1:6379> ZADD yiibai 4 mysql ( integer ) 0 redis 127.0.0.1:6379> ZRANGE yiibai 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4" |
在上面的例子中的三個(gè)值及其分值被 ZADD 命令插入一個(gè)名稱為 yiibai 的 redis 有序集合中
Redis HyperLogLog
Redis HyperLogLog 是用來做基數(shù)統(tǒng)計(jì)的算法,HyperLogLog 的優(yōu)點(diǎn)是,在輸入元素的數(shù)量或者體積非常非常大時(shí),計(jì)算基數(shù)所需的空間總是固定 的、并且是很小的。
在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 2^64 個(gè)不同元素的基 數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對(duì)比。但是,因?yàn)?HyperLogLog 只會(huì)根據(jù)輸入元素來計(jì)算基數(shù),而不會(huì)儲(chǔ)存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個(gè)元素。
示例
下面的例子說明了 HyperLogLog Redis 的工作原理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
redis 127.0.0.1:6379> PFADD tutorials "redis" 1) ( integer ) 1 redis 127.0.0.1:6379> PFADD tutorials "mongodb" 1) ( integer ) 1 redis 127.0.0.1:6379> PFADD tutorials "mysql" 1) ( integer ) 1 redis 127.0.0.1:6379> PFCOUNT tutorials ( integer ) 3 |
Redis發(fā)布訂閱
Redis訂閱和發(fā)布實(shí)現(xiàn)了通訊系統(tǒng),發(fā)件人(在 Redis 中的術(shù)語稱為發(fā)布者)發(fā)送郵件,而接收器(訂戶)接收它們。信息傳輸?shù)逆溌贩Q為通道。Redis 一個(gè)客戶端可以訂閱任意數(shù)量的通道。
示例
以下舉例說明發(fā)布訂閱用戶如何工作。在下面的例子給出一個(gè)客戶端訂閱的通道命名 redisChat 。
1
2
3
4
5
6
|
redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) ( integer ) 1 |
現(xiàn)在,兩個(gè)客戶端都在同一個(gè)通道名:redisChat 上發(fā)布消息,上述訂閱客戶端接收消息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique" ( integer ) 1 redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by tutorials point" ( integer ) 1 1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by tutorials point" |
Redis事務(wù)
Redis事務(wù)允許一組命令在單一步驟中執(zhí)行。事務(wù)有兩個(gè)屬性,說明如下:
- 在一個(gè)事務(wù)中的所有命令作為單個(gè)獨(dú)立的操作順序執(zhí)行。在Redis事務(wù)中的執(zhí)行過程中而另一客戶機(jī)發(fā)出的請(qǐng)求,這是不可以的;
- Redis事務(wù)是原子的。原子意味著要么所有的命令都執(zhí)行,要么都不執(zhí)行;
示例
Redis 事務(wù)由指令 MULTI 發(fā)起的,之后傳遞需要在事務(wù)中和整個(gè)事務(wù)中,最后由 EXEC 命令執(zhí)行所有命令的列表。
1
2
3
4
|
redis 127.0.0.1:6379> MULTI OK List of commands here redis 127.0.0.1:6379> EXEC |
示例
下面的例子說明了 Redis 的事務(wù)是如何開始和執(zhí)行。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET tutorial redis QUEUED redis 127.0.0.1:6379> GET tutorial QUEUED redis 127.0.0.1:6379> INCR visitors QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "redis" 3) ( integer ) 1 |
Redis腳本
Redis 腳本是使用Lua解釋腳本用來評(píng)估(計(jì)算)。從 Redis 2.6.0 版本開始內(nèi)置這個(gè)解釋器。命令 EVAL 用于執(zhí)行 腳本命令。
語法
EVAL命令的基本語法如下:
1
|
redis 127.0.0.1:6379> EVAL script numkeys key [ key ...] arg [arg ...] |
示例
下面的例子說明了 Redis 腳本是如何工作的:
1
2
3
4
5
6
|
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second" |
Redis連接
Redis 的連接命令基本上都用于管理 Redis服務(wù)器與客戶端連接。
示例
下面的例子說明了一個(gè)客戶端在Redis服務(wù)器上,如何檢查服務(wù)器是否正在運(yùn)行并驗(yàn)證自己。
1
2
3
4
|
redis 127.0.0.1:6379> AUTH "password" OK redis 127.0.0.1:6379> PING PONG |
Redis備份
Redis的SAVE命令用于創(chuàng)建當(dāng)前 Redis 數(shù)據(jù)庫(kù)的備份。
語法
Redis 的 SAVE 命令的基本語法如下所示:
1
|
127.0.0.1:6379> SAVE |
示例
以下示例顯示了如何在Redis的當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建備份。
1
2
3
|
127.0.0.1:6379> SAVE OK |
在執(zhí)行此命令之后,將在 redis 目錄中創(chuàng)建一個(gè) dump.rdb 文件。
恢復(fù) Redis 數(shù)據(jù)
要恢復(fù) redis 數(shù)據(jù)只需要要將 Redis 的備份文件(dump.rdb)放到 Redis 的目錄中,并啟動(dòng)服務(wù)器。要了解知道 Redis 目錄在什么位置,可使用 CONFIG 命令,如下所示:
1
2
3
4
|
127.0.0.1:6379> CONFIG get dir 1) "dir" 2) "/user/yiibai/redis-2.8.13/src" |
在上面的命令命令輸出為 /user/yiibai/redis-2.8.13/src 就是使用的 Redis 目錄,也就是 Redis 的服務(wù)器安裝的目錄。
Bgsave
創(chuàng)建 Redis 的備份也可以使用備用命令 BGSAVE 。此命令將啟動(dòng)備份過程,并在后臺(tái)運(yùn)行此。
示例
1
2
3
|
127.0.0.1:6379> BGSAVE Background saving started |
Redis安全
Redis 數(shù)據(jù)庫(kù)可以配置安全保護(hù)的,所以任何客戶端在連接執(zhí)行命令時(shí)需要進(jìn)行身份驗(yàn)證。為了確保 Redis 的安全,需要在配置文件設(shè)置密碼。
示例
下面給出的例子顯示的步驟是用來確保 Redis 實(shí)例的安全。
1
2
3
|
127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) "" |
默認(rèn)情況下此屬性是空的,這意味著此實(shí)例沒有設(shè)置密碼。可以通過執(zhí)行以下命令來修改設(shè)置此屬性
1
2
3
4
5
|
127.0.0.1:6379> CONFIG set requirepass "yiibaipass" OK 127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) "yiibaipass" |
如果客戶端運(yùn)行命令無需驗(yàn)證設(shè)置密碼,那么(錯(cuò)誤)NOAUTH 需要驗(yàn)證。錯(cuò)誤將返回。因此,客戶端需要使用 AUTH 命令來驗(yàn)證自己的身份信息。
語法
AUTH命令的基本語法如下所示:
1
|
127.0.0.1:6379> AUTH password |
Redis性能測(cè)試
Redis的基準(zhǔn)性能測(cè)試是通過同時(shí)運(yùn)行 N 個(gè)命令以檢查 Redis 性能的工具。
語法
Redis的基準(zhǔn)測(cè)試的基本語法如下所示:
1
|
redis-benchmark [ option ] [ option value] |
示例
下面給出的示例是通過調(diào)用 100000 個(gè)(次)命令來檢查 Redis。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
redis-benchmark -n 100000 PING_INLINE: 141043.72 requests per second PING_BULK: 142857.14 requests per second SET : 141442.72 requests per second GET: 145348.83 requests per second INCR: 137362.64 requests per second LPUSH: 145348.83 requests per second LPOP: 146198.83 requests per second SADD: 146198.83 requests per second SPOP: 149253.73 requests per second LPUSH (needed to benchmark LRANGE): 148588.42 requests per second LRANGE_100 ( first 100 elements): 58411.21 requests per second LRANGE_300 ( first 300 elements): 21195.42 requests per second LRANGE_500 ( first 450 elements): 14539.11 requests per second LRANGE_600 ( first 600 elements): 10504.20 requests per second MSET (10 keys): 93283.58 requests per second |
Redis客戶端連接
如果啟用了Redis 的接受配置監(jiān)聽,客戶端可在TCP端口上與Unix套接字連接。以下操作執(zhí)行后新的客戶端連接被服務(wù)器接受:
- 客戶端套接字在非阻塞狀態(tài),因?yàn)?nbsp;Redis 使用復(fù)用和非阻塞I/O;
- TCP_NODELAY選項(xiàng)設(shè)定以確保不會(huì)在連接時(shí)延遲;
- 創(chuàng)建一個(gè)可讀的文件事件,以便 Redis 能夠盡快收集客戶端查詢作為新的數(shù)據(jù)可被套接字讀取;
客戶端最大連接數(shù)量
在Redis的配置文件(redis.conf)有一個(gè)屬性 maxclients ,它描述了可以連接到 Redis 的客戶的最大數(shù)量。命令的基本語法是:
1
2
3
4
|
config get maxclients 1) "maxclients" 2) "10000" |
默認(rèn)情況下此屬性設(shè)置為 10000(取決于OS的文件標(biāo)識(shí)符限制最大數(shù)量),但可以修改這個(gè)屬性。
示例
在下面給出的例子我們已經(jīng)設(shè)置客戶端最大連接數(shù)量為 100000,在之后啟動(dòng)服務(wù)器:
1
|
redis-server --maxclients 100000 |
Redis管道
Redis是一個(gè)TCP服務(wù)器,支持請(qǐng)求/響應(yīng)協(xié)議。在 redis 中一個(gè)請(qǐng)求完成以下步驟:
- 客戶端發(fā)送一個(gè)查詢給服務(wù)器,并從套接字中讀取,通常服務(wù)器的響應(yīng)是在一個(gè)封閉的方式;
- 服務(wù)器處理命令并將響應(yīng)返回給客戶端;
管道的含義
管道的基本含義是:客戶端可以發(fā)送多個(gè)請(qǐng)求給服務(wù)器,而不等待全部響應(yīng),最后在單個(gè)步驟中讀取所有響應(yīng)。
示例
要檢查 Redis 管道只需要啟動(dòng) Redis 實(shí)例,并在終端輸入以下命令。
1
2
3
4
5
6
7
8
|
$(echo -en "PING\r\n SET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n" ; sleep 10) | nc localhost 6379 +PONG +OK redis :1 :2 :3 |
在上面的例子所示,了解使用 PING 命令連接 Redis,之后我們?cè)?nbsp;Redis 設(shè)定一個(gè)名為 tutorial 字符串值,之后拿到這個(gè)鍵對(duì)應(yīng)的值并增加訪問人數(shù)的三倍。在結(jié)果中,我們可以看到所有的命令都提交給 Redis 一次,Redis是給單步輸出所有命令。
通道的好處
這種技術(shù)的好處是顯著提高協(xié)議的性能。管道localhost 獲得至少達(dá)到百倍的網(wǎng)絡(luò)連接速度。
Redis分區(qū)
分區(qū)是將數(shù)據(jù)分割成多個(gè) Redis 實(shí)例,使每個(gè)實(shí)例將只包含鍵子集的過程。
分區(qū)的好處
- 它允許更大的數(shù)據(jù)庫(kù),使用多臺(tái)計(jì)算機(jī)的內(nèi)存總和。如果不分區(qū),只是一臺(tái)計(jì)算機(jī)有限的內(nèi)存可以支持的數(shù)據(jù)存儲(chǔ);
- 它允許按比例在多內(nèi)核和多個(gè)計(jì)算機(jī)計(jì)算,以及網(wǎng)絡(luò)帶寬向多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)適配器;
分區(qū)的劣勢(shì)
- 涉及多個(gè)鍵的操作通常不支持。例如,如果它們被存儲(chǔ)在被映射到不同的 Redis 實(shí)例鍵,則不能在兩個(gè)集合之間執(zhí)行交集;
- 涉及多個(gè)鍵時(shí),Redis事務(wù)無法使用;
- 分區(qū)粒度是一個(gè)鍵,所以它不可能使用一個(gè)鍵和一個(gè)非常大的有序集合分享一個(gè)數(shù)據(jù)集;
- 當(dāng)使用分區(qū),數(shù)據(jù)處理比較復(fù)雜,比如要處理多個(gè)RDB/AOF文件,使數(shù)據(jù)備份需要從多個(gè)實(shí)例和主機(jī)聚集持久性文件;
- 添加和刪除的容量可能會(huì)很復(fù)雜。例如:Redis的Cluster支持?jǐn)?shù)據(jù)在運(yùn)行時(shí)添加和刪除節(jié)點(diǎn)是透明平衡的,但其他系統(tǒng),如客戶端的分區(qū)和代理服務(wù)器不支持此功能
分區(qū)類型
Redis 提供有兩種類型的分區(qū)。假設(shè)我們有四個(gè) redis 實(shí)例:R0,R1,R2,R3,分別表示用戶用戶如:user:1, user:2, ...等等
范圍分區(qū)
范圍分區(qū)被映射對(duì)象指定 Redis 實(shí)例在一個(gè)范圍內(nèi)完成。
在我們的例子中,用戶從ID為 0 至 ID10000 將進(jìn)入實(shí)例 R0,而用戶 ID 10001到ID 20000 將進(jìn)入實(shí)例 R1 等等。
散列分區(qū)
在這種類型的分區(qū)是一個(gè)散列函數(shù)(例如,模數(shù)函數(shù))用于將鍵轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù),然后存儲(chǔ)在不同的 redis 實(shí)例