本文是對Redis基礎知識的一個學習總結,共包括如下章節(jié)內(nèi)容:
- Redis是什么
- 安裝和部署
- 數(shù)據(jù)庫操作
- Java API
- 小結
一、Redis是什么
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡、可基于內(nèi)存亦可持久化的Nosql(Key-Value)分布式數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。從2013年5月開始,Redis的開發(fā)由Pivotal贊助。
Redis最常見的應用是被用作應用系統(tǒng)中的緩存系統(tǒng),是當前最熱門的緩存系統(tǒng)之一。Redis 與其他 key - value 緩存產(chǎn)品相比,有如下特點:
1、Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
2、Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結構的存儲。
3、Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
4、Redis性能極高,其能讀的速度是110000次/s,寫的速度是81000次/s 。
5、Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務。
6、Redis支持分布式部署,支持大數(shù)據(jù)量的處理。
二、安裝和部署
Redis的官網(wǎng)是https://redis.io,目前最新的穩(wěn)定版本是5.0.3,下載的壓縮包文件是redis-5.0.3.tar.gz。另外Redis的官網(wǎng)還提供了含Redis的Docker鏡像的下載。
需要說明的是,Redis項目只正式提供linux下的Redis版本,沒有提供windows下的Redis版本,但是Microsoft開放技術小組開發(fā)和維護了可在Windows下運行的Redis版本,可以到 https://github.com/MicrosoftArchive/redis/releases 這個地址去下載,不過最新的windows下的Redis版本(最新的是2016.7月發(fā)布的)只是基于redis3.2.1,可以看出已經(jīng)很老了。
本文的介紹是基于 Redis在linux下的運行,使用的版本是最新的5.0.3。使用的linux系統(tǒng)CentOS 7.2。
下面我們來介紹如何在linux進行Redis運行環(huán)境搭建。
(一)編譯
Redis官方提供下載后的版本是源碼包,需要使用make命令進行編譯。具體步驟如下:
1、解壓redis-5.0.3.tar.gz文件
將下載得到的redis-5.0.3.tar.gzti壓縮文件拷貝到想要安裝Redis的目錄下,執(zhí)行如下命令,解壓到當前目錄下。
tar -xvzf redis-5.0.3.tar.gz
這時我們會發(fā)現(xiàn)當前目錄下多了一個redis-5.0.3目錄,這時redis-5.0.3.tar.gz文件不需要了,可以刪除。
2、進入解壓出來的目錄
cd redis-5.0.3
3、執(zhí)行make命令,編譯源碼包
make
運行make命令,會看到很多信息輸出,不用管它,等待執(zhí)行結束。最后得到的目錄結構如下:
$ cd redis-5.0.3/
$ ls -l
總用量 256
-rw-rw-r-- 1 hadoop hadoop 92434 12月 12 20:25 00-RELEASENOTES
-rw-rw-r-- 1 hadoop hadoop 53 12月 12 20:25 BUGS
-rw-rw-r-- 1 hadoop hadoop 1894 12月 12 20:25 CONTRIBUTING
-rw-rw-r-- 1 hadoop hadoop 1487 12月 12 20:25 COPYING
drwxrwxr-x 6 hadoop hadoop 4096 3月 12 15:42 deps
-rw-rw-r-- 1 hadoop hadoop 11 12月 12 20:25 INSTALL
-rw-rw-r-- 1 hadoop hadoop 151 12月 12 20:25 Makefile
-rw-rw-r-- 1 hadoop hadoop 4223 12月 12 20:25 MANIFESTO
-rw-rw-r-- 1 hadoop hadoop 20555 12月 12 20:25 README.md
-rw-rw-r-- 1 hadoop hadoop 62155 12月 12 20:25 redis.conf
-rwxrwxr-x 1 hadoop hadoop 275 12月 12 20:25 runtest
-rwxrwxr-x 1 hadoop hadoop 280 12月 12 20:25 runtest-cluster
-rwxrwxr-x 1 hadoop hadoop 281 12月 12 20:25 runtest-sentinel
-rw-rw-r-- 1 hadoop hadoop 9710 12月 12 20:25 sentinel.conf
drwxrwxr-x 3 hadoop hadoop 8192 3月 13 11:23 src
drwxrwxr-x 10 hadoop hadoop 4096 12月 12 20:25 tests
drwxrwxr-x 8 hadoop hadoop 4096 12月 12 20:25 utils
編譯后的Redis的可執(zhí)行程序(如啟動Redis實例的程序、命令行客戶端程序、一些腳本)在redis-5.0.3目錄的子目錄src下。如果想方便后續(xù)的執(zhí)行,也可以把一些可執(zhí)行程序從src中拷貝到別的地方,比如新建一個bin目錄。
(二)配置
在redis-5.0.3目錄下有一個redis.conf配置文件,啟動Redis服務時可以指定該配置文件,這樣Redis服務的一些參數(shù)設置就從該配置文件中獲取。如果啟動時,不指定配置文件,則使用默認值??梢詫edis.conf文件不做任何修改,這樣使用默認值啟動Redis服務。
可以不需要修改redis.conf文件中的任何默認配置就可以正常啟動Redis。
下面介紹一些常用的配置項修改信息:
1、端口號
配置文件默認的配置信息如下
port 6379
6379是Redis實例默認使用的端口。如果需要用別的端口,需要修改這個值。特別是當在一臺機器上啟動多個redis實例時,每個實例需要有不同的端口。
2、支持Redis客戶端遠程訪問Redis服務器
默認情況下,啟動Redis服務后,只允許在服務器上訪問Redis服務,可以改成允許遠程Redis客戶端來連接Redis服務。方法是:
在配置文件中找到
bind 127.0.0.1
這行信息,改為
# bind 127.0.0.1
3、采用后臺方式啟動Redis服務
默認情況下,啟動Redis服務時,是在前臺啟動的,即一旦啟動服務的控制臺被關閉,則Redis服務也終止了,可以修改成采用后臺方式啟動。方法是:
在配置文件中找到
daemonize no
這行信息,改為
daemonize yes
4、設置密碼
默認情況下,Redis客戶端連接Redis服務器是不需要密碼的,可以改成需要密碼的方式。方法是:
在配置文件中找到
# requirepass foobared
這行信息,改為
requirepass 需要設置的密碼
(三)啟動Redis服務
當前目錄是redis-5.0.3,執(zhí)行Redis服務器啟動程序,如下面操作:
src/redis-server redis.conf
說明:如果不帶redis.conf參數(shù),則使用默認配置值。
可以通過執(zhí)行如下的操作系統(tǒng)命令來檢查Redis是否正常啟動:
netstat -nlpt
這時從輸出信息中可以查看是否有6379 端口在偵聽,有的話說明服務啟動成功。
(四)啟動Redis命令行客戶端
Redis自帶了一個命令行客戶端可執(zhí)行程序(文件名為redis-cli),可以用來連接到Redis服務器,然后執(zhí)行相關操作。
執(zhí)行客戶端程序,啟動客戶端,如:
src/redis-cli
這樣就出現(xiàn)一個交互式命令行界面,可以輸入各種命令,如:
$ src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info
# Server
redis_version:5.0.3
redis_git_sha1:00000000
......
其中的ping命令用來測試與服務器是否連接正常,info命令顯示Redis服務器和客戶端的各種信息,信息很多,上面只是給出了少量信息。
執(zhí)行exit命令可以退出交互式命令行。
如果我們要用Redis命令行程序連接到遠程的Redis服務器,方法如:
src/redis-cli -h 服務器IP地址 -p 6379
(五)停止Redis服務
如果Redis服務是采用前臺方式啟動,則只需在相應的控制臺ctrl+c即可。
如果沒有界面可操作,比如Redis服務是采用后臺方式啟動的,則可以這樣停止服務:
方法一:利用redis-cli程序停止服務,在命令行下執(zhí)行如下命令
src/redis-cli shutdown
這種方式實際是給Redis服務器發(fā)送一個停止服務的消息,Redis服務收到此消息后,就會自動停止。
方法二:強制停止
如果采用上面的方式無法停止,可使用操作系統(tǒng)的kill命令強制殺死Redis服務對應的進程。
首先得找到Redis服務對應的進程的進程號,可以執(zhí)行如下操作系統(tǒng)命令:
ps -ef|grep redis
輸出的信息會顯示redis服務進程的進程號,然后執(zhí)行:
kill -9 進程號
這樣就強制停止Redis服務,強制停止可能導致正在持久化的信息丟失。所以正常情況下應該采用上一種方式。
三、數(shù)據(jù)庫操作
Redis是key-value格式數(shù)據(jù)庫,其值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。下面我們來介紹如何在命令行下進行數(shù)據(jù)庫的相關操作。
(一)字符串數(shù)據(jù)
最簡單的數(shù)據(jù)是字符串數(shù)據(jù),常見的操作如下:
1、保存數(shù)據(jù)
語法格式:set key value
set是命令,key和value是要保存數(shù)據(jù)的鍵名和字符串值
舉例:set mykey good
上面例子的mykey是key名,good是該key對應值。
說明:
1)如果設置的key不存在,則創(chuàng)建新的鍵值對,如果已經(jīng)存在,則更新值。
2)如果字符串字符之間有空格,需要引號括起來。如set mykey "hello world"
2、獲取數(shù)據(jù)
語法格式:get key
舉例:get mykey
說明:如果指定的key不存在,則返回(nil)信息。
3、刪除數(shù)據(jù)
語法格式:del key
舉例:del mykey
說明:如果刪除成功,輸出 (integer) 1,否則輸出(integer) 0
下面是操作示例,如下:
127.0.0.1:6379> set mykey good
OK
127.0.0.1:6379> get mykey
"good"
127.0.0.1:6379> set mykey 12
OK
127.0.0.1:6379> get mykey
"12"
127.0.0.1:6379> del mykey
(integer) 1
127.0.0.1:6379> del mykey
(integer) 0
127.0.0.1:6379> get mykey
(nil)
(二)hash數(shù)據(jù)
redis支持存儲hash數(shù)據(jù),也就是value是一個map,hash特別適合用于存儲對象。下面介紹一些常見的操作。
1、保存數(shù)據(jù)
語法格式:hset key field1 value1 [field2 value2 ]
含義:將一對或多對field/value值保存到key對應的hash值中。
舉例:hset user id 10 name tom
說明:
1)如果對應的key不存在,則創(chuàng)建一個新的鍵值對,這個值就是一個hash,該hash的內(nèi)容就是命令中的一對或多對filed/value。
2)如果對應的key已經(jīng)存在,但key對應的value不是hash類型,則會用命令中的hash值覆蓋該key的值,相當于該key的值變?yōu)橐粋€hash類型。
3)如果對應的key已經(jīng)存在,且key對應的value是hash類型,則就會往該hash值添加或覆蓋新的field/value值。
2、獲取數(shù)據(jù)(獲取整個Hash值)
語法格式:hgetall key
舉例:hgetall user
說明:該命令會返回指定的key對應的hash值,注意如果該key對應的值類型不是hash會報錯。
3、獲取數(shù)據(jù)(獲取Hash中指定的filed的value)
語法格式:hget key field
舉例:hget user id
4、檢查hash值中指定的鍵值對是否存在
語法格式:hexists key field
舉例:hexists user name
說明:如果存在,返回(integer) 1,否則返回(integer) 0
5、檢查hash值中鍵值對的數(shù)量
語法格式:hlen key
舉例:hlen user
說明:如果存在,返回(integer) 1,否則返回(integer) 0
6、刪除數(shù)據(jù)
如果刪除整個鍵值對,使用上面對字符串值操作中的del命令即可。如果只是刪除hash值中指定的鍵值對,則使用如下命令。
語法格式:hdel key field
舉例:hdel user id
(三)列表數(shù)據(jù)
redis支持value值為列表,即一個有序的字符串列表。列表是按照棧的方式操作,即最后插入的元素會被最先獲取到。下面介紹一些常見的操作。
1、保存數(shù)據(jù)
語法格式:lpush key value1 [value2]
舉例1:lpush data 12 14
說明:上述命令在redis數(shù)據(jù)庫中插入一個鍵為data,值是一個列表(包含12,14兩個元素)的鍵值對數(shù)據(jù)。該命令輸出為(integer) 2 ,這個2表示列表中的元素個數(shù)。
舉例2:lpush data 23 13
在上面例子的基礎上往data對應的列表中再插入兩個元素
該命令輸出為(integer) 4,這個4表示列表中的元素個數(shù)。
2、獲取數(shù)據(jù)
舉例1:llen data
llen獲取列表中的元素個數(shù),在上面命令基礎上執(zhí)行,則輸出(integer) 4,這個4表示列表中的元素個數(shù)。
舉例2:lindex data 0
通過索引獲取列表中指定序號的元素,從0開始。0代表最后插入的元素,這里的輸出是13
舉例3:lrange data 0 3
獲取列表指定范圍內(nèi)的元素,第一個數(shù)字從最后插入的元素算起。
3、移除并獲取元素
舉例1:LPOP data
移出并獲取列表的第一個元素,這里第一個元素指最后插入的元素
舉例2:RPOP data
移除并獲取列表最后一個元素
(四)集合數(shù)據(jù)
redis支持value值為集合(SET),Redis 中的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復的數(shù)據(jù)。下面介紹一些常見的操作。
1、保存數(shù)據(jù)
舉例1:sadd myset hello1 hello2
說明:上面例子的sadd命令插入一個鍵為myset,值為集合(含hello1,hello2兩個元素)的鍵值對。返回值為(integer) 2,表示列表中有2個元素。
舉例2:sadd myset hello3
在上面例子基礎上執(zhí)行上述命令,往已有的集合中添加元素,返回值為(integer) 3,表示列表中有3個元素。
舉例3:sadd myset hello1
在上面例子基礎上執(zhí)行上述命令,返回值為(integer) 0,表示添加數(shù)據(jù)不成功,因為set類型中的數(shù)據(jù)不允許重復,而前面的操作集合中已經(jīng)有hello1數(shù)據(jù),再次添加數(shù)據(jù)就不成功了。
2、獲取數(shù)據(jù)
舉例1:smembers myset
說明:獲取鍵myset對應的值集合中的所有元素
3、移除數(shù)據(jù)
舉例2:spop myset
說明:隨機移除集合中的一個元素,并返回該元素。因為redis集合中的元素是無序的,所有無法按序號指定元素
舉例3:srem myset hello1 hello3
說明:移除集合中指定的一個或多個元素,注意這里指定的是元素值,不是序號
(五)有序集合數(shù)據(jù)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。不同的是每個元素都會關聯(lián)一個double類型的分數(shù)。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(shù)(score)卻可以重復。下面介紹一些常見的操作。
1、保存數(shù)據(jù)
語法格式:zadd key score1 member1 [score2 member2]
舉例:zadd myzset 1 hello 2 world
說明:zadd命令有點類似hset命令,集合中的每個元素除指定元素值外(如上面的hello, world),還需為每個元素指定一個分數(shù)(1,2)
2、獲取數(shù)據(jù)(集合中元素個數(shù))
語法格式:zcard key
舉例:zcard myzset
說明:獲取指定key對應的有序集合中元素的個數(shù)
3、獲取數(shù)據(jù)
語法格式:zrange myzset start end
說明:zrange 獲取指定序號范圍內(nèi)的元素
舉例:
zrange myzset 0 0 //獲取第1個元素
zrange myzset 0 1 //獲取第1個和第2個元素
zrange myzset 0 -1 //獲取全部元素
4、移除元素
舉例:zrem myzset hello
說明:移除指定的一個或多個元素
上面使用命令對如何使用Redis支持的各種數(shù)據(jù)類型進行了簡單介紹,Redis對各種數(shù)據(jù)類型操作的命令非常豐富,這里只是介紹了一些最常用和最基本的操作。
四、Java API
在真實的應用場景中,我們大多是通過Redis提供的API來編寫程序訪問Redis數(shù)據(jù)庫,Redis提供了多種編程語言的API。
下面我們以常見的Java API為例來介紹如何通過編寫程序的方式來訪問Redis數(shù)據(jù)庫。Jedis是Redis官方首選的Java客戶端開發(fā)包,在本文中我們使用Jedis來訪問Redis數(shù)據(jù)庫數(shù)據(jù)庫。
我們通過maven來自動引入依賴的jar包。先建立一個maven工程,pom文件加入依賴:
<dependency>
<groupId>redis.clients</groupId>
<artifactId><u>jedis</u></artifactId>
<version>2.9.0</version>
</dependency>
在本例子,我們使用的jedis版本是2.9.0。
我們來編寫一個最簡單的例子,代碼如下:
package redisdemo;
import redis.clients.jedis.Jedis;
public class Demo {
public static void main(String[] args) {
Jedis jedis = new Jedis();
jedis.set("mydata", "hello");
String value = jedis.get("mydata");
System.out.println(value);
jedis.close();
}
}
上面代碼是一個完整的可執(zhí)行java程序,代碼全部在main方法中。我們先創(chuàng)建Jedis 類的一個實例,沒有使用任何設置,表示連接到本地的Redis數(shù)據(jù)庫。然后Jedis 類的set方法插入一個字符串數(shù)據(jù),再調用get方法獲取插入的鍵對應的值。
運行程序后,我們通過Redis命令行去執(zhí)行get mydata,一樣可以獲取到數(shù)據(jù)。
如果我們要刪除剛才創(chuàng)建的鍵值對,可以如下代碼:
package redisdemo;
import redis.clients.jedis.Jedis;
public class Demo {
public static void main(String[] args) {
Jedis jedis = new Jedis();
jedis.del("mydata");
jedis.close();
}
}
運行程序后,我們通過Redis命令行去執(zhí)行get mydata,會發(fā)現(xiàn)查詢不到數(shù)據(jù)了。
上面只是利用Jedis庫來執(zhí)行最基本的操作,Jedis庫提供了豐富的API可以完成各種對Redis數(shù)據(jù)庫的操作,這里不再詳細介紹。
五、小結
本文對Redis的基礎知識做了介紹,包括單機環(huán)境下的安裝和部署、如何通過命令行來訪問redis數(shù)據(jù)庫,以及如何通過Java API編寫程序來訪問Redis數(shù)據(jù)庫。
Redis可以用到多種場景下,比如:
1)對于數(shù)據(jù)處理不復雜的業(yè)務場景,可以直接代替?zhèn)鹘y(tǒng)數(shù)據(jù)庫來作為持久化的數(shù)據(jù)庫。
2)作為應用系統(tǒng)的緩存系統(tǒng),尤其是在分布式系統(tǒng)中的緩存系統(tǒng)。
本文介紹的是單機環(huán)境,在對安全性較高、數(shù)據(jù)量較大的生產(chǎn)環(huán)境下,一般會采用集群的部署方式,要了解Redis的集群部署方式,可查看文檔《Redis學習筆記2-集群部署》。