今天學習了淘淘商城中的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,但這是前端啟動。如果我們想后臺啟動就需要:
①進入redis-3.0.0.tar.gz解壓出來的文件夾,復制里面的redis.conf文件到安裝目錄下。然后將daemonize改為yes
②執行
./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();
}
本文作者: catalinaLi
本文鏈接: http://catalinali.top/2017/buildredis/
版權聲明: 原創文章,有問題請評論中留言。非商業轉載請注明作者及出處。