redis系列文章:
redis系列(一)- 安裝與啟動
redis系列(二)- 語法與命令
一、Redis介紹
Redis是NoSql的一種,在弄清楚Redis是個什麼玩意之前,先了解下NoSql是什麼。
1、什麼是NoSql
NoSql,全名:Not Only Sql,是一種非關係型資料庫,它不能替代關係弄資料庫,只是關係型資料庫的一個補充,是可以解決高併發、高可用、高擴充套件、大資料儲存等一系列問題而產生的資料庫解決方案。
NoSql有以下4種分類:鍵值(Key-Value)儲存資料庫、列儲存資料庫、文件型資料庫、圖形(Graph)資料庫。而Redis屬於第一種:鍵值(Key-Value)儲存資料庫。
2、什麼是Redis
Redis是使用c語言開發的一個高效能鍵值資料庫,即通過一些鍵值型別來儲存資料。Redis支援的鍵值型別有:String字元型別、map雜湊型別、list列表型別、set集合型別、sortedset有序集合型別。
redis的應用場景如下:快取(資料查詢、短連線、新聞內容、商品內容等等)、分散式叢集架構中的session分離、聊天室的線上好友列表、任務佇列。(秒殺、搶購、12306等等)、應用排行榜、網站訪問統計、資料過期處理(可以精確到毫秒)。其中,作為快取的應用場景是最多的。
二、redis安裝
一般redis安裝於linux伺服器,故本例介紹的是Linux下的安裝,如果你的電腦是window或mac,請自行百度安裝方法。
本例使用的Linux系統是CentOS6.7,諸如Ubuntu等Linux作業系統的操作命令或許存在個別差異,請自行學習瞭解。
1、下載
可以到redis的官網找到各個Redis版本的下載地址,如:download.redis.io/releases/re…
2、安裝
使用Xshell等伺服器終端連線軟體連線上Linux後,進行以下操作:
1)下載壓縮Redis
下載redis:
wget http://download.redis.io/releases/redis-3.0.0.tar.gz複製程式碼
使用ll命令檢視當前目錄下所有檔案
可以看到redis-3.0.0.tar.gz就是剛剛下載的redis壓縮包,現在對其解壓:
tar -zxvf redis-3.0.0.tar.gz複製程式碼
再使用ll命令檢視當前目錄下所有檔案
2)編譯安裝Redis
進入redis原始碼:
cd redis-3.0.0複製程式碼
通過ll命令可以看到Redis原始碼目錄下的所有檔案,接下來就需要對原始碼進行編譯了:
make複製程式碼
使用make命令編譯Redis需要c語言環境,CentOS自帶c語言環境,若是使用其他Linux系統中沒有c語言環境,則需要安裝,如yum安裝: yum install gcc-c++
編譯過後,就是安裝了,安裝Redis的命令如下:
make install PREFIX=/usr/local/redis複製程式碼
該命令中,前面的"make install PREFIX="是固定的,而"/usr/local/redis"是Redis的安裝目錄,一般就這麼寫,如若需要安裝在其他地方,只需將此路徑更換即可。
最後,檢視Redis是否安裝成功:
cd /usr/local/redis/複製程式碼
使用ll命令,可以看到bin資料夾,說明Redis已經安裝成功。
三、Redis啟動與停止
Redis有兩種啟動,分別是:前端啟動、後端啟動。要啟動Redis,就需要到Redis的bin目錄下執行啟動命令,先看看bin目錄結構:
1、前端啟動與停止
1)前端啟動的命令:
[root@localhost bin]# ./redis-server複製程式碼
可以看到Redis的啟動埠為6379(預設),程式id是5979,同時,前端啟動Redis後,終端將進入Redis控制檯,沒辦法繼續別的Linux命令,即這個終端視窗就"廢了",只能輸入Redis自己的命令。
2)前端啟動的關閉命令:
強制關閉:Ctrl+c
正常關閉:[root@localhost bin]# ./redis-cli shutdown複製程式碼
下面對這兩個命令進行對比:
- 強制關閉只需在Redis控制檯直接執行即可(redis可能會丟失部分資料)。
- 正常關閉需要另開一個終端視窗才可執行(redis不會丟失資料,推薦使用)。
需要注意一點,一旦前端啟動的關閉命令執行,則redis控制檯關閉,redis服務也會停掉。
2、後端啟動與停止
後端啟動是我們開發中絕對會用到的方式,但在使用後端啟動命令之後,需要做如下幾步配置:
1)後端啟動的配置:
第一步,需要把redis原始碼目錄下的redis.conf檔案複製到redis安裝目錄的bin目錄下。
第二步,修改redis.conf檔案,將daemonize的值改為yes後儲存。
[root@localhost bin]# vim redis.conf 複製程式碼
Linux的vim編輯器指令請自行學習,這裡就說vim中幾個最常用的指令:
i:進入編輯模式。
esc:退出編輯模式,進入瀏覽模式(進入vim編輯器,預設就是瀏覽模式)。
:wq:儲存修改並退出vim編輯器。
經過上面幾步配置後,以後就無需再配置,下面就可以通過命令讓redis後臺啟動了。
2)後端啟動的命令:
[root@localhost bin]# ./redis-server redis.conf複製程式碼
可以發現後端啟動命令就只是比前端啟動命令多了" redis.conf",意思很明確,就是讓redis根據這個配置檔案的配置執行罷了,同時也可以看到,在啟動完redis後臺,終端不會進入redis控制檯,這就是將redis執行後臺了,我們可以查檢視系統現在是不是有redis的程式:
[root@localhost bin]# ps -aux | grep redis複製程式碼
可以看到redis是執行著的,埠是6379,程式id是6087。
3)後端啟動的關閉命令:
強制關閉:[root@localhost bin]# kill -9 程式id
正常關閉:[root@localhost bin]# ./redis-cli shutdown複製程式碼
因為後端啟動redis,沒辦法像前端啟動redis那樣直接ctrl+c強制關閉redis,如果需要強制關閉,那隻能通過殺死程式的方式停止redis。而正常關閉redis的命令與前端關閉一樣,這裡就不多說廢話。
專案中,建議使用正常關閉。因為redis作為快取來使用的話,將資料儲存到記憶體中,如果使用正常關閉,則會將記憶體資料持久化到本地之後,再關閉。如果強制關閉,則不會進行持久化操作,可能會造成部分資料丟失。
四、Redis客戶端
1、redis自帶客戶端
在前面介紹redis安裝目錄下bin目錄的結構時,就已經標記出了redis的客戶端,它就是redis-cli。這個客戶端有兩個常用的功能:
- 用來正常關閉redis服務。
- 讓終端進入redis控制檯(後臺執行redis的場景下用到)。
1)啟動
啟動客戶端命令:
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 6379複製程式碼
- -h:指定訪問的redis伺服器的ip地址
- -p:指定訪問的redis伺服器的port埠
如果使用的ip地址與埠都是預設的,則上述命令可以這麼寫:
[root@localhost bin]# ./redis-cli複製程式碼
使用預設配置:預設的ip【127.0.0.1】,預設的port【6379】
2)關閉
ctrl+c
127.0.0.1:6379> quit複製程式碼
要關閉該客戶端,使用上述兩個命令中任意一個均可,都不會影響redis資料的儲存。
2、圖形介面客戶端
有一個redis的圖形介面客戶端軟體,名為redis-destop-manager。這是該軟體的下載頁面,支援Windows、Mac OS X、Linux,請根據自己的電腦系統選擇下載,這裡以windows為例,簡單說下這軟體的使用,安裝很簡單,一路下一步即可,安裝後開啟該應用。
1)開啟redis伺服器連線配置
2)新增redis伺服器連線並測試是否成功連線
3)檢視redis伺服器中所有的資料庫
4)檢視個別資料庫中的鍵值對資料
3、程式碼控制客戶端
redis不僅可以使用命令來操作,目前基本上主流的語言都有客戶端支援,比如:java、C、C#、C++、php、Node.js、Go等。
在官方網站裡有一些Java的客戶端,如:Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推薦使用Jedis和Redisson。 在企業中用的最多的就是Jedis。
Jedis託管在github上,點選開啟。
1)簡單的redis使用
第一步:匯入以下2個jar包
- jedis-2.7.0.jar
- commons-pool2-2.3.jar
第二步:建立Jedis連線使用Redis伺服器
@Test
public void jedisClient() {
// 建立Jedis
Jedis jedis = new Jedis("192.168.128.128", 6379);
// 通過Jedis賦值
jedis.set("s2", "222");
// 通過Jedis取值
String s2 = jedis.get("s2");
System.out.println(s2);
// 關閉Jedis
jedis.close();
}複製程式碼
第三步:改用Jedis連線池獲取Jedis
@Test
public void jedisPool() {
// JedisPool
JedisPool jedisPool = new JedisPool("192.168.128.128", 6379);
// 通過連線池獲取jedis物件
Jedis jedis = jedisPool.getResource();
String s2 = jedis.get("s2");
System.out.println(s2);
// 關閉jedis客戶端
jedis.close();
// 關閉連線池
jedisPool.close();
}複製程式碼
2)Spring整合jedisPool
第一步:
- 新增spring的jar包
- 配置spring配置檔案applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 連線池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大連線數 -->
<property name="maxTotal" value="30" />
<!-- 最大空閒連線數 -->
<property name="maxIdle" value="10" />
<!-- 每次釋放連線的最大數目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 釋放連線的掃描間隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 連線最小空閒時間 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 連線空閒多久後釋放, 當空閒時間>該值 且 空閒連線>最大空閒連線數 時直接釋放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 獲取連線時的最大等待毫秒數,小於零:阻塞不確定的時間,預設-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在獲取連線的時候檢查有效性, 預設false -->
<property name="testOnBorrow" value="false" />
<!-- 在空閒時檢查有效性, 預設false -->
<property name="testWhileIdle" value="true" />
<!-- 連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis單機 通過連線池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.128.128" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>複製程式碼
第二步:測試程式碼
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 關閉連線
jedis.close();
}
}
}複製程式碼
五、其他
1、redis資料庫數量配置
redis預設建立16個資料庫,如果需要修改數量庫的建立數量,可以修改redis.conf配置檔案中databases的值為改變。
2、redis資料庫選擇
redis預設使用下標為0的資料庫,如若需要切換資料庫,可以在redis控制檯中,使用"select 下標號"選擇資料庫。
127.0.0.1:6379> select 15複製程式碼
3、問題
如果你用Xshell之類的終端軟體無法連線伺服器,請檢視Linux系統是否開放22埠,可通過修改iptable攔截規則開放22埠,若是使用阿里雲伺服器,則需要修改安全組規則,具體步驟網上一堆,請自己搜尋學習修改。