Redis入門基礎

CareyWYR發表於2018-08-09

由於自己當前做的專案過程中間接的利用到了Redis,對其產生了一點興趣,就買了本Redis入門指南(李子驊編著)看了下,雖然實際上這本書已經買了半年了,==,但最近還是突然痛定思痛決定把這本書好好看看然後寫個總結,這裡就先寫一點基礎的知識好了。

  • NoSQL簡介
  • Redis相關介紹
  • Redis的安裝
  • Redis資料型別

NoSQL簡介

說起Redis首先得提一下NoSQL資料庫,什麼是NoSQL?查詢wiki可以知道其定義:

NoSQL是對不同於傳統的關聯式資料庫的資料庫管理系統的統稱。

NoSQL的全名叫做Not Only SQL,與我們常用的MySQL,Oracle等資料庫不同,它叫做非關係型資料庫,那麼問題來了,我們為什麼需要NoSQL呢?原因可以用四個H表示:

  • High performance — 高併發讀寫
  • Huge Storage –海量資料的高效率儲存和訪問
  • High Scalability && High Availability –高擴充套件性和高可用性

在我們開發有大資料或高併發的網站時,往往關係型資料庫在這個時候的效能會顯得捉襟見肘,然而非關係型的資料庫在這個時候就能發揮其作用,比如我們本文將會提到的Redis,其資料是儲存在記憶體當中,由於記憶體的讀寫速度遠快於硬碟,因此其效能當然會具有明顯的優勢。再者其簡單的儲存結構使得程式與其之間的互動十分簡單,高擴充套件性和可用性在此也可體現出來。因此其特點十分鮮明,即:

  • 易擴充套件
  • 靈活的資料模型
  • 大資料量,高效能
  • 高可用

NoSQL資料庫的分類大致有四種:

  • 鍵值(key-value)儲存
  • 列儲存
  • 文件資料庫
  • 圖形資料庫

我們這裡介紹的Redis就是屬於其中的鍵值儲存這個分類的資料庫。

Redis相關介紹

Redis是一個開源的、高效能的、基於鍵值對的快取與作業系統,通過提供多種鍵值資料型別來適應不同場景下的快取與儲存需求。同時Redis的諸多高層級功能使其可以勝任訊息佇列、任務佇列等不同的角色。

Redis是REmote DIctionary Server(遠端字典伺服器)的縮寫,它以字典結構儲存資料,並允許其他應用通過TCP協議讀寫字典中的內容。目前為止Redis支援的鍵值資料型別如下:

  • 字串型別
  • 雜湊型別
  • 列表型別
  • 集合型別
  • 有序集合型別

後文中我們會詳細介紹這些資料型別的基本使用方法。

Redis的安裝

本人使用的是centos7系統進行操作的,Redis相容大部分POSIX系統,包括Linux和OS X等,安裝步驟如下:

    wget http://download.redis.io/redis-stable.tar.gz
    tar xzf redis-stable.tar.gz
    cd redis-stable
    make

Redis沒有其他外部依賴,所以安裝過程很簡單,建議在實際執行前使用make test命令來測試Redis是否編譯正確,編譯後還可以直接執行make install命令來將這些程式複製到/usr/local/bin目錄中以便以後執行程式時不用輸入完整的路徑。
本人之前有在一個Ubuntu系統上安裝過一次,執行make的時候報出如下錯誤:

[root@node1 redis]# make
    cd src && make all
    make[1]: Entering directory `/usr/local/redis/src`
        CC adlist.o
    在包含自 adlist.c:34 的檔案中:
    zmalloc.h:50:31: 錯誤:jemalloc/jemalloc.h:沒有那個檔案或目錄
    zmalloc.h:55:2: 錯誤:#error "Newer version of jemalloc required"
    make[1]: *** [adlist.o] 錯誤 1
    make[1]: Leaving directory `/usr/local/redis/src`
    make: *** [all] 錯誤 2

這個問題可以看一下readme裡面的一段話

Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.

To force compiling against libc malloc, use:

    % make MALLOC=libc

To compile against jemalloc on Mac OS X systems, use:

    % make MALLOC=jemalloc

