redis的五種數據類型基本用法總結

NO IMAGE

簡言之:

redis 是一個開源的,高性能的,基於鍵值對的緩存存儲系統。通過提供多種鍵值數據類型來適應不同的場景下的緩存存儲需求。同時redis的諸多高級功能使其可以勝任消息隊列,任務隊列等不同的角色。

數據類型和基本命令

字符串類型(String)

是redis最基本的類型,能存任何形式的字符串,包括二進制數據。一個string類型的key允許存儲的最大容量是512MB,但勸你別這麼幹(存很大的數據),畢竟redis會把數據都加載到內存。

在這個鍵foo存一個bar值,或者更新foo裡面的存的值為bar:

SET foo bar

獲取這個foo裡面的值, 你將得到字符串bar:

GET foo

當鍵值裡面存的是數字,可以使用命令遞增數字:

INCR foo

它返回的是遞增以後的值。如果裡面存的不是數字,會報錯。

String類型應用場景示例:

  1. 訪問量統計
  2. 生成自增id
  3. 存儲其他你想存的字符串

其他命令:

增加指定的整數(返回增加後的值)

INCRBY key increment

減少指定的整數 && 減1(返回減少後的值)

DECRBY key decrement
DECR key

DECRBY key 5 和 INCRBY key -5的效果是一樣的。

增加指定的浮點數(返回增加後的值)

INCRBYFLOAT key increment\

在鍵值尾部追加字符串(返回追加後的總長度)

APPEND key value

獲取鍵值字符串長度

STRLEN key

同時設置 || 獲得多個鍵值

MSET key1 value1 key2 value2
MGET key1 key2

散列類型(Hash)

如果我們存的數據有多個部分組成,比如標題,作者,正文。這時候用散列比較合適了。散列類型的鍵值是一種字典結構,其存儲了字段和字段值的映射。一個散列類型鍵最多可以包含2^32-1個字段。技術上並不要求每個key存的字段都是一致的,如:key0裡面存的字段是title,author; key1裡面存的字段是content,title。

賦值&&取值

HSET key field1 value1
HGET key field1

同時設置 && 獲取多個字段的值 && 獲取所有字段和它們的值

HMSET key field1 value1 field2 value2
HMGET key field1 field2
HGETALL key

字段是否存在(不存在返回0,否則1):

HEXISTS key field

字段不存在時賦值(返回值與HEXISTS相反):

HSETNX key field value

增加數字(返回增加後的值):

HINCRBY key field increment

刪除字段(返回被刪的字段個數):

HDEL key field1 field2 …

Hash應用場景示例

  1. 存儲文章數據,或者別的多組成數據

其他命令:

只獲取字段名 || 字段值

HKEYS key
HVALS key

獲得字段數量

HLEN key

列表類型(List)

列表類型可以存儲有序的字符串列表,常見的操作是向列表兩端添加元素,或者獲取列表的某個片段。它是由雙向鏈表實現的,所以向兩端添加元素的時間複雜度是O(1),獲取越近兩端的元素速度越快。這種特性使它能快速完成下面場景:如社交網站的新鮮事,我們只關心最新的內容,即使裡面的數據幾千萬個,我們要找最新的100條也是很快的。一個列表類型的鍵最多能容納2^32-1個元素。命令:

  1. 向列表兩端增加元素:(返回增加後列表的長度)

LPUSH key value1 value2
RPUSH key value1 value2

  1. 從兩端彈出元素:(返回彈出的元素)

LPOP key
RPOP key

  1. 獲取列表中的元素的個數:(當key不存在返回0)

LLEN key

  1. 獲得列表中的片段:(start,stop的全閉區間)

LRANGE key start stop

LRANGE支持負索引,-1表示最右邊的元素,以此類推。

  1. 刪除列表中指定的值:(返回刪除元素的個數)

LREM key count value

將會刪除列表中前count個值為value的元素。

  • 當count>0,將會刪除列表中從左邊開始,前count個值為value的元素
  • 當count<0,將會刪除列表中從右邊開始,前abs(count)個值為value的元素
  • 當count==0,將會刪除列表中所有的,值為value的元素

List使用場景示例

  1. 文章id列表
  2. 評論列表
  3. 各種列表…

其他命令

  1. 獲取 || 設置指定索引的元素值

LINDEX key index
LSET key index value

  1. 只保留列表的指定片段

LTRIM key start stop

  1. 向列表中插入元素

LINSERT key BEFORE|AFTER value1 value2

在列表中從左到右查找值為value1的元素,然後根據第二個參數before還是after來確定value2插在前面還是後面。

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

RPOPLPUSH source destination

從名字就可以看出它的功能:先從source列表類型鍵的右邊彈出一個元素,然後將其加入到destination列表類型鍵的左邊,並返回這個元素的值,整個過程是原子的。

