1. 程式人生 > >redis的安裝和命令的使用(史上最全命令集合)

redis的安裝和命令的使用(史上最全命令集合)

                                     redis的安裝和使用       


1. redis介紹
1.1 什麼是NoSQL


NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。目前一些主流的NOSQL

產品:
1.2 NoSQL資料庫的分類
1.2.1 鍵值(Key-Value)儲存資料庫
相關產品有Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB,主要應用於內容快取,主要用於處理大量資料的高訪問負載。
1.2.2 列儲存資料庫
相關產品有Cassandra, HBase, Riak,典型應用於分散式的檔案系統。
1.2.3 文件型資料庫
相關產品有CouchDB、MongoDB,典型應用於Web應用,可以突破傳統關係型資料庫的結構限制,儲存資料更為靈活。
1.2.4 圖形(Graph)資料庫
相關資料庫有Neo4J、InfoGrid、Infinite Graph,典型應用於社交網路,儲存資料採用圖結構利用圖結構相關演算法。
1.3 什麼是redis


1.4 redis歷史發展
2008年,義大利的一家創業公司Merzia推出了一款基於MySQL的網站實時統計系統LLOOGG,然而沒過多久該公司的創始人 Salvatore Sanfilippo便 對MySQL的效能感到失望,於是他決定親自為LLOOGG量身定做一個數據庫,並於2009年開發完成,這個資料庫就是Redis。 不過Salvatore Sanfilippo
並不滿足只將Redis用於LLOOGG這一款產品,而是希望更多的人使用它,於是在同一年Salvatore Sanfilippo將Redis開源釋出,並開始和Redis的另一名主要的程式碼貢獻者Pieter Noordhuis一起繼續著Redis的開發,直到今天。
Salvatore Sanfilippo自己也沒有想到,短短的幾年時間,Redis就擁有了龐大的使用者群體。Hacker News在2012年釋出了一份資料庫的使用情況調查,結果顯示有近12%的公司在使用Redis。國內如新浪微博、街旁網、知乎網,國外如GitHub、Stack Overflow、Flickr等都是Redis的使用者。
VMware公司從2010年開始贊助Redis的開發, Salvatore Sanfilippo和Pieter Noordhuis也分別在3月和5月加入VMware,全職開發Redis。完全免費
1.5 redis的應用場景
Redis廣泛應用於快取,布式叢集架構中的session分離,聊天室的線上好友列表,任務佇列,應用排行榜,網站訪問統計,資料過期處理等場景。
2. redis的安裝


2.1 redis安裝環境
redis是C語言開發,建議在linux上執行,本教程使用Centos6.4作為安裝環境。
安裝redis需要先將官網下載的原始碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc:yum install gcc-c++。
2.2 redis安裝
我們使用的Redis版本為redis3.0版本,首先可以從官網下載Redis壓縮包http://download.redis.io/releases/redis-3.0.0.tar.gz,然後將下載的redis上傳到虛擬機器的/usr/local目錄下。


接下來解壓Redis壓縮包,使用命令:tar -zxvf redis-3.0.7.tar.gz


進入解壓後的目錄進行編譯和安裝,編譯使用命令make,安裝使用命令make install。安裝成功後執行Redis服務,如果出現以下介面,則Redis安裝成功,啟動命令:redis-server。


Redis安裝之後,我們在/usr/local/bin下可以發現編譯之後的Redis執行檔案。


2.3 redis的啟動
2.3.1 前端模式啟動
直接執行redis-server將以前端模式啟動,前端模式啟動的缺點是佔用終端,同時ssh命令視窗關閉則redis-server程式結束,所以不推薦使用此方法。
2.3.2 後端模式啟動
修改redis.conf配置檔案, 將daemonize 設定yes 以後即可以後端模式來啟動Redis。


修改之後用當前修改後的配置檔案來啟動Redis伺服器。


此時我們可以使用命令的方式檢視服務是否已經啟動。


我們發現Redis服務已經啟動,預設使用6379埠。
2.3.3 啟動多個redis程序
啟動多個Redis服務,一般採用定義多個對應的配置檔案的方式來啟動不同配置的Redis服務,同時需要分別修改每一個Redis伺服器啟動的埠號。這裡我們啟動兩個Redis伺服器,分別使用6379和6380埠。
首先我們建立兩個目錄。


