1. 程式人生 > 其它 >走進 Redis:Redis 的安裝、使用以及叢集的搭建

走進 Redis:Redis 的安裝、使用以及叢集的搭建

一、Redis的安裝

Redis的安裝是很簡單的,安裝之前我們需要c語言的編譯環境。如果沒有gcc需要線上安裝。 yum install gcc-c++

安裝步驟:

第一步:redis的原始碼包上傳到linux系統。

第二步:解壓縮redis。 tar-zxvf redis-3.0.0.tar.gz

第三步:編譯。進入redis原始碼目錄。 make

第四步:安裝。 make install PREFIX=/usr/local/redis,PREFIX引數指定redis的安裝目錄。

二、Redis的啟動與基本操作

1.執行redis

在redis的安裝目錄下直接執行 ./redis-server就可以啟動redis,但這是前端啟動。如果我們想後臺啟動就需要:

1、進入redis-3.0.0.tar.gz解壓出來的資料夾,複製裡面的redis.conf檔案到安裝目錄下。然後將daemonize改為yes

2、執行 ./redis-server redis.conf執行redis。

這樣redis就後臺運行了,我們可以使用 ps aux|grep redis來檢視redis的執行狀態:

我們可以使用以下命令來進入操作redis:

./redis-cli ##進入redis客戶端
./redis-cli -h 192.168.72.121 -p 6379 ##連線指定ip和埠的redis伺服器
./redis-cli shutdown ##關閉redis客戶端

2.redis中的五種型別

先來看幾個操作資料庫的基本命令:

KEYS *                   ##獲得當前資料庫的所有鍵
EXISTS key [key ...]     ##判斷鍵是否存在,返回個數,如果key有一樣的也是疊加數
DEL key [key ...]        ##刪除鍵,返回刪除的個數
TYPE key                 ##獲取減值的資料型別(string,hash,list,set,zset)
FLUSHALL                 ##清空所有資料庫
Expire key second        ##設定key的過期時間
Ttl key                  ##檢視key的有效期
Persist key              ##清除key的過期時間。Key持久化。

redis中所有的資料都是Key-value型別的,其中有五種主要資料型別:字串型別(string),雜湊型別(hash),列表型別(list),集合型別(set),有序集合型別(zset)。而在這五種型別中,我們最常用的是字串型別,雜湊型別。這裡簡單介紹一下字串型別和雜湊型別:

字串型別string

SET         ##賦值,用法: SET key value
GET         ##取值,用法: GET key
INCR        ##遞增數字,僅僅對數字型別的鍵有用,相當於Java的i++運算,用法: INCR key
INCRBY      ##增加指定的數字,僅僅對數字型別的鍵有用,相當於Java的i+=3,用法:INCRBY key increment,意思是key自增increment,increment可以為負數,表示減少。
DECR        ##遞減數字,僅僅對數字型別的鍵有用,相當於Java的i–,用法:DECR key
DECRBY      ##減少指定的數字,僅僅對數字型別的鍵有用,相當於Java的i-=3,用法:DECRBY key decrement,意思是key自減decrement,decrement可以為正數,表示增加。
INCRBYFLOAT ##增加指定浮點數,僅僅對數字型別的鍵有用,用法:INCRBYFLOAT key increment
APPEND      ##向尾部追加值,相當於Java中的”hello”.append(“ world”),用法:APPEND key value
STRLEN      ##獲取字串長度,用法:STRLEN key
MSET        ##同時設定多個key的值,用法:MSET key1 value1 [key2 value2 ...]
MGET        ##同時獲取多個key的值,用法:MGET key1 [key2 ...]

雜湊型別hash

HSET        ##賦值,用法:HSET key field value
HMSET       ##一次賦值多個欄位,用法:HMSET key field1 value1 [field2 values]
HGET        ##取值,用法:HSET key field
HMGET       ##一次取多個欄位的值,用法:HMSET key field1 [field2]
HGETALL     ##一次取所有欄位的值,用法:HGETALL key
HEXISTS     ##判斷欄位是否存在,用法:HEXISTS key field
HSETNX      ##當欄位不存在時賦值,用法:HSETNX key field value
HINCRBY     ##增加數字,僅對數字型別的值有用,用法:HINCRBY key field increment
HDEL        ##刪除欄位,用法:HDEL key field
HKEYS       ##獲取所有欄位名,用法:HKEYS key
HVALS       ##獲取所有欄位值,用法:HVALS key
HLEN        ##獲取欄位數量,用法:HLEN key

其他的資料型別就不詳細介紹了,相關資料可以點選傳送門

三、Redis的持久化方案

Redis的所有資料都是儲存到記憶體中的。

Rdb:快照形式,定期把記憶體中當前時刻的資料儲存到磁碟。Redis預設支援的持久化方案,一直開啟,不會被關閉。

