Redis入門(2) - 數據類型

  • Redis中的數據類型
  • 字符串
  • 散列
  • 列表
  • 集合
  • 有序集合

Redis中的數據類型

Redis定義了這幾種數據類型:redis

  • string(字符串)
  • hash(散列)
  • list(列表)
  • set(集合)
  • zset(有序集合)
    後面會介紹它們各自的特色和使用場景。能夠用TYPE命令來獲取鍵的類型。

字符串

字符串類型是Redis中最基本的數據類型,它能存儲任何形式的字符串,包括二進制數據。能夠用其存儲用戶的郵箱、JSON化的對象甚至是一張圖片。一個字符串類型鍵容許存儲的數據的最大容量是512 MB。
字符串類型是其餘4種數據類型的基礎,其餘數據類型和字符串類型的差異從某種角度來講只是組織字符串的形式不一樣。例如,列表類型是以列表的形式組織字符串,而集合類型是以集合的形式組織字符串。併發

賦值、取值

SET key value
GET key

SET成功返回OK,GET鍵不存在時返回空(nil)。app

增長、減小數字

當操做的字符串是數字形式時,能夠用這些命令方便地增長、減小數字
遞增、遞減操做分別爲:編碼

INCR key
DECR key

當操做的鍵不存在時,會先建立一個默認爲0的值,因此使用INCR獲得的結果爲1。
若是被操做的鍵值不是整數,會給出錯誤提示: (error) ERR value is not an integer or out of rangecode

增長、減小指定整數:對象

INCRBY key increment
DECRBY key decrement

INCRBY key1 3就至關於DECRBY key1 -3排序

增長、減小指定浮點數,支持雙精度浮點數。索引

INCRBYFLOAT key increment
DECRBYFLOAT key decrement

這些命令都是原子操做,能夠保證多客戶端鏈接的併發場景下讀取寫入不會出錯。隊列

向尾部追加值

APPEND key value

若是鍵不存在則將該鍵的值設置爲value。返回值是追加後字符串的總長度。圖片

> SET key1 hello
OK
> APPEND key " world!"
(integer) 12

上面的操做獲得的就是「hello world」,因爲須要在單詞之間有空格,append時的值用雙引號包裹。

獲取字符串長度

STRLEN key

若是鍵不存在則返回0。

同時獲取/設置多個鍵值

MGET key1 key2 ...
MSET key value key1 value1 ...

散列

Redis是採用字典結構以鍵值對的形式存儲數據,而散列類型(hash)的鍵值也是一種字典結構,其存儲了字段(field)和字段值的映射,但字段值只能是字符串,不支持其餘數據類型,因此不能嵌套存儲其餘數據類型。Redis的其餘數據類型也不支持數據類型的嵌套,好比集合類型的每一個元素都只能是字符串。
一個散列類型的鍵能夠最多包含2^32-1個字段。
散列類型適合存儲對象,使用類名和ID構成鍵名,使用字段表示對象的屬性,而字段值則存儲屬性的值,這樣散列類型就與最簡單的DTO類構成了映射關係。

賦值與取值

HSET key field value
 HGET key field

這組命令用來設置、獲取單個字段的值。HSET命令不區分插入和更新操做,修改數據時不用事先判斷字段是否存在來決定要執行的是插入仍是更新,能夠經過命令的返回結果來判斷插入仍是更新,插入時返回1,更新時會返回0。當鍵或者字段不存在時,HSET命令還會自動創建它們。

HMSET、HMGET則能夠一次操做多個字段:

HMSET key field value [field value ...]
 HMGET key field [field value  ...]

獲取鍵的全部字段使用HGETALL:

HGETALL key

這個命令返回的結果是字段和字段值組成的列表:

1)"price"
2)"500"
3)"name"
4)"BMW"

判斷字段是否存在

HEXISTS key field

若是存在則返回1,不然返回0,若是鍵不存在也會返回0。

當字段不存在時賦值

HSETNX key field value

HSETNX命令只有當字段不存在時才進行賦值,若是字段已經存在,將不執行任何操做。

增長、減小數字

HINCRBY key field increment

須要減小值時增量設爲負值。若是鍵或者值不存在時將初始化並設置爲1。

