服務器(2)--搭建Redis服務器和集羣


背景:最近在學習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();
	}


2)使用連接池

   //使用連接池
	@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、要想獲得更深的理解,自己親自嘗試一下就可以了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章