Redis 學習筆記

軟件安裝

  • Ubuntu 18.04(我本機) 下:
$ sudo apt-get update
$ sudo apt-get install redis-server
  • Windows 下:html

    直接到 GitHub 下載 zip 包,解壓出來而後把內容拷貝到你的某個目錄下就能夠了。
    運行的時候須要把 cmd 路徑切換到你的 Redis 所在的路徑。若是以爲麻煩的話,能夠把 Redis 所在的路徑設置爲環境變量。node

啓動 Redis

運行如下命令:git

$ redis-server

或者 Windows 下直接運行 redis-server.exegithub

打開 Redis 控制檯

$ redis-cli

或者 Windows 下直接運行 redis-cli.exeredis

配置 Redis

我本機(Ubuntu 18.04)直接使用包管理器安裝 redis,因此配置文件位於/etc/redis/redis.confmongodb

使用管理員權限打開該配置文件,便可進行配置:數據庫

$ sudo vim /etc/redis/redis.conf

初級知識

學習網站 -> try.redis.io/vim

Redis 基於鍵值對的形式存儲數據,一般被認爲是一種 NoSQL 數據庫。bash

設置鍵值對

SET KEY VALUE

好比:數據結構

SET name 'fido'

根據鍵獲取值

GET KEY

好比:

GET name

讓鍵的值自增 1

INCR KEY

好比:

SET age 18
INCR age

自增後 age 的值爲 19

讓鍵的值自減 1

DECR KEY

好比:

DECR age

自減後 age 的值爲 18

爲何會有自增和自減操做呢?咱們能夠在本身的代碼裏面完成這些操做的啊:

x = GET age
x = x + 1
SET age x

這段代碼不就完成了自增操做嗎?

這樣作確實能夠,可是並不符合數據操做的原子性,若是多個客戶端同時取出同一個數據,而後進行了更新:

  • 客戶端 1 拿到了 age 爲 18
  • 客戶端 2 拿到了 age 爲 18
  • 客戶端 1 修改了 age 爲 19
  • 客戶端 2 修改了 age 爲 19

這樣就出現問題了,由於咱們指望 age 的值變成 20,如今卻只增長了 1。

這就是爲何 Redis 提供了這些原子性操做。

刪除某個鍵值對

DEL KEY

好比

DEL age

以後 age 的值就不存在了。

若是不存在就建立鍵值對

SETNX KEY VALUE

表示若是 KEY 鍵沒有對應的值存儲在 Redis 中,則建立一個新的鍵值對進行存儲。

存儲具備過時時間的鍵值對

EXPIRE KEY TIME

EXPIRE 命令能夠指定某個鍵值對的有效時長,單位爲秒。在指定的時長事後,數據將不存在。

好比:

EXPIRE age 100

該命令表示 100 秒後 age 將被銷燬。

使用 TTL 命令能夠查看剩餘有效時長:

TTL KEY

好比:

TTL age

若是輸出爲 -2,表示數據已經被銷燬,再也不存在。若是輸出爲 -1,表示數據永不過時。

List 數據結構

Redis 一樣支持一些複雜點的數據結構,首先要講的就是 list(列表),list 是一系列有序值的集合。比較重要的操做指令包括:LPUSHRPUSHLPOPRPOPLLENLRANGE

下面分別介紹這些指令的含義。

RPUSH

表示在列表的尾部插入一條數據:

RPUSH friends Tom

此時 friends 即爲一個 list,裏面只有一條數據即爲 Tom。

RPUSH friends Jerry

此時 friends 仍然是一個 list,不過內部已有兩條數據,分別爲 Tom 和 Jerry。

RPOP

表示在列表的尾部刪除一條數據

RPOP friends

這條命令會在 friends 的尾部刪除一條數據,而且返回刪除的數據。

因此 RPOP 的意思應爲 Right POP;RPUSH 的意思應爲 Right PUSH。由此可知 LPUSH、LPOP 的意思。

LLEN

獲取某個 list 的長度。

LLEN friends

將返回對應 list 的長度。

LRANGE

返回某個 list 的子集,接受兩個參數指定起始索引和截止索引(索引從 0 開始)。

LRANGE friends 0 -1

上面這條命令表示返回 friends 的全部元素,其中截止索引爲 -1 表示全部。

輸出結果大體以下:

1) "zzz"
2) "123"

Set 數據結構

Set 與 List 的區別在於 Set 裏面的元素是無序且不重複的。

主要的操做命令有SADDSREMSISMEMBERSMEMBERSSUNION

SADD

SADD 命令會把指定的值添加到集合中:

SADD names 123

SREM

SREM 會把指定的值從集合中移出,意義爲Set Remove

SREM names 123

SISMEMBER

SISMEMBER 會檢測給出的值是不是給定集合的元素。

SISMEMBER names 123