在兩個目錄中定義redis的配置檔案,這裡我們將redis預設的配置檔案拷貝過來,並修改對應的埠號,然後分別啟動兩個Redis服務。


2.4 redis的停止
要停止正在執行的Redis服務,可以採用Linux命令的方式直接殺掉Redis服務的程序,也可以使用Redis客戶端想伺服器傳送shutdown指令來關閉Redis伺服器。


2.5 使用redis客戶端
在redis的安裝目錄中有redis的客戶端,即redis-cli(Redis Command Line Interface),它是Redis自帶的基於命令列的Redis客戶端。
2.5.1 連線Redis伺服器
使用redis-cli命令即可連線預設的本機6379埠的Redis伺服器。如下圖表示連線成功。


如果希望遠端連線其他主機或者其他埠的Redis伺服器,可以加上以下的引數,使用-h設定遠端主機的ip,使用-p設定遠端主機的埠號。


2.5.2 向Redis伺服器傳送命令
redis-cli連上redis服務後,可以在命令列向Redis伺服器傳送命令。
1.5.1.1 ping命令
Redis提供了PING命令來測試客戶端與Redis的連線是否正常,如果連線正常會收到回覆PONG。


1.5.1.2 set/get命令
使用set和get可以向redis設定資料、獲取資料。


1.5.1.3 del命令
del命令用來刪除指定key的內容。


1.5.1.4 keys*命令
keys*命令用來檢視當前redis資料庫中存在的key的名稱。


1.5.1.5 flushdb命令
flushdb命令用來清空當前資料庫中的所有資料。


2.6 Redis多資料庫
一個Redis資料庫可以包括多個數據庫,客戶端可以指定連線某個redis例項的哪個資料庫,就好比一個mysql中建立多個數據庫,客戶端連線時指定連線哪個資料庫。一個redis例項預設提供16個數據庫,這由啟動的配置檔案中指定,下標從0到15,客戶端預設連線第0號資料庫,也可以通過select選擇連線哪個資料庫,不同資料庫中的資料不能共享。


需要注意的問題是,如果我們使用flushall命令清空某一個庫中的資料時,其他庫中的資料也會被清空,因此,在我們不同的業務訪問Redis伺服器時應該選擇不同的Redis伺服器,而不是同一個伺服器內部的不同的資料庫。


3. Jedis的使用
3.1 Jedis介紹
Redis不僅是使用命令來操作,現在基本上主流的語言都有客戶端支援,比如java、C、C#、C++、php、Node.js、Go等。
在官方網站裡列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推薦使用Jedis和Redisson。 在企業中用的最多的就是Jedis,下面我們就重點學習下Jedis。
3.2 通過jedis連線redis
3.2.1 新增jar包
要使用Jedis需要加入Jedis對應的jar包。我們使用maven來構建工程,因此直接使用jedis的jar包依賴座標即可。

 <dependency>
 <groupId>redis.clients</groupId> 
 <artifactId>jedis</artifactId>
 <version>2.7.0</version>
 </dependency>


Maven會自動在工程中新增jedis需要依賴的jar包。


3.2.2 單例項連線Redis
通過建立單例項jedis物件連線redis服務,直接建立Jedis物件即可,如下
程式碼:

package com.igeek.redis_jedis_01; 
import org.junit.Test; 
import redis.clients.jedis.Jedis; 
public class AppTest{ 
@Test 
public void testJedisSingle() { 
//建立Jedis物件,傳遞兩個引數:第一個host為redis伺服器的名稱,第二個為redis伺服器的埠號
 Jedis jedis = new Jedis("192.168.5.128", 6379); 
 //進行設值操作 
jedis.set("username","zhangsan");
 //從redis中取值 
String username = jedis.get("username");
 System.out.println("username:"+username);
 }
}


3.2.3 使用連線池連線Redis
通過單例項連線redis不能對redis連線進行共享,可以使用連線池對redis連線進行共享,提高資源利用率,使用jedisPool連線redis服務,如下程式碼:

package com.igeek.redis_jedis_01; 
import org.junit.Test; 
import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool; 
import redis.clients.jedis.JedisPoolConfig;
 public class AppTest{ 
@Test
public void testJedisPool(){ 
//建立JedisPool連線池配置 
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
//設定連線池的最大連線數 
jedisPoolConfig.setMaxTotal(20); 
//設定連線池的最大連線空閒數 
jedisPoolConfig.setMaxIdle(2); 
//設定redis伺服器的主機 
String host = "192.168.5.128"; 
//設定redis伺服器的埠 
int port = 6379; 
//建立JedisPool連線池物件 
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port);
 //獲取Jedis物件
 Jedis jedis = jedisPool.getResource(); 
//存入資料 
jedis.set("info", "message"); 
//獲取資料 
String info = jedis.get("info"); 
System.out.println("info:"+info); 
//關閉資源 
jedisPool.close(); 
} 
}


4. redis的資料型別
4.1 String型別
redis中沒有使用C語言的字串表示,而是自定義一個數據結構叫SDS(simple dynamic string)即簡單動態字串。redis的字串是二進位制安全的,
存入什麼資料取出的還是什麼資料。
String型別的的常用命令有:
4.1.1 賦值命令
redis中賦值操作使用set命令,語法 set key value。
範例:向redis中插入資料,鍵為name,值為zhangsan。


如果希望一次性插入多條資料,可以使用mset命令,語法mset key1 value1 key2 value2 …
範例:一次性向redis中插入以下資料,id為1,age為 20。


4.1.2 取值命令
redis中進行取值操作使用get命令,語法:get key。
範例:獲取鍵為name的資料的值


需要注意的是,如果通過get命令獲取資料時,給定的鍵不存在,則返回(nil),表示查詢結果為空。
如果希望一次性從redis中獲取多個鍵對應的資料的值,可以使用mget命令,語法:mget key1 key2 …
範例:獲取redis中id,name,age的資料的值。


我們也可以使用getset命令,在獲取對應鍵的資料的同時,為該鍵指定新的值。語法:getset key newValue。
範例:獲取name對應的名稱,並將名稱的值改為lisi。


4.1.3 刪除命令
在Redis中刪除資料使用del命令,語法:del key。
範例:刪除id對應的資料的值。


如果需要直接清空該庫中所有資料,可以使用flushdb命令。
範例:清空當前資料庫中的資料。


如果要清空所有庫中的所有資料使用flushall命令。
範例:清理redis所有庫中的所有資料。


4.1.4 數值遞增
當儲存的字串是整數時,Redis提供了一個實用的命令incr,其作用是讓當前鍵值遞增,並返回遞增後的值。語法:incr key。
範例:向資料庫中插入資料num初始值為1,然後自增加1。


以上的自增表示每次加1,如果需要按照指定的資料來進行增長,可以使用incrby命令,語法:incrby key increment。
範例:使用incrby命令將num的資料值加10。


4.1.5 數值遞減
當需要對資料進行遞減操作時,使用decr命令,語法:decr key。
範例:將num對應資料的值遞減1。


如果希望遞減指定的數值,可以使用decrby,語法:decrby key decrement。
範例:將num對應資料的值減10.


4.1.6 追加資料
在Redis中可以使用append命令向指定資料的末尾追加內容,語法:append key value。
範例:向info資料的末尾新增內容。


注意:在插入資料時,字串的雙引號預設可以省略,但是如果字串中包含空格的情況,需要加上雙引號,否則空格會被忽略。
4.1.7 獲取長度
使用strlen命令可以返回指定鍵對應的值的長度,如果鍵不存在則返回0。語法:strlen key。
範例:獲取info對應的資料的長度。


4.2 hash型別
hash叫雜湊型別,它提供了欄位和欄位值的對映。欄位值只能是字串型別,不支援雜湊型別、集合型別等其它型別。
hash型別的的常用命令有:
4.2.1 賦值命令
向hash中插入獲設定資料沒使用hset命令,語法:hset key field value。
範例:向redis中插入user的name屬性值為songjiang。


如果希望從redis中一次性設定多個欄位的值,可以使用hmset,語法:hmset key field1 value1 field2 value2 …
範例:向redis中插入user的id和age屬性。


4.2.2 取值命令
從hash中獲取資料使用hget命令,語法:hget key field。
範例:獲取user的name屬性的值。


