走進(jìn)Redis:Redis的安裝扶供、使用以及集群的搭建

redis_logo

今天學(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

redis_1

②執(zhí)行./redis-server redis.conf運(yùn)行redis麸祷。這樣redis就后臺(tái)運(yùn)行了,我們可以使用ps aux|grep redis來查看redis的運(yùn)行狀態(tài)
redis_2

我們可以使用以下命令來進(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)閉闲询。

redis_Rdb

通過上圖我們可以看到,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_aof

四、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)圖如下:


redis_cluster

其架構(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)中我們可以看出來,不僅支持的語言眾多,而且很多語言有不止一種連接方式蔚携。

redis_client

這里我們采用在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)注明作者及出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猪瞬,一起剝皮案震驚了整個(gè)濱河市憎瘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陈瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮售,死亡現(xiàn)場(chǎng)離奇詭異痊项,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酥诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鞍泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肮帐,你說我怎么就攤上這事咖驮”咂鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵托修,是天一觀的道長(zhǎng)忘巧。 經(jīng)常有香客問我,道長(zhǎng)睦刃,這世上最難降的妖魔是什么砚嘴? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮涩拙,結(jié)果婚禮上际长,老公的妹妹穿的比我還像新娘。我一直安慰自己兴泥,他們只是感情好工育,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搓彻,像睡著了一般如绸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上好唯,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天竭沫,我揣著相機(jī)與錄音,去河邊找鬼骑篙。 笑死蜕提,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靶端。 我是一名探鬼主播粪糙,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腿宰!你這毒婦竟也來了泽艘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤台谍,失蹤者是張志新(化名)和其女友劉穎须喂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁蕊,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坞生,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掷伙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是己。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖任柜,靈堂內(nèi)的尸體忽然破棺而出卒废,到底是詐尸還是另有隱情沛厨,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布摔认,位于F島的核電站逆皮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏级野。R本人自食惡果不足惜页屠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蓖柔。 院中可真熱鬧辰企,春花似錦、人聲如沸况鸣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镐捧。三九已至潜索,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂酱,已是汗流浹背竹习。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留列牺,地道東北人整陌。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瞎领,于是被迫代替她去往敵國(guó)和親泌辫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴(kuò)展驼修、高可用殿遂、大數(shù)據(jù)存儲(chǔ)問題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方...
    克魯?shù)吕?/span>閱讀 5,268評(píng)論 0 36
  • 前言 Redis 是我們目前大規(guī)模使用的緩存中間件,由于它強(qiáng)大高效而又便捷的功能乙各,得到了廣泛的使用勉躺。單節(jié)點(diǎn)的Red...
    Kevin_ZGJ閱讀 11,667評(píng)論 19 133
  • RedisRedis命令參考網(wǎng)址:http://doc.redisfans.com/ Redis 簡(jiǎn)介Redis ...
    野柳閱讀 1,115評(píng)論 0 9
  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會(huì)跳舞的機(jī)器人閱讀 66,919評(píng)論 2 21
  • 一種生在土地里觅丰,一種生在田野里 地里的耳環(huán)花,是開在枝杈上的妨退。它并非因?yàn)樾嗡贫h(huán)而被我叫做這個(gè)名字妇萄,實(shí)際上蜕企,它的模...
    xixihahalelehe閱讀 4,370評(píng)論 1 1