走進 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架構圖如下:
其架構細節:
- 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
- 節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
- 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
- redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。
- 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();
}
覺得本文對你有幫助?請分享給更多人