使用hmget可以一次性獲取多個欄位的值。語法:hmget key field1 field2 field3 …
範例:獲取user的id,name,age欄位的值。


可以使用hgetall命令,或者指定鍵的所有欄位和欄位的值。語法:hgetall key。
使用HKEYS和HVALS命令可以分別用來獲取指定鍵的所有鍵和所有值。
範例:獲取user的所有鍵和所有值。


4.2.3 判斷欄位是否存在
判斷欄位是否存在使用HEXISTS命令,如果存在則返回1,如果不存在則返回0 ,語法:HEXISTS key field
範例:判斷user是否存在。


4.2.4 獲取欄位數量
獲取欄位數量使用HLEN命令,如果鍵不存在則返回0,語法HLEN key。
範例:獲取指定鍵的資料中鍵的數量。


4.2.5 刪除命令
要刪除一個或多個欄位,使用hdel命令,語法:HDEL key field [field ...]。
範例:刪除user的id欄位的值。


範例:刪除user的name和age欄位。


4.2.6 增加數字
如果hash中的欄位儲存的值為數值型別,可以進行自增操作。語法:HINCRBY key field increment。
範例:將user的age欄位的值增加1.


4.3 list型別
列表型別(list)可以儲存一個有序的字串列表,常用的操作是向列表兩端新增元素,或者獲得列表的某一個片段。
列表型別內部是使用雙向連結串列(double linked list)實現的,所以向列表兩端新增元素的時間複雜度為0(1),獲取越接近兩端的元素速度就越快。這意味著即使是一個有幾千萬個元素的列表,獲取頭部或尾部的10條記錄也是極快的。
list型別的的常用命令有:
4.3.1 新增資料
Redis列表採用雙向連結串列實現,因此在插入資料時可以從兩端分別操作,向列表左邊增加元素使用lpush命令,向列表右邊增加元素使用rpush命令。
範例:向列表中插入資料


4.3.2 檢視列表
LRANGE命令是列表型別最常用的命令之一,獲取列表中的某一片段,將返回start、stop之間的所有元素(包含兩端的元素),索引從0開始。索引可以是負數,如:“-1”代表最後邊的一個元素。
範例:獲取列表nums和nums2中的資料


從以上獲取的資料結構來看,我們發現從列表的左側插入資料,在列表中資料以倒敘存放,從列表的右側插入資料則是正序存放。
4.3.3 獲取資料
在列表中可以使用lpop和rpop分別列表的左側和右側彈出一個數據,該資料會首先返回,然後再從原列表中刪除。
範例:彈出nums的左側資料。


範例:彈出nums的右側資料。


4.3.4 獲取列表中元素的個數
使用LLEN命令可以獲取列表中元素的個數。範例:LLEN key
範例:獲取nums2列表中元素的個數。


4.3.5 刪除列表中指定的值
LREM命令會刪除列表中前count個值為value的元素,返回實際刪除的元素個數。根據count值的不同,該命令的執行方式會有所不同:
 當count>0時, LREM會從列表左邊開始刪除。
 當count<0時, LREM會從列表後邊開始刪除。
 當count=0時, LREM刪除所有值為value的元素。
範例:刪除nums中的4元素


4.3.6 獲得/設定指定索引的元素值 獲得或者設定指定索引的元素值分別使用lindex和lset命令。
範例:獲取nums列表中索引2對應的資料


範例:將nums中索引2對應的資料改為x\


4.3.7 只保留列表指定片段
List中使用ltrim命令對列表中的資料進行擷取操作,只保留指定資料片段。語法:ltrim key start stop。
範例:擷取nums列表中索引從1開始到3的資料


4.3.8 向列表中插入元素
向列表中指定位置插入元素可以使用linsert命令,語法:LINSERT key BEFORE|AFTER pivot value。
範例:向nums列表中的x元素後面插入元素y


4.3.9 將元素從一個列表轉移到另一個列表中
使用RPOPLPUSH命令可以將元素從一個列表轉移到另一個列表中。語法:RPOPLPUSH source destination。
範例:將元素從一個列表轉移到另一個列表中


