今天學(xué)習(xí)了淘淘商城中的redis的使用筛圆,在這里把它記錄下來。
一椿浓、Redis的安裝
Redis的安裝是很簡(jiǎn)單的,安裝之前我們需要c語言的編譯環(huán)境太援。如果沒有g(shù)cc需要在線安裝。yum install gcc-c++
扳碍。
安裝步驟:
第一步:redis的源碼包上傳到linux系統(tǒng)提岔。
第二步:解壓縮redis。tar -zxvf redis-3.0.0.tar.gz
第三步:編譯笋敞。進(jìn)入redis源碼目錄碱蒙。make
第四步:安裝。make install PREFIX=/usr/local/redis
,PREFIX參數(shù)指定redis的安裝目錄夯巷。
二赛惩、Redis的啟動(dòng)與基本操作
1.運(yùn)行redis
在redis的安裝目錄下直接運(yùn)行./redis-server
就可以啟動(dòng)redis,但這是前端啟動(dòng)巧还。如果我們想后臺(tái)啟動(dòng)就需要:
①進(jìn)入redis-3.0.0.tar.gz解壓出來的文件夾,復(fù)制里面的redis.conf文件到安裝目錄下坊秸。然后將daemonize改為yes
②執(zhí)行
./redis-server redis.conf
運(yùn)行redis麸祷。這樣redis就后臺(tái)運(yùn)行了,我們可以使用ps aux|grep redis
來查看redis的運(yùn)行狀態(tài)我們可以使用以下命令來進(jìn)入操作redis:
./redis-cli ##進(jìn)入redis客戶端
./redis-cli -h 192.168.72.121 -p 6379 ##連接指定ip和端口的redis服務(wù)器
./redis-cli shutdown ##關(guān)閉redis客戶端
2.redis中的五種類型
先來看幾個(gè)操作數(shù)據(jù)庫(kù)的基本命令:
KEYS * ##獲得當(dāng)前數(shù)據(jù)庫(kù)的所有鍵
EXISTS key [key ...] ##判斷鍵是否存在,返回個(gè)數(shù)褒搔,如果key有一樣的也是疊加數(shù)
DEL key [key ...] ##刪除鍵阶牍,返回刪除的個(gè)數(shù)
TYPE key ##獲取減值的數(shù)據(jù)類型(string,hash星瘾,list走孽,set,zset)
FLUSHALL ##清空所有數(shù)據(jù)庫(kù)
Expire key second ##設(shè)置key的過期時(shí)間
Ttl key ##查看key的有效期
Persist key ##清除key的過期時(shí)間琳状。Key持久化磕瓷。
redis中所有的數(shù)據(jù)都是Key-value類型的,其中有五種主要數(shù)據(jù)類型:字符串類型(string)念逞,散列類型(hash)困食,列表類型(list),集合類型(set)翎承,有序集合類型(zset)硕盹。而在這五種類型中,我們最常用的是字符串類型叨咖,散列類型瘩例。這里簡(jiǎn)單介紹一下字符串類型和散列類型:
①字符串類型string
SET ##賦值,用法: SET key value
GET ##取值甸各,用法: GET key
INCR ##遞增數(shù)字垛贤,僅僅對(duì)數(shù)字類型的鍵有用,相當(dāng)于Java的i++運(yùn)算趣倾,用法: INCR key
INCRBY ##增加指定的數(shù)字聘惦,僅僅對(duì)數(shù)字類型的鍵有用,相當(dāng)于Java的i+=3誊酌,用法:INCRBY key increment部凑,意思是key自增increment,increment可以為負(fù)數(shù)碧浊,表示減少涂邀。
DECR ##遞減數(shù)字,僅僅對(duì)數(shù)字類型的鍵有用箱锐,相當(dāng)于Java的i–比勉,用法:DECR key
DECRBY ##減少指定的數(shù)字,僅僅對(duì)數(shù)字類型的鍵有用,相當(dāng)于Java的i-=3浩聋,用法:DECRBY key decrement观蜗,意思是key自減decrement,decrement可以為正數(shù)衣洁,表示增加墓捻。
INCRBYFLOAT ##增加指定浮點(diǎn)數(shù),僅僅對(duì)數(shù)字類型的鍵有用坊夫,用法:INCRBYFLOAT key increment
APPEND ##向尾部追加值砖第,相當(dāng)于Java中的”hello”.append(“ world”),用法:APPEND key value
STRLEN ##獲取字符串長(zhǎng)度环凿,用法:STRLEN key
MSET ##同時(shí)設(shè)置多個(gè)key的值梧兼,用法:MSET key1 value1 [key2 value2 ...]
MGET ##同時(shí)獲取多個(gè)key的值,用法:MGET key1 [key2 ...]
②散列類型hash
HSET ##賦值智听,用法:HSET key field value
HMSET ##一次賦值多個(gè)字段羽杰,用法:HMSET key field1 value1 [field2 values]
HGET ##取值,用法:HSET key field
HMGET ##一次取多個(gè)字段的值到推,用法:HMSET key field1 [field2]
HGETALL ##一次取所有字段的值考赛,用法:HGETALL key
HEXISTS ##判斷字段是否存在,用法:HEXISTS key field
HSETNX ##當(dāng)字段不存在時(shí)賦值环肘,用法:HSETNX key field value
HINCRBY ##增加數(shù)字欲虚,僅對(duì)數(shù)字類型的值有用,用法:HINCRBY key field increment
HDEL ##刪除字段悔雹,用法:HDEL key field
HKEYS ##獲取所有字段名,用法:HKEYS key
HVALS ##獲取所有字段值欣喧,用法:HVALS key
HLEN ##獲取字段數(shù)量腌零,用法:HLEN key
其他的數(shù)據(jù)類型就不詳細(xì)介紹了,相關(guān)資料可以點(diǎn)擊傳送門
三唆阿、Redis的持久化方案
Redis的所有數(shù)據(jù)都是保存到內(nèi)存中的益涧。
Rdb:快照形式,定期把內(nèi)存中當(dāng)前時(shí)刻的數(shù)據(jù)保存到磁盤驯鳖。Redis默認(rèn)支持的持久化方案,一直開啟,不會(huì)被關(guān)閉闲询。
通過上圖我們可以看到,dump.rdb會(huì)在以下情況保存一次。
- 900秒(15分鐘)之內(nèi)至少有1個(gè)KEY進(jìn)行了改變
- 300秒(5分鐘)之內(nèi)至少有10個(gè)KEY進(jìn)行了改變
- 60秒(1分鐘)之內(nèi)至少有10000個(gè)KEY進(jìn)行了改變
aof形式:append only file浅辙。把所有對(duì)redis數(shù)據(jù)庫(kù)操作的命令扭弧,增刪改操作的命令。保存到文件中记舆。數(shù)據(jù)庫(kù)恢復(fù)時(shí)把所有的命令執(zhí)行一遍即可鸽捻。要想開啟aof模式需要在redis.conf配置文件中將appendonly改為yes
四、Redis集群的搭建
1.Redis集群特點(diǎn)
Redis集群搭建的方式有多種,例如使用zookeeper等御蒲,但從redis3.0之后版本支持redis-cluster集群衣赶,Redis-Cluster采用無中心結(jié)構(gòu),每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和整個(gè)集群狀態(tài),每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接厚满。其redis-cluster架構(gòu)圖如下:
其架構(gòu)細(xì)節(jié):
1府瞄、所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。
2碘箍、節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效摘能。
3、客戶端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可敲街。
4团搞、redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上(不一定是平均分配),cluster 負(fù)責(zé)維護(hù)node<->slot<->value。
5多艇、Redis集群預(yù)分好16384個(gè)哈希槽逻恐,當(dāng)需要在 Redis 集群中放置一個(gè) key-value 時(shí),根據(jù) CRC16(key) mod 16384的值峻黍,決定將一個(gè)key放到哪個(gè)槽中复隆。
2.Redis集群環(huán)境搭建
Redis集群中至少應(yīng)該有三個(gè)節(jié)點(diǎn)。要保證集群的高可用姆涩,需要每個(gè)節(jié)點(diǎn)有一個(gè)備份機(jī)挽拂。
Redis集群至少需要6臺(tái)服務(wù)器。由于條件限制,這里采用與淘淘商城相同的方式搭建偽分布式骨饿。在一臺(tái)虛擬機(jī)運(yùn)行6個(gè)redis實(shí)例亏栈。需要修改redis的端口號(hào)7001-7006。
第一步:創(chuàng)建6個(gè)redis實(shí)例宏赘,每個(gè)實(shí)例運(yùn)行在不同的端口绒北。需要修改redis.conf配置文件,將端口號(hào)修改成7001-7006。除此之外,還需要把cluster-enabled yes前的注釋去掉察署。
第二步:?jiǎn)?dòng)每個(gè)redis實(shí)例闷游。這里我們可以自己寫一個(gè)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 ..
關(guān)閉集群的腳本也類似:
./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
記得在運(yùn)行腳本前要添加可執(zhí)行(x)的權(quán)限:chmod u+x fileName.sh
第三步:使用ruby腳本搭建集群。
首先我們需要安裝ruby運(yùn)行環(huán)境
yum install ruby
yum install rubygems
然后我們需要安裝ruby腳本運(yùn)行使用的包,將這個(gè)文件放在集群文件根目錄下贴汪,然后運(yùn)行
gem install redis-3.0.0.gem
文件我上傳在了CSDN脐往。
這時(shí)我們就可以啟動(dòng)集群環(huán)境了,運(yùn)行下面這條命令:
./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個(gè)節(jié)點(diǎn)來創(chuàng)建一個(gè)集群,集群中每個(gè)主節(jié)點(diǎn)有1個(gè)從節(jié)點(diǎn)扳埂。運(yùn)行過程中輸入一個(gè)yes就成功了业簿。需要注意的是在真正搭建的時(shí)候一定要關(guān)閉防火墻。這時(shí)候我們查看進(jìn)程
第四步:連接Redis集群
因?yàn)槊恳粋€(gè)節(jié)點(diǎn)都是互聯(lián)互通的,所以我們不論連哪個(gè)節(jié)點(diǎn)都是可以的聂喇。
五辖源、使用Java操作Redis
redis的客戶端有很多,從官網(wǎng)中我們可以看出來,不僅支持的語言眾多,而且很多語言有不止一種連接方式蔚携。
這里我們采用在JAVA中使用最廣泛的Jedis作為實(shí)例。
1.連接單機(jī)版
@Test
public void testJedis() throws Exception {
// 第一步:創(chuàng)建一個(gè)Jedis對(duì)象克饶。需要指定服務(wù)端的ip及端口酝蜒。
Jedis jedis = new Jedis("192.168.25.153", 6379);
// 第二步:使用Jedis對(duì)象操作數(shù)據(jù)庫(kù),每個(gè)redis命令對(duì)應(yīng)一個(gè)方法矾湃。
String result = jedis.get("hello");
// 第三步:打印結(jié)果亡脑。
System.out.println(result);
// 第四步:關(guān)閉Jedis
jedis.close();
}
使用起來很簡(jiǎn)單,不過通常在連接單機(jī)版的時(shí)候我們采用的是連接池的方式。
2.連接單機(jī)版使用連接池
@Test
public void testJedisPool() throws Exception {
// 第一步:創(chuàng)建一個(gè)JedisPool對(duì)象邀跃。需要指定服務(wù)端的ip及端口霉咨。
JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
// 第二步:從JedisPool中獲得Jedis對(duì)象。
Jedis jedis = jedisPool.getResource();
// 第三步:使用Jedis操作redis服務(wù)器拍屑。
jedis.set("jedis", "test");
String result = jedis.get("jedis");
System.out.println(result);
// 第四步:操作完畢后關(guān)閉jedis對(duì)象途戒,連接池回收資源。
jedis.close();
// 第五步:關(guān)閉JedisPool對(duì)象僵驰。
jedisPool.close();
}
連接集群的方式就又稍微不一樣了喷斋。
3.連接集群版
@Testjava
public void testJedisCluster() throws Exception {
// 第一步:使用JedisCluster對(duì)象。需要一個(gè)Set<HostAndPort>參數(shù)蒜茴。Redis節(jié)點(diǎn)的列表星爪。
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對(duì)象操作redis。在系統(tǒng)中單例存在粉私。
jedisCluster.set("hello", "100");
String result = jedisCluster.get("hello");
// 第三步:打印結(jié)果
System.out.println(result);
// 第四步:系統(tǒng)關(guān)閉前顽腾,關(guān)閉JedisCluster對(duì)象。
jedisCluster.close();
}
本文作者: catalinaLi
本文鏈接: http://catalinali.top/2017/buildredis/
版權(quán)聲明: 原創(chuàng)文章诺核,有問題請(qǐng)?jiān)u論中留言抄肖。非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。