意思是關於分配器allocator, 如果有MALLOC 這個 環境變數, 會有用這個環境變數的 去建立Redis,而且libc 並不是預設的分配器, 預設的是 jemalloc, 因為 jemalloc 被證明相對於libc有更少的 fragmentation problems。如果你又沒有jemalloc而只有libc就會make 出錯。所以加這麼一個引數,即執行:

make MALLOC=libc

再者後來執行make test的時候也很有可能會報一個錯誤:

make[1]: *** [test] 錯誤 1
make[1]: Leaving directory `/usr/local/src/redis-stable/src`
make: *** [test] 錯誤 2

這個意思是說沒安裝tcl,去官網 http://www.linuxfromscratch.o… 上按照說明安裝即可。(其實我也不知道這玩意幹嘛的,照著官網把命令複製出來執行以下就好了==)

好了,至此,Redis就成功安裝了,接下來就是啟動它了,直接啟動的話執行redis-server即可,賊簡單:

$ redis-server
    3850:C 08 Sep 00:39:53.036 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    3850:C 08 Sep 00:39:53.036 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=3850, just started
    ......
    3850:M 08 Sep 00:39:53.084 * DB loaded from disk: 0.033 seconds
    3850:M 08 Sep 00:39:53.084 * Ready to accept connections

Redis伺服器預設埠號為6379,當然你也可以通過–port引數自定義埠號:

$redis-server --port 6380

我們可以通過PING命令來測試連線是否正常,連線正常會返回PONG:

$redis-cli PING
    PONG

停止Redis的命令是:

 $redis-cli SHUTDOWN

Redis收到SHUTDOWN命令後,會先斷開所有客戶端連結,然後根據配置執行持久化,最後完成退出。
我們這裡舉例幾個Redis常見的基礎命令:
獲得符合規則的鍵名列表:KEYS pattern
判斷一個鍵是否存在,存在返回1,否則返回0: EXISTS key
刪除鍵,返回刪除的鍵的個數: DEL key [key …]
獲得鍵值的資料型別: TYPE key

Redis基本資料型別

字串型別

字串型別是Redis中最基本的資料型別。一個字串型別鍵允許儲存的資料的最大容量是512MB。
命令:

賦值與取值:SET key value   GET key
遞增數字: INCR key  ------- 若key不存在,則賦值0再加1,decr同理
增加指定的整數: INCRBY key increment
減少指定的整數: DECR key (decrement)
增加指定浮點數: INCRBYFLOAT key increment
向尾部追加值: APPEND key value   -------key不存在會建立 返回字串長度
獲取字串長度: STRLEN key
同時獲得/設定多個鍵值: MGET key [key…]  MSET key value [key value …]
位操作: 
    GETBIT key offset ---獲得一個字串型別鍵指定位置的二進位制位的值(0或1)
    SET BIT key offset value --設定字串型別鍵指定位置的二進位制位的值,返回值是該位置的舊值。
    BITCOUNT key [start]  [end] ---獲得字串型別鍵中值是1的二進位制位的個數
    BITOP operation destkey key [key …] ---對多個字串型別鍵進行位運算,並將結果儲存在destkey引數指定的鍵中。

雜湊型別

雜湊(hash)的鍵值也是一種字典結構,其儲存了欄位和欄位值的對映,但欄位值只支援字串,不支援其他資料型別。一個雜湊型別鍵可以包含最多2^32-1個欄位。
雜湊型別適合儲存物件:使用物件類別和ID構成鍵名,使用欄位表示物件的屬性,而欄位值則儲存屬性值。
命令:

賦值取值:
    HSET key field value
    HGET key field
    HMSET key field value [field value …]
    HGETALL key
判斷欄位是否存在
    HEXISTS key field
當欄位不存在時賦值
    HSETNX key field value
增加數字
    HINCREBY key field increment
刪除欄位
    HDEL key field [field …]
只獲取欄位名或欄位值
    HKEYS key
    HVALS key
獲得欄位數量

HLEN key

列表型別

列表型別可以儲存一個有序的字串列表,常用的操作是向列表兩端新增元素,或者獲得列表的某一個片段。
列表型別內部是使用雙向連結串列實現的(通過索引訪問元素比較慢),所以向列表兩端新增元素的時間複雜度為O(1),獲取越接近兩端的元素就越快。
一個列表型別鍵可以包含至多2∧32-1個欄位。
命令:
向列表兩端增加元素