4.4 set型別
集合型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合型別的Redis內部是使用值為空的散列表實現,所有這些操作的時間複雜度都為0(1)。 Redis還提供了多個集合之間的交集、並集、差集的運算。
set型別的的常用命令有:
4.4.1 增加/刪除元素
集合中新增資料使用sadd命令,語法sadd key member [member…].
範例:向set集合中新增資料


4.4.2 獲得集合中的所有元素
獲取集合中所有元素使用SMEMBERS命令,語法:SMEMBERS key
範例:獲取set集合中的所有元素


4.4.3 集合的差集運算
屬於A並且不屬於B的元素構成的集合,使用命令SDIFF,語法:SDIFF key [key ...]
範例:集合的差集


4.4.4 集合的交集運算
屬於A並且也屬於B的元素構成的集合,使用命令SINTER,語法:SINTER key [key ...]
範例:集合的交集


4.4.5 集合的並集運算
屬於A並且或者屬於B的元素構成的集合,使用命令SUNION,語法:SUNION key [key ...]
範例:集合的並集


4.4.6 獲得集合中元素的個數 獲得集合中元素的個數,使用SCARD命令,如果集合不存在則返回0,語法:SCARD key
範例:獲取集合set中元素的個數


4.4.7 從集合中彈出一個元素
從集合中彈出一個元素使用spop命令,語法:spop key
範例:從set集合中彈出一個元素


4.5 sorted set型別
在集合型別的基礎上有序集合型別為集合中的每個元素都關聯一個分數,這
使得我們不僅可以完成插入、刪除和判斷元素是否存在在集合中,還能夠獲得分數最高或最低的前N個元素、獲取指定分數範圍內的元素等與分數有關的操作。
在某些方面有序集合和列表型別有些相似。
1、二者都是有序的。
2、二者都可以獲得某一範圍的元素。
但是,二者有著很大區別:
1、列表型別是通過連結串列實現的,獲取靠近兩端的資料速度極快,而當元素增多後,訪問中間資料的速度會變慢。
2、有序集合型別使用散列表實現,所有即使讀取位於中間部分的資料也很快。
3、列表中不能簡單的調整某個元素的位置,但是有序集合可以(通過更改分數實現)
4、有序集合要比列表型別更耗記憶體。
sorted set型別的的常用命令有:
4.5.1 增加元素
向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。語法:ZADD key score member [score member ...]
範例:向有序集合中新增資料


4.5.2 獲得排名在某個範圍的元素列表
獲得排名在某個範圍的元素列表使用zrange命令,語法:ZRANGE key start stop [WITHSCORES]
範例:獲取score中的元素


以上是根據分數進行升序排列,如果要進行降序排列,我們使用命令ZREVRANGE。
範例:降序獲取score中的元素


4.5.3 刪除元素
移除有序集key中的一個或多個成員使用命令ZREM,不存在的成員將被忽略。語法:ZREM key member [member ...]
範例:移除score中zhangsan元素


4.5.4 獲得指定分數範圍的元素
獲得指定分數範圍的元素使用ZRANGEBYSCORE命令,語法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
範例:獲取score中分數在60 – 80分之間的資料元素。


4.5.5 增加某個元素的分數,返回值是更改後的分數
增加某個元素的分數,返回值是更改後的分數,使用命令ZINCRBY,語法:ZINCRBY key increment member
範例:給lisi加4分


4.5.6 獲得集合中元素的數量
獲取集合中元素的數量使用ZCARD命令,語法:ZCARD key。
範例:獲取score集合中元素的個數


4.5.7 獲得指定分數範圍內的元素個數
獲得指定分數範圍內的元素個數使用命令zcount,語法:ZCOUNT key min max。
範例:獲取score中分數在70-90之間的元素個數


4.5.8 按照排名範圍刪除元素
按照排名範圍刪除元素使用命令ZREMRANGEBYRANK,語法:ZREMRANGEBYRANK key start stop
範例:刪除score中排名前兩位的元素


4.5.9 按照分數範圍刪除元素
按照分數範圍刪除元素使用命令ZREMRANGEBYSCORE,語法:ZREMRANGEBYSCORE key start stop
範例:刪除score中分數在60 -80之間的元素


4.5.10 獲取元素的排名
獲取元素的排名使用zrank命令,語法:ZRANK key member
範例:檢視score中qianqi的排名


