《Redis入門指南》筆記一

本篇幅主要涉及Redis的配置、基礎命令、四種數據類型的操作命令

Redis是Remote Dictionary Server遠程字典服務器的縮寫,它以字典結構存儲數據,並允許其他應用通過TCP協議讀寫字典中的內容。到目前爲止Redis支持的鍵值數據類型如下

  • 1.字符串
  • 2.散列類型
  • 3.列表類型
  • 4.集合類型
  • 5.有序集合類型

Redis命令返回值
1.狀態回覆:狀態回覆(status reply)是最簡單的一種回覆,比如向Redis發送SET命令設置某個鍵的值時,Redis會回覆狀態OK表示設置成功。

redis>PING
PONG

2.錯誤回覆:當出現命令不存在或命令格式有錯誤等情況時Redis會返回錯誤回覆(error reply)。錯誤回覆以(error)開頭,並在後面跟上錯誤信息。如執行一個不存在的命令:

redis>ERRORCOMMAND
(error) ERR unknown command 'ERRORCOMMAND'

3.整數回覆:Redis雖然沒有整數類型,但是卻提供了一些用於整數操作的命令,如遞增鍵值的INCR命令會以整數形式返回遞增後的鍵值。除此之外,一些其他命令也會返回整數,如可以獲取當前數據庫中鍵的數量的DBSIZE命令等。

redis>INCR foo
1

4.字符串回覆:字符串回覆(bulk reply)是最常見的一種回覆類型,當請求一個字符串類型鍵的鍵值或一個其他類型鍵中的某個元素時就會得到一個字符串回覆

redis>GET foo
"hello"

5.多行字符串回覆:多行字符串回覆(multi-bulk reply)同樣很常見,如當請求一個非字符串類型鍵的元素列表時就會收到多行字符串回覆。多行字符串回覆中的每行字符串都以一個序號開頭,如:

redis>KEYS *
1) "bar"
2) "foo"


Redis啓動配置:
1.啓用配置文件

redis-server /path/to/redis.conf

2.通過啓動參數傳遞同名配置項覆蓋配置文件中的相應參數

redis-server /path/to/redis.conf --loglevel warning
redis-server --port  6380


Redis基礎命令
1.獲得符合pattern的鍵名列表

keys pattern

KEYS命令需要遍歷Redis中所有鍵,當鍵的數量較多時會影響性能,不建議在生產環境中使用

eg:返回redis中的所有鍵

redis>KEYS *

2.判斷一個鍵是否存在

EXISTS key

3.刪除鍵:不支持通配符匹配

DEL key [key...]

eg:刪除鍵bar、foo

redis>DEL bar foo

4.獲得鍵值的數據類型

TYPE key

Redis數據類型之String
1.賦值與取值

SET key value
GET key

2.遞增數字:只當鍵爲數字時該命令好用

INCR key

3.給key增加指定的整數只當鍵爲數字時該命令好用

INCRBY key increment

4.減少指定的整數

DECR key
DECRBY key decrement

5.向尾部追加值

APPEND key value

6.獲取字符串的 長度

STRLEN key

7.同時獲得/設置多個鍵值

MGET key [key...]
MSET key value [key value...]

8.位操作

GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP [OR|AND] destination key [key...]

Redis數據類型之散列類型
1.賦值與取值:HSET命令的方便之處在於不區分插入和更新操作,這意味着修改數據時不用事先判斷字段是否存在來決定要執行的是插入操作(update)還是更新操作(insert)。當執行的是插入操作時(即之前字段不存在)HSET命令會返回1,當執行的是更新操作時(即之前字段已經存在)HSET命令會返回0。更進一步,當鍵本身不存在時,HSET命令還會自動建立它。

HSET key field value
HGET key field
HMSET key field value[field value...]
HMGET key field [field...]
HGETALL key

2.判斷字段是否存在

HEXISTS key field

3.當字段不存在是賦值:該命令是原子操作,不需要擔心併發問題

HSETNX key field value

4.增加數字:命令會自動建立該鍵並默認field字段在執行命令前的值爲0

HINCRBY key field increment

5.刪除字段:返回被刪除字段的數量

HDEL key field [field...]

6.只獲取字段名或字段值

HKEYS key
HVALS key

7.獲取字段的數量

HLEN key

注:可以通過Redis的bit操作實現bitmap;使用bitmap的場景統計100萬個用戶的一年內登錄天數和億級別數據量重複數據查找

Redis數據類型之列表類型(可以類比java中的數組)
1.向列表兩端加入元素

LPUSH key value[value...] //向列表左邊加入元素
RPUSH key value[value...] //想列表右邊加入元素

2.從列表兩端彈出元素,彈出後元素就不在列表中了

LPOP key
RPOP key
  • 上面提到的4個命令可以使用列表類型來模擬棧和隊列的操作:如果想把列表當做棧,則搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想當成隊列,則搭配使用LPUSH和RPOP或RPUSH和LPOP。

3.獲取列表中元素的個數:當鍵不存在時LLEN返回0

LLEN key

4.獲得列表元素片段:並不會刪除列表中的元素

LRANGE key start stop //返回從start到stop之間的元素,start從0開始
  • LRANGE命令支持負索引,表示從右邊開始計算序數,如"-1"表示最右邊第一個元素,"-2"表示最右邊第二個元素,依次類推:顯然,LRANGE numbers 0-1可以獲取列表中的所有元素。另外一些特殊情況如下。

5.刪除列表中指定的元素

LREM key count value