返回值爲 1 或者 0,1 表明是,0 表明否。

SMEMBERS

SMEMBERS 返回集合的全部元素。

SMEMBERS names

輸出格式大體以下:

1) "123"

SUNION

SUNION 表明求出多個集合的並集。

SUNION names1 names2

返回結果是一個新的集合。

SINTER

該命令表示求兩個集合的交集。

SINTER names1 names2

返回結果爲一個新的集合。

SDIFF

該命令表示求兩個集合的差集。

SDIFF name1 name2

返回結果是 name1 中具備可是 name2 中沒有的元素所組成的集合,即爲差集。

SUNIONSTORE

與 SUNION 相似,可是區別於 SUNION,由於 SUNION 只會求出兩個集合的交集,而後返回結果;可是 SUNIONSTORE 不只會求出交集,還會把結果保存在目標集合中。若是目標集合已經存在,則會覆蓋掉已有的集合。

SADD name1 test1
SADD name1 test2
SADD name2 test3
SUNIONSTORE name name1 name2
SMEMBERS name

執行上述命令後,name1 和 name2 的交集會保存在 name 集合中。

Sorted Set(有序集合)數據結構

無序集合在實際應用中仍是有一些掣肘,因此 Redis 1.2 引入了有序集合

有序集合與普通的集合相似,可是每一項都有一個相關聯的數值,這個數值用於在集合中進行排序。

ZADD

ZADD 表示在一個有序集合中新增一項,ZADD 接受 3 個參數:

  • 參數 1 表示有序集合的名稱
  • 參數 2 表示新增項的排序數值
  • 參數 3 表示新增項的值

好比:

ZADD hackers 1912 "Alan Turing"

ZRANGE

該命令返回有序集合的子集,與 LRANGE 相似。

ZRANGE names 0 -1

返回 names 的全部元素。

ZRANGEBYSCORE

該命令返回一個子集,子集中每一項的 score 都位於 min 和 max 之間。

ZRANGEBYSCORE names 100 200

散列數據結構

一個 Hash 能夠在許多字段和字段的值之間構造映射關係,因此適合於表示對象。

HSET

該命令用於設置散列。

HSET person1 name "test"
HSET person1 age 18
HSET person1 gender "male"

HGETALL

該命令用於返回某個 HASH 的全部數據。

HGETALL person1

輸出結果以下:

1) "name"
2) "test"
3) "age"
4) "18"
5) "gender"
6) "male"

HMSET

該命令含義爲 hash multiple set,即一次設置多對映射關係。

HMSET person2 name "test1" age 18 gender "female"

HGET

該命令表示獲取 HASH 中某一個字段的值

HGET person1 name

一樣的 HASH 結構中也有許多的原子性操做命令。

HSET

設置 HASH 中某個字段的值。

HSET person1 name "Jerry"

HINCRBY

表示對 HASH 中的某個數值進行加操做。

HINCRBY person1 age 1

接受三個參數:

  • 參數 1 表示要操做的 HASH 結構
  • 參數 2 表示要操做的字段
  • 參數 3 表示要增長的值

要想進行減操做時,參數 3 改爲負數便可。

HDEL

該命令表示刪除 HASH 中的某一個屬性。

HDEL person1 name

此時這個字段及其對應的值都會被刪除掉。

更多 HASH 數據結構的操做命令能夠參考:HASHES

Redis 事務

Redis 事務是一系列批量執行的 Redis 命令,區別於數據庫事務,Redis 事務不存在回滾機制,在某條命令執行失敗後不會取消事務,對於錯誤以前修改的數據也不會回滾。

Redis 事務主要依賴三條命令:MULTIEXECWATCHDISCARD

執行事務的步驟以下:

MULTI
SET name test1
SET name test2
GET name 
EXEC

若是想取消事務,鍵入DISCARD 命令:

MULTI
SET name test1
SET name test2
GET name 
DISCARD

WATCH 命令用於監控某個或某幾個鍵,一旦鍵的值被修改,則事務取消。監控會持續到 EXEC 命令執行。

經過 WATCH 能夠實現 CAS(check and set)機制,在某種程度上使操做具備原子性,防止了分佈式(或多線程)同時修改數據時可能出現的錯誤。

Redis 單個命令的操做是原子性的,可是事務並不具備原子性,因此對於數據的操做要謹慎。

在 Node 中使用 Redis

在 Node 中使用 Redis,須要經過驅動進行鏈接,而後進行相應的操做。最經常使用的驅動當屬:node-redis。該模塊容許你按照指定的配置鏈接 Redis,而後進行數據操做。也有人對 node-redis 進行了進一步的封裝:redis-connection,該模塊在程序中能夠維持一個公用的 Redis 鏈接,可有效減小數據庫的鏈接數,提升數據庫的效率。

常見問題

相關文章
相關標籤/搜索