刪除字段

HDEL key field1 field2 ...

能夠刪除一個或多個字段,被刪除的字段個數做爲返回值。

只獲取字段名或字段值

HKEYS key
HVALS key

這組命令會獲取鍵中全部字段的名稱或值。

列表

列表類型能夠存儲一個有序的字符串列表,經常使用的操做是向列表兩端添加元素,或者得到列表的某一個片斷。列表類型內部是使用雙向鏈表實現的,向列表兩端添加元素的時間複雜度爲O(1),獲取越接近兩端的元素速度就越快,但經過索引訪問元素的速度卻比較慢。

因此列表類型最適合於訪問前某幾個元素的場景,好比熱點新聞。一個列表類型鍵最多能容納的元素數量也是2^32-1個。

向列表兩端增長元素

LPUSH key value [value ...]
 RPUSH key value [value ...]

LPUSH和RPUSH分別用來先列表的左邊和右邊增長元素,返回值表示增長元素後列表的長度。能夠同時增長多個元素。

從列表兩端彈出元素

LPOP key
 RPOP key

LPOP和RPOP分別從列表的左邊和右邊彈出一個元素,返回值元素的內容,若是列表爲空,返回(nil)。

獲取列表中元素的個數

LLEN key

若是列表爲空或不存在,則返回0。

得到列表片斷

LRANGE key start stop

返回索引從start到stop之間的全部元素(包含兩端的元素),與大多數人的直覺相同,Redis的列表起始索引,左邊爲從0開始,右邊爲從-1開始,-2表示右邊第二個元素,以此類推。
若是start的索引位置比stop的索引位置靠後,則會返回空列表;若是stop大於實際的索引範圍,則會返回到列表最右邊的元素。

刪除列表中指定的值

LREM key count value

刪除列表中前count個值爲value的元素,返回值是實際刪除的元素個數。
count值的正負會決定從刪除開始的方向:

  • 當count>0時LREM命令會從列表左邊開始刪除前count個值爲value的元素;
  • 當count<0時LREM命令會從列表右邊開始刪除前|count|個值爲value的元素;
  • 當count=0時LREM命令會刪除列表中全部值爲value的元素。

得到/設置指定索引的元素值

LINDEX key index
LSET key index value

與LREM相似,index >= 0表示從左邊開始計算索引,index < 0則從右邊開始。

只保留列表指定片斷

LTRIM key start end

刪除指定索引範圍以外的全部元素,其指定列表範圍的方法和LRANGE命令相同。

向列表中插入元素

LINSERT key BEFORE|AFTER privot value

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

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

RPOPLPUSH source destination

這個命令會先對source執行RPOP命令,從它的右邊彈出一個元素,再對destination執行LPUSH命令,將元素加入到這個列表的左邊,並返回這個元素的值。整個過程是原子的。
RPOPLPUSH命令能夠很直觀地在多個隊列中傳遞數據。當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,同時列表中仍然能夠增長、刪除元素。

集合

同列表類型相比,集合類型中的元素不能相同,同時元素沒有順序。
一個集合類型鍵能夠存儲的字符串數量最多也是2^32 -1個。
集合類型的經常使用操做是向集合中加入或刪除元素、判斷某個元素是否存在等,因爲集合類型在Redis內部是使用值爲空的散列表(hashtable)實現的,因此這些操做的時間複雜度都是O(1)。最方便的是多個集合類型鍵之間還能夠進行並集、交集和差集運算。

增長/刪除元素

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

這組命令用來向集合中增長或刪除一個或多個元素,增長時若是鍵不存在則會自動建立。由於在一個集合中不能有相同的元素,因此增長時若是要加入的元素已經存在於集合中,就會忽略這個元素。命令的返回值是成功加入或刪除的元素數量。

得到集合中的全部元素

SMEMBERS key

判斷元素是否在集合中

SISMEMBER key mumber

這項操做的時間複雜度爲O(1),不管集合中有多少個元素,SISMEMBER命令均可以很是快地返回結果。當值存在時返回1,不存在或鍵不存在時返回0。

得到集合中元素個數

SCARD key

集合間運算

SDIFF key [key...]
 SINTER key [key...]
 SUNION key [key...]