通過上圖我們可以看到,dump.rdb會在以下情況儲存一次。

  • 900秒(15分鐘)之內至少有1個KEY進行了改變
  • 300秒(5分鐘)之內至少有10個KEY進行了改變
  • 60秒(1分鐘)之內至少有10000個KEY進行了改變

aof形式:append only file。把所有對redis資料庫操作的命令,增刪改操作的命令。儲存到檔案中。資料庫恢復時把所有的命令執行一遍即可。要想開啟aof模式需要在redis.conf配置檔案中將appendonly改為yes。

四、Redis叢集的搭建

1.Redis叢集特點

Redis叢集搭建的方式有多種,例如使用zookeeper等,但從redis3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。其redis-cluster架構圖如下:

其架構細節:

  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
  2. 節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
  3. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
  4. redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。
  5. Redis叢集預分好16384個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個槽中。
2.Redis叢集環境搭建

Redis叢集中至少應該有三個節點。要保證叢集的高可用,需要每個節點有一個備份機。

Redis叢集至少需要6臺伺服器。由於條件限制,這裡採用與淘淘商城相同的方式搭建偽分散式。在一臺虛擬機器執行6個redis例項。需要修改redis的埠號7001-7006。

第一步:建立6個redis例項,每個例項執行在不同的埠。

需要修改redis.conf配置檔案,將埠號修改成7001-7006。除此之外,還需要把cluster-enabled yes前的註釋去掉。

第二步:啟動每個redis例項。

這裡我們可以自己寫一個shell指令碼,這裡給出我的也就是淘淘商城中所使用的指令碼:

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

關閉叢集的指令碼也類似:

./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown

記得在執行指令碼前要新增可執行(x)的許可權: chmod u+x fileName.sh

第三步:使用ruby指令碼搭建叢集。

首先我們需要安裝ruby執行環境

yum install ruby
yum install rubygems

然後我們需要安裝ruby指令碼執行使用的包,將這個檔案放在叢集檔案根目錄下,然後執行

gem install redis-3.0.0.gem

檔案我上傳在了CSDN。

這時我們就可以啟動叢集環境了,執行下面這條命令:

./redis-trib.rb create --replicas 1 192.168.72.121:7001 192.168.72.121:7002 192.168.72.121:7003 192.168.72.121:7004 192.168.72.121:7005  192.168.72.121:7006

從這條命令我們可以看出使用6個節點來建立一個叢集,叢集中每個主節點有1個從節點。執行過程中輸入一個yes就成功了。需要注意的是在真正搭建的時候一定要關閉防火牆。這時候我們檢視程序。

第四步:連線Redis叢集

因為每一個節點都是互聯互通的,所以我們不論連哪個節點都是可以的。

五、使用Java操作Redis

redis的客戶端有很多,從官網中我們可以看出來,不僅支援的語言眾多,而且很多語言有不止一種連線方式。

這裡我們採用在JAVA中使用最廣泛的Jedis作為例項。

1.連線單機版
@Test
    public void testJedis() throws Exception {
        // 第一步:建立一個Jedis物件。需要指定服務端的ip及埠。
        Jedis jedis = new Jedis("192.168.25.153", 6379);
        // 第二步:使用Jedis物件操作資料庫,每個redis命令對應一個方法。
        String result = jedis.get("hello");
        // 第三步:列印結果。
        System.out.println(result);
        // 第四步:關閉Jedis
        jedis.close();
    }

使用起來很簡單,不過通常在連線單機版的時候我們採用的是連線池的方式。

2.連線單機版使用連線池
@Test
    public void testJedisPool() throws Exception {
        // 第一步:建立一個JedisPool物件。需要指定服務端的ip及埠。
        JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
        // 第二步:從JedisPool中獲得Jedis物件。
        Jedis jedis = jedisPool.getResource();
        // 第三步:使用Jedis操作redis伺服器。
        jedis.set("jedis", "test");
        String result = jedis.get("jedis");
        System.out.println(result);
        // 第四步:操作完畢後關閉jedis物件,連線池回收資源。
        jedis.close();
        // 第五步:關閉JedisPool物件。
        jedisPool.close();
    }

連線叢集的方式就又稍微不一樣了。

3.連線叢集版
@Testjava
    public void testJedisCluster() throws Exception {
        // 第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.72.121", 7001));
        nodes.add(new HostAndPort("192.168.72.121", 7002));
        nodes.add(new HostAndPort("192.168.72.121", 7003));
        nodes.add(new HostAndPort("192.168.72.121", 7004));
        nodes.add(new HostAndPort("192.168.72.121", 7005));
        nodes.add(new HostAndPort("192.168.72.121", 7006));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        // 第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。
        jedisCluster.set("hello", "100");
        String result = jedisCluster.get("hello");
        // 第三步:列印結果
        System.out.println(result);
        // 第四步:系統關閉前,關閉JedisCluster物件。
        jedisCluster.close();
    }

覺得本文對你有幫助?請分享給更多人