# Redis 分區
分區是分割數據到多個Redis實例的處理過程,因此每個實例只保存key的一個子集。
### 分區的優勢
* 通過利用多臺計算機內存的和值,允許我們構造更大的數據庫。
* 通過多核和多臺計算機,允許我們擴展計算能力;通過多臺計算機和網絡適配器,允許我們擴展網絡帶寬。
### 分區的不足
redis的一些特性在分區方面表現的不是很好:
* 涉及多個key的操作通常是不被支持的。舉例來說,當兩個set映射到不同的redis實例上時,你就不能對這兩個set執行交集操作。
* 涉及多個key的redis事務不能使用。
* 當使用分區時,數據處理較為復雜,比如你需要處理多個rdb/aof文件,并且從多個實例和主機備份持久化文件。
* 增加或刪除容量也比較復雜。redis集群大多數支持在運行時增加、刪除節點的透明數據平衡的能力,但是類似于客戶端分區、代理等其他系統則不支持這項特性。然而,一種叫做presharding的技術對此是有幫助的。
## 分區類型
Redis 有兩種類型分區。 假設有4個Redis實例 R0,R1,R2,R3,和類似user:1,user:2這樣的表示用戶的多個key,對既定的key有多種不同方式來選擇這個key存放在哪個實例中。也就是說,有不同的系統來映射某個key到某個Redis服務。
### 范圍分區
最簡單的分區方式是按范圍分區,就是映射一定范圍的對象到特定的Redis實例。
比如,ID從0到10000的用戶會保存到實例R0,ID從10001到 20000的用戶會保存到R1,以此類推。
這種方式是可行的,并且在實際中使用,不足就是要有一個區間范圍到實例的映射表。這個表要被管理,同時還需要各 種對象的映射表,通常對Redis來說并非是好的方法。
### 哈希分區
另外一種分區方法是hash分區。這對任何key都適用,也無需是object_name:<id>這種形式,像下面描述的一樣簡單:</id>
* 用一個hash函數將key轉換為一個數字,比如使用crc32 hash函數。對key foobar執行crc32(foobar)會輸出類似93024922的整數。
* 對這個整數取模,將其轉化為0-3之間的數字,就可以將這個整數映射到4個Redis實例中的一個了。93024922 % 4 = 2,就是說key foobar應該被存到R2實例中。注意:取模操作是取除的余數,通常在多種編程語言中用%操作符實現。<split>
# Java 使用 Redis
## 安裝
開始在 Java 中使用 Redis 前, 我們需要確保已經安裝了 redis 服務及 Java redis 驅動,且你的機器上能正常使用 Java。 Java的安裝配置可以參考我們的 [Java開發環境配置](java-environment-setup.html "Java開發環境配置") 接下來讓我們安裝 Java redis 驅動:
* 首先你需要下載驅動包,[**下載 jedis.jar**](//repo1.maven.org/maven2/redis/clients/jedis/2.1.0/jedis-2.1.0-sources.jar),確保下載最新驅動包。
* 在你的classpath中包含該驅動包。
## 連接到 redis 服務
```
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//查看服務是否運行
System.out.println("Server is running: "+jedis.ping());
}
}
```
編譯以上 Java 程序,確保驅動包的路徑是正確的。
```
$javac RedisJava.java
$java RedisJava
Connection to server sucessfully
Server is running: PONG
Redis Java String Example
```
## Redis Java String(字符串) 實例
```
import redis.clients.jedis.Jedis;
public class RedisStringJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//設置 redis 字符串數據
jedis.set("w3ckey", "Redis tutorial");
// 獲取存儲的數據并輸出
System.out.println("Stored string in redis:: "+ jedis.get("w3ckey"));
}
}
```
編譯以上程序。
```
$javac RedisStringJava.java
$java RedisStringJava
Connection to server sucessfully
Stored string in redis:: Redis tutorial
```
## Redis Java List(列表) 實例
```
import redis.clients.jedis.Jedis;
public class RedisListJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//存儲數據到列表中
jedis.lpush("tutorial-list", "Redis");
jedis.lpush("tutorial-list", "Mongodb");
jedis.lpush("tutorial-list", "Mysql");
// 獲取存儲的數據并輸出
List<String> list = jedis.lrange("tutorial-list", 0 ,5);
for(int i=0; i<list.size(); i++) {
System.out.println("Stored string in redis:: "+list.get(i));
}
}
}
```
編譯以上程序。
```
$javac RedisListJava.java
$java RedisListJava
Connection to server sucessfully
Stored string in redis:: Redis
Stored string in redis:: Mongodb
Stored string in redis:: Mysql
```
## Redis Java Keys 實例
```
import redis.clients.jedis.Jedis;
public class RedisKeyJava {
public static void main(String[] args) {
//連接本地的 Redis 服務
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
// 獲取數據并輸出
List<String> list = jedis.keys("*");
for(int i=0; i<list.size(); i++) {
System.out.println("List of stored keys:: "+list.get(i));
}
}
}
```
編譯以上程序。
```
$javac RedisKeyJava.java
$java RedisKeyJava
Connection to server sucessfully
List of stored keys:: tutorial-name
List of stored keys:: tutorial-list
```
- Redis 教程
- Redis 簡介
- Redis 安裝
- Redis 配置
- Redis 數據類型
- Redis 命令
- Redis 數據備份與恢復
- Redis 安全
- Redis 性能測試
- Redis 客戶端連接
- Redis 管道技術
- Redis 分區
- Java 使用 Redis
- Java 使用 Redis
- PHP 使用 Redis
- PHP 使用 Redis
- Redis 命令參考
- Key(鍵)
- DEL
- DUMP
- EXISTS
- EXPIRE
- EXPIREAT
- KEYS
- MIGRATE
- MOVE
- OBJECT
- PERSIST
- PEXPIRE
- PEXPIREAT
- PTTL
- RANDOMKEY
- RENAME
- RENAMENX
- RESTORE
- SORT
- TYPE
- SCAN
- String(字符串)
- APPEND
- BITCOUNT
- BITOP
- DECR
- DECRBY
- GET
- GETBIT
- GETRANGE
- GETSET
- INCR
- INCRBY
- INCRBYFLOAT
- MGET
- MSET
- MSETNX
- PSETEX
- SET
- SETBIT
- SETEX
- SETNX
- SETRANGE
- STRLEN
- Hash(哈希表)
- HDEL
- HEXISTS
- HGET
- HGETALL
- HINCRBY
- HINCRBYFLOAT
- HKEYS
- HLEN
- HMGET
- HMSET
- HSET
- HSETNX
- HVALS
- HSCAN
- List(列表)
- BLPOP
- BRPOP
- BRPOPLPUSH
- LINDEX
- LINSERT
- LLEN
- LPOP
- LPUSH
- LRANGE
- LREM
- LSET
- LTRIM
- RPOP
- RPOPLPUSH
- RPUSH
- RPUSHX
- Set(集合)
- SADD
- SCARD
- SDIFF
- SDIFFSTORE
- SINTER
- SINTER
- SINTERSTORE
- SISMEMBER
- SMEMBERS
- SMOVE
- SPOP
- SRANDMEMBER
- SREM
- SUNION
- SUNIONSTORE
- SSCAN
- SortedSet(有序集合)
- ZADD
- ZCARD
- ZCOUNT
- ZINCRBY
- ZRANGE
- ZRANGEBYSCORE
- ZRANK
- ZREM
- ZREMRANGEBYRANK
- ZREMRANGEBYSCORE
- ZREVRANGE
- ZREVRANGEBYSCORE
- ZREVRANK
- ZSCORE
- ZUNIONSTORE
- ZINTERSTORE
- ZSCAN
- Pub/Sub(發布/訂閱)
- PSUBSCRIBE
- PUBLISH
- PUBSUB
- PUNSUBSCRIBE
- SUBSCRIBE
- UNSUBSCRIBE
- Transaction(事務)
- DISCARD
- EXEC
- MULTI
- UNWATCH
- WATCH
- Script(腳本)
- EVAL
- EVALSHA
- SCRIPT EXISTS
- SCRIPT FLUSH
- SCRIPT KILL
- SCRIPT LOAD
- Connection(連接)
- AUTH
- ECHO
- PING
- QUIT
- SELECT
- Server(服務器)
- BGREWRITEAOF
- BGSAVE
- CLIENT GETNAME
- CLIENT KILL
- CLIENT LIST
- CLIENT SETNAME
- CONFIG GET
- CONFIG RESETSTAT
- CONFIG REWRITE
- CONFIG SET
- DBSIZE
- DEBUG OBJECT
- DEBUG SEGFAULT
- FLUSHALL
- FLUSHDB
- INFO
- LASTSAVE
- MONITOR
- PSYNC
- SAVE
- SHUTDOWN
- SLAVEOF
- SLOWLOG
- SYNC
- TIME
- 免責聲明