這組命令用來對多個集合進行差集、交集、並集運算。

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

這組命令會把集合間運算的結果存儲到destination中。

有序集合

有序集合類型與集合類型相比,它爲其中的每一個元素都關聯了一個分數,這使得能夠對元素進行取前N個、得到指定分數範圍內的元素等操做。
有序集合中的元素也是各不相同的,但元素的分數能夠相同。

有序集合類型與列表類型相比,類似的地方在於兩者都是有序的,也均可以得到指定範圍的元素;但他們的區別大於共性:

  • 在存儲結構上,列表類型是經過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,因此它更適合不多訪問中間元素的場景;有序集合類型則是使用散列表和跳躍表實現的,因此即便讀取位於中間部分的數據速度也很快。

  • 列表中不能簡單地調整某個元素的位置,可是在有序集合中經過更改元素的分數就能夠作到。

  • 有序集合要比列表類型更耗費內存。

增長元素

ZADD key score member [score member ...]

ZADD命令用來向有序集合中加入若干元素和該元素的分數,若是該元素已經存在則會用新的分數替換原有的分數。命令的返回值是新加入到集合中的元素個數(不包含以前已經存在的元素)。
這裏設置的分數能夠是整數,也能夠是雙精度浮點數,還能夠設置爲+inf和-inf來分別表示正無窮和負無窮。

得到元素的分數

ZSCORE key member

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

ZRANGE key start stop [WITHSCORES]
 ZREVRANGE key start stop [WITHSCORES]

ZRANGE和ZREVRANGE命令分別按照元素分數從小到大和從大到小的的順序返回索引從start到stop之間的全部元素(包含兩端的元素)。
在命令的尾部加上WITHSCORES能夠同時得到元素的分數。
若是兩個元素的分數相同,Redis會按照字典順序(即"0" < "9" <"A" < "Z" < "a" < "z"這樣的順序)來進行排列,若是元素是中文,會按照中文編碼來排序。

索引>=0表示從前日後查找,爲<0表示從後往前查找。

ZRANGE key1 0 4
 ZRANGE key1 1 -1

得到指定分數範圍的元素

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

按照元素分數從小到大的順序返回分數在min和max之間的元素,默認包含min和max,若是但願分數範圍不包含端點值,能夠在分數前加上'('符號

ZRANGEBYSCORE key1 (60 80

這樣寫獲取的範圍就是 60< score <= 80。

這裏也一樣能夠用-inf和+inf分別表示負無窮和正無窮。

用WITHSCORES能夠同時得到元素的分數。

[LIMIT offset count]表示在得到的元素列表的基礎上向後偏移offset個元素,而且只獲取前 count個元素。
好比想得到分數高於60分的從第二我的開始的3我的:

ZRANGEBYSCORE key1 60 +inf LIMIT 1 3

與ZRANGEBYSCORE對應的,還有ZREVRANGEBYSCORE,它會按照元素分數從大到小的順序返回分數在max和min之間的元素

ZREVRANGEBYSCORE key max min [WITHSCORE] [LIMIT offset count]

增長某個元素的分數

ZINCRBY key increment member

返回值是更改後的分數,這個操做也是原子的。

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

ZCOUNT key min max

min max能夠指定爲+inf -inf,也能夠用(來設置邊界條件。

刪除一個或多個元素

ZREM key member [member ...]

返回值是成功刪除的元素數量(不包含原本就不存在的元素)。

按照排名範圍刪除元素

ZREMRANGEBYRANK key start stop

按照元素分數從小到大的順序(即索引0表示最小的值)刪除處在指定排名範圍內的全部元素,並返回刪除的元素數量。索引負值表示從後向前查找。

按照分數範圍刪除元素

ZREMRANGEBYSCORE key min max

刪除指定分數範圍內的全部元素,參數min和max的特性和ZRANGEBYSCORE命令中的同樣。返回值是刪除的元素數量。

得到元素的排名

ZRANK key member
 ZREVRANK key member

這組命令會分別按照元素分數從小到大、從大到小的順序得到指定的元素的排名(從0開始,即分數最小或最大的元素排名爲0)

相關文章
相關標籤/搜索