LREM命令會刪除列表中前count個值爲value的元素,返回值是實際刪除的元素個數。根據count值的不同,LREM命令的執行方式會略有差異:

  • ● 當count > 0時LREM命令會從列表左邊開始刪除前 count個值爲 value的元素;
  • ● 當count < 0時LREM命令會從列表右邊開始刪除前|count|個值爲value的元素;
  • ● 當count = 0是LREM命令會刪除所有值爲value的元素。例如:

6.獲得或者給指定索引元素的值;類似java中數組的的arr[index]

LINDEX key index
LSET key index value
  • 如果index是負數則表示從右邊開始計算的索引,最右邊元素的索引是-1。

7.保留列表指定片段

LTRIM key start end

8.想列表中插入元素

LINSERT key BEFORE|AFTER pivot value
  • LINSERT命令首先會在列表中從左到右查找值爲pivot的元素,然後根據第二個參數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面。

9.將元素從一個列表轉到另一個列表,先執行RPOP命令再執行LPUSH命令。RPOPLPUSH命令會先從source列表類型鍵的右邊彈出一個元素,然後將其加入到destination列表類型鍵的左邊,並返回這個元素的值,整個過程是原子的。

RPOPLPUSH source destination

當把列表類型作爲隊列使用時,RPOPLPUSH命令可以很直觀地在多個隊列中傳遞數據。當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,藉助這個特性我們可以實現一個網站監控系統:使用一個隊列存儲需要監控的網址,然後監控程序不斷地使用RPOPLPUSH命令循環取出一個網址來測試可用性。這裏使用RPOPLPUSH命令的好處在於在程序執行過程中仍然可以不斷地向網址列表中加入新網址,而且整個系統容易擴展,允許多個客戶端同時處理隊列。


Redis數據類型之集合類型(類比java中的HashSet)
1,增加刪除元素:添加刪除集合中不存在的元素到集合,返回添加刪除成功的元素數量

SADD key member [member...]
SREM key member [member..,]

2,獲得集合所有元素

SMEMBERS key

3.判斷元素是否在集合中,存在返回1否則返回0

SISMEMBER key member

4.集合間的運算

SDIFF key [key...] //求集合之間的差集
SINTER key [key..] //求集合之間的交集
SUNION key [key..] //求集合之間的並集

5.獲得集合中元素個數

SCARD key

6.進行集合運算並將結果存儲:和SDIFF、SINTER、SUNION差不多不過是把運算結果存在destination鍵中。

SDIFFSTORE destination key [key...]
SINTERSTORE destination key [key...]
SUNIONSTORE destination key [key...]

 7.隨機獲得集合中的元素

SRANDMEMBER key [count]

還可以傳遞count參數來一次隨機獲得多個元素,根據count的正負不同,具體表現也不同。

  • (1)當count爲正數時,SRANDMEMBER會隨機從集合裏獲得count個不重複的元素。如果count的值大於集合中的元素個數,則SRANDMEMBER會返回集合中的全部元素。
  • (2)當 count 爲負數時,SRANDMEMBER會隨機從集合裏獲得|count|個的元素,這些元素有可能相同。

原理:使用SRANDMEMBER命令從集合中獲得一個隨機元素時,Redis首先會從所有桶中隨機選擇一個桶,然後再從桶中的所有元素中隨機選擇一個元素,所以元素所在的桶中的元素數量越少,其被隨機選中的可能性就越大,如圖
8.從集合中彈出一個元素,類似列表的LPOP,作用是從列表左邊彈出一個元素(即返回元素的值並刪除它)。SPOP命令的作用與之類似,但由於集合類型的元素是無序的,所以SPOP命令會從集合中隨機選擇一個元素彈出

SPOP key


Redis數據類型之有序集合類型
1.增加元素:ZADD命令用來向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數,分數支持整數和浮點數

ZADD key score member [score member...]

2.獲得元素分數

ZSCORE key member

3.獲得排名在某個範圍的元素列表,WITHSCORES參數使命令不僅返回member還會返回score

ZRANGE key start stop [WITHSCORES] //從小到大返回索引start到stop之間的元素
ZREVRANGE key start stop [WITHSCORES]//從大到小返回索引start到stop之間的元素
  • 如果兩個元素的分數相同,Redis會按照字典順序(即"0" < "9" < "A" < "Z" < "a" < "z"這樣的順序)來進行排列。再進一步,如果元素的值是中文怎麼處理呢?答案是取決於中文的編碼方式

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

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

該命令按照元素分數從小到大的順序返回分數在min和max之間(包含min和max)的元素;如果希望分數範圍不包括端點值,可以在min或者max之前加上"("修飾。同時min max支持正負無窮大,-inf和+inf分別表示正無窮和負無窮大;

eg:獲取scoreboard鍵分數在80(不包括80)到無窮大之間的member

ZRANGEBYSCORE scoreboard (80 +inf

limit offset count等價於MYSQL的分頁這裏不再贅述
5.增加某個元素的分數;返回增加後的分數

ZINCRBY key increment member

6.獲得集合中元素的數量

ZCARD key

7.獲得指定分數範圍內元素數量;ZCOUNT命令的min和max參數的特性與ZRANGEBYSCORE命令中的一樣:

ZCOUNT key min max

8.刪除一個或者多個元素;返回值是成功刪除元素的數量

ZREM key member [member...]

9.按照排名刪除元素

ZREMRANGEBYRANK key start stop
  • ZREMRANGEBYRANK命令按照元素分數從小到大的順序(即索引0表示最小的值)刪除處在指定排名範圍內的所有元素,並返回刪除的元素數量。

10.按照分數範圍刪除元素

ZREMRANGEBYSCORE key min max

11.獲得元素排名

ZRANK key member //獲得指定元素從小到大的元素排名,排名從0開始
ZREVRANK key member //獲得指定元素從大到小的元素排名,排名從0開始

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章