LPUSH key value [value…]   ---- > 左邊增加,返回值表示增加元素後列表的長度     lpushx key value ------key必須存在
RPUSH key value [value…]         ---- > 右邊增加,返回值表示增加元素後列表的長度
rpushx key value -----key必須存在

從列表兩端彈出元素

LPOP key
RPOP key

獲取列表中元素的個數

LLEN key

獲得列表片段(包含兩端)

LRANGE key start stop 

刪除列表中指定的值 返回實際刪除的元素個數

LREM key count value  count為負則從後往前刪,若為0則刪除所有對應value

獲得/設定指定索引的元素值

LINDEX key index
LSET key index value

只保留列表指定片段

LTRIM key start end

向列表中插入元素

LINSERT 可以BEFORE|AFTER pivot value

將元素從一個列表轉到另一個列表

REOPLPUSH source destination

集合型別

集中中的每個元素都是不同的,且沒有順序,一個集合型別(set)鍵可以儲存2∧32-1個字串。
集中型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等。集合型別在Redis內部是用值為空的雜湊表(hash table)實現的,所以這些操作的時間複雜度是O(1)。最方便的是多個集合型別鍵之間可以進行並集、交集和差集運算。
命令:
增加/刪除元素

SADD key member [member …]
SREM key member [member …]

獲得集合中的所有元素

SMEMBERS key

判斷元素是否在集合中

SISMEMBER key member

集合間運算

SDIFF key [key …] 多個集合執行差集運算 A-B
SINTER key [key …] 交集運算 A∩B
SUNION key [key …] 並集運算 A∪B

獲得集合中元素個數

SCARD key

進行集合運算並將結果儲存

SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]

隨機獲得集合中的元素

SRANDMEMBER key [count] count>0 count個不重複元素 count<0 |count|個有可能相同的元素

從集合中彈出一個元素
SPOP key

有序集合型別

有序集合(sorted set)在集合型別的基礎上為集合中的每個元素都關聯了一個分數。
有序集合型別和列表型別相似點:

• 二者都是有序的;
• 二者都可以獲得某一範圍的元素;

區別:

• 列表型別是通過連結串列實現的,獲取靠近兩端的資料速度極快,而當元素增多後,訪問中間資料的速度會較慢,所以它更加適合實現如“新鮮事”或“日誌”這樣很少訪問中間元素的應用;
• 有序集合型別是使用雜湊表和跳躍表實現的,所以即使讀取位於中間的資料速度也是很快,時間複雜度O(log(N));
• 列表中不能簡單的調整某個元素的位置,但是有序集合可以(更改這個元素的分數);

有序集合要比列表型別更耗費記憶體;
命令:
增加元素

ZADD key score member [score member …] (也可用於修改)

獲得元素的分數

ZSCORE key member

獲得排名在某個範圍的元素列表

ZRANGE key start stop [WITHSCORES] --按照元素分數從小到大的順序返回從start到stop之間的所有元素。負數代表從後向前;加上WITHSCORES返回據格式程式設計元素1,分數1,元素2,分數2.。。;時間複雜度O(log n+m)(n為有序集合的基數,m為返回的元素個數)
ZREVRANGE key start stop [WITHSCORES] 從大到小

獲得指定分數範圍的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

增加某個元素的分數

ZINCREBY key increment member

獲得集合中元素的數量

ZCARD key

獲得指定分數範圍內的元素個數

ZOUNT key min max

刪除一個或多個元素

ZREM key member [member…]

按照排名範圍刪除元素

ZREMRANGEBYRANK key start stop

按照分數範圍刪除元素

ZREMRANGEBYSCORE key min max

獲得元素的排名

ZRANK key member 從小到大
ZREVRANK key member 從大到小

計算有序集合的交集

ZINTERSTORE destination numkeys key [key…] [WEIGHT weight [weight …]] [AGGREGATE SUM|MIN|MAX]
計算多個有序集合的交集並將結果儲存在destination鍵中(同樣以有序集合型別儲存)

以上,為Redis入門的基礎知識,希望能有所幫助。

相關文章