以上是升序後的排名,如果要使用倒序排名使用命令ZREVRANK。
範例:檢視score中qianqi的倒序排名


5. redis的其他命令
5.1 設定key的生存時間
Redis在實際使用過程中更多的用作快取,然而快取的資料一般都是需要設定生存時間的,即:到期後資料銷燬。

EXPIRE key seconds 設定key的生存時間(單位:秒)key在多少秒後會自動刪除
TTL key 檢視key生於的生存時間
PERSIST key 清除生存時間
PEXPIRE key milliseconds 生存時間設定單位為:毫秒


範例:key生存時間的設定


5.2 返回滿足給定pattern 的所有key
Redis中可以使用pattern來獲取鍵的名稱。
範例:檢視所有以user開頭的鍵


5.3 重新命名key
重新命名key使用命令rename,語法:rename name newName
範例:將名為username的鍵改為user_name


5.4 返回值的型別
使用type命令可以返回指定鍵的值的型別,語法:type key。
範例:獲取user_name的資料的型別


5.5 返回當前資料庫中key 的數目
返回當前資料庫中key的數目使用dbsize命令。
範例:獲取當前資料庫中key的數目


5.6 獲取伺服器的資訊和統計
獲取伺服器的資訊和統計使用info命令。
範例:獲取伺服器資訊

127.0.0.1:6379> info
# Server
redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9310b523e663e7ad
redis_mode:standalone
os:Linux 2.6.32-431.el6.i686 i686
arch_bits:32
multiplexing_api:epoll
gcc_version:4.4.7
process_id:1296
run_id:89f7fd18598e38523ccd3dd89b144a7013f3bef3
tcp_port:6379
uptime_in_seconds:28310
uptime_in_days:0
hz:10
lru_clock:16746523
config_file:/usr/local/6379/./redis.conf
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:658112
used_memory_human:642.69K
used_memory_rss:1904640
used_memory_peak:658328
used_memory_peak_human:642.90K
used_memory_lua:24576
mem_fragmentation_ratio:2.89
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1509918442
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:5
total_commands_processed:287
instantaneous_ops_per_sec:0
total_net_input_bytes:10452
total_net_output_bytes:13479
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:1
evicted_keys:0
keyspace_hits:98
keyspace_misses:10
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1469
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:28.60
used_cpu_user:15.06
used_cpu_sys_children:0.03
used_cpu_user_children:0.01
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=4,expires=0,avg_ttl=0


此時我們發現使用info獲取的資料資訊很豐富,如果只需要獲取某一個方便的資訊,可以使用info加上需要的資訊的名稱。
範例:獲取資料庫的CPU資訊。


5.7 退出連線
6. redis的持久化
Redis的高效能是由於其將所有資料都儲存在了記憶體中,為了使Redis在重啟之後仍能保證資料不丟失,需要將資料從記憶體中同步到硬碟中,這一過程就是持久化。
Redis支援兩種方式的持久化,一種是RDB方式,一種是AOF方式。可以單獨使用其中一種或將二者結合使用。
6.1 RDB持久化
RDB方式的持久化是通過快照(snapshotting)完成的,當符合一定條件時Redis會自動將記憶體中的資料進行快照並持久化到硬碟。
RDB是Redis預設採用的持久化方式,在redis.conf配置檔案中預設有此下配置:

save 900 1
save 300 10
save 60 10000


save 開頭的一行就是持久化配置,可以配置多個條件(每行配置一個條件),每個條件之間是“或”的關係,“save 900 1”表示15分鐘(900秒鐘)內至少1個鍵被更改則進行快照,“save 300 10”表示5分鐘(300秒)內至少10個鍵被更改則進行快照。
Redis啟動後會讀取RDB快照檔案,將資料從硬碟載入到記憶體。根據資料量
大小與結構和伺服器效能不同,這個時間也不同。通常將記錄一千萬個字串型別鍵、大小為1GB的快照檔案載入到記憶體中需要花費20~30秒鐘。
如果開啟了RDB,Redis預設會在啟動當前服務的目錄自動建立資料檔案。通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最後一次快照以後更改的所有資料。這就需要開發者根據具體的應用場合,通過組合設定自動快照條件的方式來將可能發生的資料損失控制在能夠接受的範圍。如果資料很重要以至於無法承受任何損失,則可以考慮使用AOF方式進行持久化。
6.2 AOF持久化
預設情況下Redis沒有開啟AOF(append only file)方式的持久化,可以通過appendonly引數開啟:appendonly yes
開啟AOF持久化後每執行一條會更改Redis中的資料的命令,Redis就會將該命令寫入硬碟中的AOF檔案。AOF檔案的儲存位置和RDB檔案的位置相同,都是通過dir引數設定的,預設的檔名是appendonly.aof,可以通過appendfilename引數修改:appendfilename appendonly.aof
7. redis的主從複製
7.1 什麼是主從複製
持久化保證了即使redis服務重啟也會丟失資料,因為redis服務重啟後會將硬碟上持久化的資料恢復到記憶體中,但是當redis伺服器的硬碟損壞了可能會導致資料丟失,如果通過redis的主從複製機制就可以避免這種單點故障。


