本文作者: catalinaLi本文連結: http://catalinali.top/2017/buildredis/版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明作者及出處。
一、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操作Redisredis的客戶端有很多,從官網中我們可以看出來,不僅支持的語言眾多,而且很多語言有不止一種連接方式。
這裡我們採用在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();
}
相關文章推薦
Spring 註解概覽
《阿里巴巴Java開發手冊》掃描插件正式發布--插件安裝和使用分析
徹底徵服 Spring AOP 之 理論篇
相關講堂推薦