$ sudo apt-get update $ sudo apt-get install redis-server
Windows 下:html
直接到 GitHub 下載 zip
包,解壓出來而後把內容拷貝到你的某個目錄下就能夠了。
運行的時候須要把 cmd 路徑切換到你的 Redis 所在的路徑。若是以爲麻煩的話,能夠把 Redis 所在的路徑設置爲環境變量。node
運行如下命令:git
$ redis-server
或者 Windows 下直接運行 redis-server.exe
。github
$ redis-cli
或者 Windows 下直接運行 redis-cli.exe
。redis
我本機(Ubuntu 18.04)直接使用包管理器安裝 redis,因此配置文件位於/etc/redis/redis.conf
。mongodb
使用管理員權限打開該配置文件,便可進行配置:數據庫
$ sudo vim /etc/redis/redis.conf
學習網站 -> try.redis.io/vim
Redis 基於鍵值對的形式存儲數據,一般被認爲是一種 NoSQL 數據庫。bash
SET KEY VALUE
好比:數據結構
SET name 'fido'
GET KEY
好比:
GET name
INCR KEY
好比:
SET age 18 INCR age
自增後 age 的值爲 19
DECR KEY
好比:
DECR age
自減後 age 的值爲 18
爲何會有自增和自減操做呢?咱們能夠在本身的代碼裏面完成這些操做的啊:
x = GET age x = x + 1 SET age x
這段代碼不就完成了自增操做嗎?
這樣作確實能夠,可是並不符合數據操做的原子性,若是多個客戶端同時取出同一個數據,而後進行了更新:
這樣就出現問題了,由於咱們指望 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,表示數據永不過時。
Redis 一樣支持一些複雜點的數據結構,首先要講的就是 list(列表),list 是一系列有序值的集合。比較重要的操做指令包括:LPUSH
、RPUSH
、LPOP
、RPOP
、LLEN
和 LRANGE
。
下面分別介紹這些指令的含義。
表示在列表的尾部插入一條數據:
RPUSH friends Tom
此時 friends 即爲一個 list,裏面只有一條數據即爲 Tom。
RPUSH friends Jerry
此時 friends 仍然是一個 list,不過內部已有兩條數據,分別爲 Tom 和 Jerry。
表示在列表的尾部刪除一條數據
RPOP friends
這條命令會在 friends 的尾部刪除一條數據,而且返回刪除的數據。
因此 RPOP 的意思應爲 Right POP;RPUSH 的意思應爲 Right PUSH。由此可知 LPUSH、LPOP 的意思。
獲取某個 list 的長度。
LLEN friends
將返回對應 list 的長度。
返回某個 list 的子集,接受兩個參數指定起始索引和截止索引(索引從 0 開始)。
LRANGE friends 0 -1
上面這條命令表示返回 friends 的全部元素,其中截止索引爲 -1 表示全部。
輸出結果大體以下:
1) "zzz" 2) "123"
Set 與 List 的區別在於 Set 裏面的元素是無序且不重複的。
主要的操做命令有SADD
、SREM
、SISMEMBER
、SMEMBERS
和 SUNION
。
SADD 命令會把指定的值添加到集合中:
SADD names 123
SREM 會把指定的值從集合中移出,意義爲Set Remove
。
SREM names 123
SISMEMBER 會檢測給出的值是不是給定集合的元素。
SISMEMBER names 123
返回值爲 1 或者 0,1 表明是,0 表明否。
SMEMBERS 返回集合的全部元素。
SMEMBERS names
輸出格式大體以下:
1) "123"
SUNION 表明求出多個集合的並集。
SUNION names1 names2
返回結果是一個新的集合。
該命令表示求兩個集合的交集。
SINTER names1 names2
返回結果爲一個新的集合。
該命令表示求兩個集合的差集。
SDIFF name1 name2
返回結果是 name1 中具備可是 name2 中沒有的元素所組成的集合,即爲差集。
與 SUNION 相似,可是區別於 SUNION,由於 SUNION 只會求出兩個集合的交集,而後返回結果;可是 SUNIONSTORE 不只會求出交集,還會把結果保存在目標集合中。若是目標集合已經存在,則會覆蓋掉已有的集合。
SADD name1 test1 SADD name1 test2 SADD name2 test3 SUNIONSTORE name name1 name2 SMEMBERS name
執行上述命令後,name1 和 name2 的交集會保存在 name 集合中。
無序集合在實際應用中仍是有一些掣肘,因此 Redis 1.2 引入了有序集合。
有序集合與普通的集合相似,可是每一項都有一個相關聯的數值,這個數值用於在集合中進行排序。
ZADD 表示在一個有序集合中新增一項,ZADD 接受 3 個參數:
好比:
ZADD hackers 1912 "Alan Turing"
該命令返回有序集合的子集,與 LRANGE 相似。
ZRANGE names 0 -1
返回 names 的全部元素。
該命令返回一個子集,子集中每一項的 score 都位於 min 和 max 之間。
ZRANGEBYSCORE names 100 200
一個 Hash 能夠在許多字段和字段的值之間構造映射關係,因此適合於表示對象。
該命令用於設置散列。
HSET person1 name "test" HSET person1 age 18 HSET person1 gender "male"
該命令用於返回某個 HASH 的全部數據。
HGETALL person1
輸出結果以下:
1) "name" 2) "test" 3) "age" 4) "18" 5) "gender" 6) "male"
該命令含義爲 hash multiple set
,即一次設置多對映射關係。
HMSET person2 name "test1" age 18 gender "female"
該命令表示獲取 HASH 中某一個字段的值
HGET person1 name
一樣的 HASH 結構中也有許多的原子性操做命令。
設置 HASH 中某個字段的值。
HSET person1 name "Jerry"
表示對 HASH 中的某個數值進行加操做。
HINCRBY person1 age 1
接受三個參數:
要想進行減操做時,參數 3 改爲負數便可。
該命令表示刪除 HASH 中的某一個屬性。
HDEL person1 name
此時這個字段及其對應的值都會被刪除掉。
更多 HASH 數據結構的操做命令能夠參考:HASHES
Redis 事務是一系列批量執行的 Redis 命令,區別於數據庫事務,Redis 事務不存在回滾機制,在某條命令執行失敗後不會取消事務,對於錯誤以前修改的數據也不會回滾。
Redis 事務主要依賴三條命令:MULTI
、EXEC
, WATCH
和 DISCARD
。
執行事務的步驟以下:
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。該模塊容許你按照指定的配置鏈接 Redis,而後進行數據操做。也有人對 node-redis
進行了進一步的封裝:redis-connection,該模塊在程序中能夠維持一個公用的 Redis 鏈接,可有效減小數據庫的鏈接數,提升數據庫的效率。