說明:
 主redis中的資料有兩個副本(replication)即從redis1和從redis2,即使一臺redis伺服器宕機其它兩臺redis服務也可以繼續提供服務。
 主redis中的資料和從redis上的資料保持實時同步,當主redis寫入資料時通過主從複製機制會複製到兩個從redis服務上。
 只有一個主redis,可以有多個從redis。
 主從複製不會阻塞master,在同步資料時,master 可以繼續處理client 請求
7.2 主從複製實現
在Redis從伺服器上新增其對應的主伺服器的資訊,修改從redis伺服器上的redis.conf檔案,新增slaveof 主redis伺服器的ip 和埠號。


啟動主從伺服器之後即完成了對Redis主從複製的配置。
 

 

單服務程式碼使用:

package com.igeek.jedis;

import java.util.List;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author www.igeehome.com
 * 
 * TODO
 *
 * 2018年11月14日下午7:27:22
 */
public class JedisTest {
	Jedis jedis = null;
	
	JedisPool pool = null;
	
	
	@Before
	public void before(){
		//jedis = new Jedis("192.168.229.112", 6379);
		
		//pool = new JedisPool("192.168.229.112", 6379); //預設配置
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(20);
		config.setMaxTotal(50);
		pool = new JedisPool(config, "192.168.229.112", 6379);
		jedis = pool.getResource();
	}
	
	@Test
	public void testOther(){
		boolean flag = jedis.exists("jlist1");
		Long incr = jedis.incr("k1");
		
		jedis.expire("jlist", 50);
		Long ttl = jedis.ttl("jlist");
	}
	
	
	@Test
	public void testList1(){
		List<String> lrange = jedis.lrange("jlist", 0, -1);
		System.out.println(lrange);
	}
	
	@Test
	public void testList(){
		jedis.lpush("jlist", "1","2","3");
	}
	
	@Test
	public void testHash(){
		jedis.hset("user1", "name", "zhangsan");
		jedis.hset("user1", "age", "18");
		jedis.hset("user1", "gender", "1");
	}
	
	@Test
	public void testGet(){
		Jedis jedis = new Jedis("192.168.229.112", 6379);
		String name = jedis.get("stuname");
		System.out.println(name);
	}
	

	@Test
	public void testConnRedis(){
		Jedis jedis = new Jedis("192.168.229.112", 6379);
		jedis.set("jedisK1", "testjedis");
	}
}

 

叢集程式碼使用:

package com.igeek.jedis;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

/**
 * @author www.igeehome.com
 * 
 * TODO
 *
 * 2018年11月14日下午8:47:46
 */
public class JedisClusterTest {

	@Test
	public void testJedisCluster(){
		Set<HostAndPort> nodes = new HashSet<HostAndPort>();
		nodes.add(new HostAndPort("192.168.229.112", 7001));
		nodes.add(new HostAndPort("192.168.229.112", 7002));
		nodes.add(new HostAndPort("192.168.229.112", 7003));
		nodes.add(new HostAndPort("192.168.229.112", 7004));
		nodes.add(new HostAndPort("192.168.229.112", 7005));
		nodes.add(new HostAndPort("192.168.229.112", 7006));
		//連線叢集
		JedisCluster cluster = new JedisCluster(nodes );
		
		String set = cluster.set("uname", "zhangsan");
		System.out.println(set);
	}
}