Redis學習筆記1-基礎知識

本文是對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-集群部署》。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 原帖地址:http://m.itdecent.cn/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul閱讀 2,232評論 0 28
  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,169評論 2 27
  • 本文為筆者對在學習Redis過程中所收集資料的一個總結,目的是為了以后方便回顧相關的知識,大部分為非原創(chuàng)內(nèi)容。特此...
    EakonZhao閱讀 14,641評論 0 9
  • Ubuntu下安裝redis 安裝redis 在 Ubuntu 系統(tǒng)安裝 Redi 可以使用以下命令: 啟動 Re...
    riverstation閱讀 1,051評論 0 0
  • 昨天晚上發(fā)燒了,今天早上起來還是渾身難受,最近都不知道怎么了,沒有思路,不知道寫什么。 之前寫的同學都是初中二年級...
    馠沊閱讀 277評論 0 0

友情鏈接更多精彩內(nèi)容