背景:最近在學習Redis服務器,搭建的步驟記錄一下吧~~~
一、Redis
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
二、單機版
安裝步驟:
1、安裝gcc編譯環境
yum install gcc-c++
2、上傳源碼,並解壓
tar -zxvf redis-3.0.0.tar.gz
3、make
4、make install PREFIX=/usr/local/redis
5、啓動
兩種啓動方式:前端啓動,後臺啓動
前端啓動:/redis-server
後臺啓動:
1)複製redis.conf到redis的安裝目錄
2)修改redis.conf。修改daemonize yes
3) ./redis-server redis.conf
查看redis進程
6、測試
使用redis-cli客戶端
三、集羣版
redis-cluster結構圖:
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬
(2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點
搭建步驟:
集羣中應該至少有三個節點,每個節點有一備份節點。需要6臺服務器。
搭建僞分佈式,需要6個redis實例。
1、在創建一個redis-cluster目錄,並在其下創建6個redis實例指定redis.conf端口從7001到7006
mkdir redis-cluster
2、修改redis.conf 打開Cluster-enable yes前面的註釋。
3、需要一個ruby腳本。在redis源碼文件夾下的src目錄下。redis-trib.rb。把redis-trib.rb文件複製到到redis-cluster目錄下。
5、執行ruby腳本之前,需要安裝ruby環境。
yum install ruby
yum install rubygems
安裝redis-trib.rb運行依賴的ruby的包。gem install redis-3.0.0.gem
6、啓動所有的redis實例。
可以寫一個腳本,同時啓動redis實例:
./start-all.sh
7、創建集羣
./redis-trib.rb create --replicas 1 192.168.25.131:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004
192.168.25.153:7005 192.168.25.153:7006
8、測試
連接集合中任何一臺服務器都可以
redis01/redis-cli -p 7001 -c (-c必須有,否則連接失敗)
四、如何使用redis的java客戶端
1、連接單機版
先把jedis依賴的jar包添加到工程中。
1)不使用連接池
//單機版測試
@Test
public void testJedisSingle() throws Exception {
//創建一個Jedis對象
Jedis jedis = new Jedis("192.168.25.131", 6379);
jedis.set("test", "hello jedis");
String string = jedis.get("test");
System.out.println(string);
jedis.close();
}
//使用連接池
@Test
public void testJedisPool() throws Exception {
//創建一個連接池對象
//系統中應該是單例的。
JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
//從連接池中獲得一個連接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("test");
System.out.println(result);
//jedis必須關閉
jedis.close();
//系統關閉時關閉連接池
jedisPool.close();
}
2、連接集羣版
//連接redis集羣
@Test
public void testJedisCluster() throws Exception {
//創建一個JedisCluster對象
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.153", 7001));
nodes.add(new HostAndPort("192.168.25.153", 7002));
nodes.add(new HostAndPort("192.168.25.153", 7003));
nodes.add(new HostAndPort("192.168.25.153", 7004));
nodes.add(new HostAndPort("192.168.25.153", 7005));
nodes.add(new HostAndPort("192.168.25.153", 7006));
//在nodes中指定每個節點的地址
//jedisCluster在系統中是單例的。
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("name", "zhangsan");
jedisCluster.set("value", "100");
String name = jedisCluster.get("name");
String value = jedisCluster.get("value");
System.out.println(name);
System.out.println(value);
//系統關閉時關閉jedisCluster
jedisCluster.close();
}
五、學習心得
1、靜下心來仔細認真的梳理,其實並不難。
2、要想獲得更深的理解,自己親自嘗試一下就可以了。