今天學習了淘淘商城中的redis的使用,在這裏把它記錄下來。html
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的安裝目錄。java
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:node
./redis-cli ##進入redis客戶端 ./redis-cli -h 192.168.72.121 -p 6379 ##鏈接指定ip和端口的redis服務器 ./redis-cli shutdown ##關閉redis客戶端
2.redis中的五種類型
先來看幾個操做數據庫的基本命令:linux
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)。而在這五種類型中,咱們最經常使用的是字符串類型,散列類型。這裏簡單介紹一下字符串類型和散列類型:
①字符串類型stringc++
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 ...]
②散列類型hashredis
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
其餘的數據類型就不詳細介紹了,相關資料能夠點擊傳送門shell
Redis的全部數據都是保存到內存中的。
Rdb:快照形式,按期把內存中當前時刻的數據保存到磁盤。Redis默認支持的持久化方案,一直開啓,不會被關閉。
經過上圖咱們能夠看到,dump.rdb會在如下狀況保存一次。數據庫
aof形式:append only file。把全部對redis數據庫操做的命令,增刪改操做的命令。保存到文件中。數據庫恢復時把全部的命令執行一遍便可。要想開啓aof模式須要在redis.conf配置文件中將appendonly改成yesruby
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放到哪一個槽中。
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集羣
由於每個節點都是互聯互通的,因此咱們不論連哪一個節點都是能夠的。
redis的客戶端有不少,從官網中咱們能夠看出來,不只支持的語言衆多,並且不少語言有不止一種鏈接方式。
這裏咱們採用在JAVA中使用最普遍的Jedis做爲實例。
@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(); }
使用起來很簡單,不過一般在鏈接單機版的時候咱們採用的是鏈接池的方式。
@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(); }
鏈接集羣的方式就又稍微不同了。
@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/bu...版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明做者及出處。