走進Redis:Redis的安裝、使用以及集群的搭建

redis_logo

今天學習了淘淘商城中的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_1

②執行./redis-server redis.conf運行redis。這樣redis就后臺運行了,我們可以使用ps aux|grep redis來查看redis的運行狀態
redis_2

我們可以使用以下命令來進入操作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默認支持的持久化方案,一直開啟,不會被關閉。

redis_Rdb

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

四、Redis集群的搭建

1.Redis集群特點

Redis集群搭建的方式有多種,例如使用zookeeper等,但從redis3.0之后版本支持redis-cluster集群,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的客戶端有很多,從官網中我們可以看出來,不僅支持的語言眾多,而且很多語言有不止一種連接方式。

redis_client

這里我們采用在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/
版權聲明: 原創文章,有問題請評論中留言。非商業轉載請注明作者及出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

  • 1 Redis介紹1.1 什么是NoSql為了解決高并發、高可擴展、高可用、大數據存儲問題而產生的數據庫解決方...
    克魯德李閱讀 5,336評論 0 36
  • 前言 Redis 是我們目前大規模使用的緩存中間件,由于它強大高效而又便捷的功能,得到了廣泛的使用。單節點的Red...
    Kevin_ZGJ閱讀 11,703評論 19 133
  • RedisRedis命令參考網址:http://doc.redisfans.com/ Redis 簡介Redis ...
    野柳閱讀 1,141評論 0 9
  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會跳舞的機器人閱讀 66,954評論 2 21
  • 一種生在土地里,一種生在田野里 地里的耳環花,是開在枝杈上的。它并非因為形似耳環而被我叫做這個名字,實際上,它的模...
    xixihahalelehe閱讀 4,413評論 1 1