集合類型(Set)

行為很像高中數學課教過的集合。它每個元素是不同的,且沒有順序,一個集合類型的鍵最多可以存2^32-1個字符串。redis集合內部是使用值為空的散列表實現的,所以向集合中加入元素,刪除元素,判斷元素是否存在,這些操作的時間複雜度都是O(1)。最方便的是多個集合之間可以取交集,並集,差集。

命令:

  1. 增加 && 刪除元素(返回增加了多少個,刪除了多少個)

SADD key value1 value2 …
SREM key value1 value2 …

  1. 獲得集合中的所有元素

SMEMBERS key

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

SISMEMBER key value

  1. 取多個集合的差集

SDIFF key0 key1 key2 …

這個例子的意思是:先求key0有而key1沒有的元素集合keyTmp,然後再求keyTmp有而key2沒有的元素集合。

  1. 取集合間的交集

SINTER key0 key1 key2 …

求在三個幾個都存在的元素集合。

  1. 取集合間的並集

SUNION key0 key1 key2 …

Set使用場景示例

  1. 存儲文章標籤:
    比如,使用鍵名為post:id:tags的鍵存儲該篇文章的標籤。但並沒有使用到集合的優勢,這兒也可以使用簡單的字符串來存儲標籤。
  2. 通過標籤搜索文章:
    比如,使用鍵名為tag:標籤名:postIds的集合類型的鍵存儲文章id。 當我們需要找標籤同時滿足‘MySQL’和‘Java’, 那我們就可以用交集命令,飛快選出文章的id了。

其他命令

  1. 獲得集合中元素的個數

SCARD key

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

SDIFFSTORE destination key0 key1 key2 …

將key0 key1 key2的差集存到destination鍵中。

SINTERSTORE destination key0 key1 key2 …

將key0 key1 key2的交集存到destination鍵中。

SUNIONSTORE destination key0 key1 key2 …

將key0 key1 key2的並集存到destination鍵中。

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

SRANDMEMBER key [count]

  • 當count>0, 隨機從集合中獲得count個不同元素
  • 當count<0, 隨機從集合中獲得abs(count)個可能有重複的元素
  1. 從集合中隨機彈出一個元素

SPOP key

有序集合類型(ZSet)

與Set的區別就是‘有序’二字。
在集合的基礎上,有序集合為每個元素都關聯了一個分數,這使得我們不僅可以完成插入刪除,判斷元素是否存在等操作,還可以獲得分數最高(或最低)的前N個元素,獲得指定分數範圍內的元素等。元素是不同的,但是它們分數可以相同。

命令:

  1. 增加元素(返回增加的元素個數)

ZADD key score1 value1 score2 value2 …

如果元素已經存在則會替換元素的分數。分數是整數或者浮點數。

  1. 獲得元素的分數

ZSCORE key value

  1. 獲得排名在某個範圍的元素列表(全閉區間)

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

ZRANGE 命令會按照元素從小到大的順序返回索引從start到stop之間的元素,加上WITHSCORES會返回分數。ZREVRANGE則是從大到小的順序。

  1. 獲得指定分數範圍的元素列表(全閉區間)

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

按照分數從小到大的順序,返回分數在min到max之間的元素。如果希望分數範圍不包含端點值,可以這樣:

ZRANGEBYSCORE key 80 (100

limit,offset的用法與SQL相同。即,在獲得的元素基礎上向後偏移offset個元素,並且只獲取前count個。比如:

ZRANGEBYSCORE key 80 100 limit 1 3

ZREVRANGEBYSCORE則是從大到小的順序。

  1. 增加某個元素的分數(返回更改後的分數)

ZINCRBY key increment value

ZSet使用場景示例

  1. 各種排行榜

其他命令

  1. 獲得集合中元素的個數

ZCARD key

  1. 獲得指定分數範圍內的元素個數(全閉區間)

ZCOUNT key min max

要用開區間就用'(‘

  1. 刪除一個或者多個元素(返回刪除成功的數量)

ZREM key value1 value2 …

  1. 按照排名範圍刪除元素(全閉區間,返回刪除成功的數量)

ZREMRANGEBYRANK key start stop

按照從小到大的順序,刪除排名在start stop之間的元素,索引從0開始。

  1. 按照分數範圍刪除元素(全閉區間,返回刪除成功的數量)

ZREMRANGEBYSCORE key min max

要開區間,則用'(‘,比如

ZREMRANGEBYSCORE key 80 (100

  1. 獲得元素的排名

ZRANK key value
ZREVRANK key value

ZRANK從小到大,ZREVRANK從大到小,排名從0開始。

相關文章

React源碼Scheduler(三)React的調度算法實現

React源碼Scheduler(二)React的調度流程

React源碼Scheduler(一)瀏覽器的調度

Redis持久化