Redis經常使用數據類型介紹、使用場景及其操做命令

本文章同時也在cpper.info發佈。html

Redis目前支持5種數據類型,分別是:redis

  1. String(字符串)
  2. List(列表)
  3. Hash(字典)
  4. Set(集合)
  5. Sorted Set(有序集合)

下面就分別介紹這五種數據類型及其相應的操做命令。mongodb

1. String(字符串)

String是簡單的 key-value 鍵值對,value 不只能夠是 String,也能夠是數字。String在redis內部存儲默認就是一個字符串,被redisObject所引用,當遇到incr,decr等操做時會轉成數值型進行計算,此時redisObject的encoding字段爲int。數據庫

String在redis內部存儲默認就是一個字符串,被redisObject所引用,當遇到incr,decr等操做時會轉成數值型進行計算,此時redisObject的encoding字段爲int。json

應用場景

String是最經常使用的一種數據類型,普通的key/value存儲均可以歸爲此類,這裏就不所作解釋了。數組

相關命令

SET key value                   設置key=value
GET key                         或者鍵key對應的值
GETRANGE key start end          獲得字符串的子字符串存放在一個鍵
GETSET key value                設置鍵的字符串值,並返回舊值
GETBIT key offset               返回存儲在鍵位值的字符串值的偏移
MGET key1 [key2..]              獲得全部的給定鍵的值
SETBIT key offset value         設置或清除該位在存儲在鍵的字符串值偏移
SETEX key seconds value         鍵到期時設置值
SETNX key value                 設置鍵的值,只有當該鍵不存在
SETRANGE key offset value       覆蓋字符串的一部分從指定鍵的偏移
STRLEN key                      獲得存儲在鍵的值的長度
MSET key value [key value...]   設置多個鍵和多個值
MSETNX key value [key value...] 設置多個鍵多個值,只有在當沒有按鍵的存在時
PSETEX key milliseconds value   設置鍵的毫秒值和到期時間
INCR key                        增長鍵的整數值一次
INCRBY key increment            由給定的數量遞增鍵的整數值
INCRBYFLOAT key increment       由給定的數量遞增鍵的浮點值
DECR key                        遞減鍵一次的整數值
DECRBY key decrement            由給定數目遞減鍵的整數值
APPEND key value                追加值到一個鍵

其中用於操做管理鍵的命令有:數據結構

DEL key                         若是存在刪除鍵
DUMP key                        返回存儲在指定鍵的值的序列化版本
EXISTS key                      此命令檢查該鍵是否存在
EXPIRE key seconds              指定鍵的過時時間
EXPIREAT key timestamp          指定的鍵過時時間。在這裏,時間是在Unix時間戳格式
PEXPIRE key milliseconds        設置鍵以毫秒爲單位到期
PEXPIREAT key milliseconds-timestamp        設置鍵在Unix時間戳指定爲毫秒到期
KEYS pattern                    查找與指定模式匹配的全部鍵
MOVE key db                     移動鍵到另外一個數據庫
PERSIST key                     移除過時的鍵
PTTL key                        以毫秒爲單位獲取剩餘時間的到期鍵。
TTL key                         獲取鍵到期的剩餘時間。
RANDOMKEY                       從Redis返回隨機鍵
RENAME key newkey               更改鍵的名稱
RENAMENX key newkey             重命名鍵,若是新的鍵不存在
TYPE key                        返回存儲在鍵的數據類型的值。

使用示例

redis 127.0.0.1:6379> set baidu http://www.baidu
OK
redis 127.0.0.1:6379> append baidu .com
(integer) 20
redis 127.0.0.1:6379> get baidu
"http://www.baidu.com"
redis 127.0.0.1:6379> set visitors 0
OK
redis 127.0.0.1:6379> incr visitors
(integer) 1
redis 127.0.0.1:6379> incr visitors
(integer) 2
redis 127.0.0.1:6379> get visitors
"2"
redis 127.0.0.1:6379> incrby visitors 100
(integer) 102
redis 127.0.0.1:6379> get visitors
"102"
redis 127.0.0.1:6379> type baidu
string
redis 127.0.0.1:6379> type visitors
string
redis 127.0.0.1:6379> ttl baidu
(integer) -1
redis 127.0.0.1:6379> rename baidu baidu-site
OK
redis 127.0.0.1:6379> get baidu
(nil)
redis 127.0.0.1:6379> get baidu-site
"http://www.baidu.com"

2. List(列表)

Redis列表是簡單的字符串列表,能夠類比到C++中的std::list,簡單的說就是一個鏈表或者說是一個隊列。能夠從頭部或尾部向Redis列表添加元素。列表的最大長度爲2^32 - 1,也即每一個列表支持超過40億個元素。app

Redis list的實現爲一個雙向鏈表,便可以支持反向查找和遍歷,更方便操做,不過帶來了部分額外的內存開銷,Redis內部的不少實現,包括髮送緩衝隊列等也都是用的這個數據結構。memcached

應用場景

Redis list的應用場景很是多,也是Redis最重要的數據結構之一,好比twitter的關注列表、粉絲列表等均可以用Redis的list結構來實現,再好比有的應用使用Redis的list類型實現一個簡單的輕量級消息隊列,生產者push,消費者pop/bpop。測試

相關命令

  • BLPOP
    BLPOP key1 [key2 ] timeout 取出並獲取列表中的第一個元素,或阻塞,直到有可用
  • BRPOP
    BRPOP key1 [key2 ] timeout 取出並獲取列表中的最後一個元素,或阻塞,直到有可用
  • BRPOPLPUSH
    BRPOPLPUSH source destination timeout 從列表中彈出一個值,它推到另外一個列表並返回它;或阻塞,直到有可用
  • LINDEX
    LINDEX key index 從一個列表其索引獲取對應的元素
  • LINSERT
    LINSERT key BEFORE|AFTER pivot value 在列表中的其餘元素以後或以前插入一個元素
  • LLEN
    LLEN key 獲取列表的長度
  • LPOP
    LPOP key 獲取並取出列表中的第一個元素
  • LPUSH
    LPUSH key value1 [value2] 在前面加上一個或多個值的列表
  • LPUSHX
    LPUSHX key value 在前面加上一個值列表,僅當列表中存在
  • LRANGE
    LRANGE key start stop 從一個列表獲取各類元素
  • LREM
    LREM key count value 從列表中刪除元素
  • LSET
    LSET key index value 在列表中的索引設置一個元素的值
  • LTRIM
    LTRIM key start stop 修剪列表到指定的範圍內
  • RPOP
    RPOP key 取出並獲取列表中的最後一個元素
  • RPOPLPUSH
    RPOPLPUSH source destination 刪除最後一個元素的列表,將其附加到另外一個列表並返回它
  • RPUSH
    RPUSH key value1 [value2] 添加一個或多個值到列表
  • RPUSHX
    RPUSHX key value 添加一個值列表,僅當列表中存在

使用示例

redis 127.0.0.1:6379> lpush list1 redis
(integer) 1
redis 127.0.0.1:6379> lpush list1 hello
(integer) 2
redis 127.0.0.1:6379> rpush list1 world
(integer) 3
redis 127.0.0.1:6379> llen list1
(integer) 3
redis 127.0.0.1:6379> lrange list1 0 3
1) "hello"
2) "redis"
3) "world"
redis 127.0.0.1:6379> lpop list1
"hello"
redis 127.0.0.1:6379> rpop list1
"world"
redis 127.0.0.1:6379> lrange list1 0 3
1) "redis"

3. Hash(字典,哈希表)

相似C#中的dict類型或者C++中的hash_map類型。

Redis Hash對應Value內部實際就是一個HashMap,實際這裏會有2種不一樣實現,這個Hash的成員比較少時Redis爲了節省內存會採用相似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,對應的value redisObject的encoding爲zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding爲ht。

應用場景

假設有多個用戶及對應的用戶信息,能夠用來存儲以用戶ID爲key,將用戶信息序列化爲好比json格式作爲value進行保存。

相關命令

  • HDEL
    HDEL key field[field...] 刪除對象的一個或幾個屬性域,不存在的屬性將被忽略
  • HEXISTS
    HEXISTS key field 查看對象是否存在該屬性域
  • HGET
    HGET key field 獲取對象中該field屬性域的值
  • HGETALL
    HGETALL key 獲取對象的全部屬性域和值
  • HINCRBY
    HINCRBY key field value 將該對象中指定域的值增長給定的value,原子自增操做,只能是integer的屬性值可使用
  • HINCRBYFLOAT
    HINCRBYFLOAT key field increment 將該對象中指定域的值增長給定的浮點數
  • HKEYS
    HKEYS key 獲取對象的全部屬性字段
  • HVALS
    HVALS key 獲取對象的全部屬性值
  • HLEN
    HLEN key 獲取對象的全部屬性字段的總數
  • HMGET
    HMGET key field[field...] 獲取對象的一個或多個指定字段的值
  • HSET
    HSET key field value 設置對象指定字段的值
  • HMSET
    HMSET key field value [field value ...] 同時設置對象中一個或多個字段的值
  • HSETNX
    HSETNX key field value 只在對象不存在指定的字段時才設置字段的值
  • HSTRLEN
    HSTRLEN key field 返回對象指定field的value的字符串長度,若是該對象或者field不存在,返回0.
  • HSCAN
    HSCAN key cursor [MATCH pattern] [COUNT count] 相似SCAN命令

使用示例

127.0.0.1:6379> hset person name jack
(integer) 1
127.0.0.1:6379> hset person age 20
(integer) 1
127.0.0.1:6379> hset person sex famale
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "jack"
3) "age"
4) "20"
5) "sex"
6) "famale"
127.0.0.1:6379> hkeys person
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals person
1) "jack"
2) "20"
3) "famale"

4. Set(集合)

能夠理解爲一堆值不重複的列表,相似數學領域中的集合概念,且Redis也提供了針對集合的求交集、並集、差集等操做。

set 的內部實現是一個 value永遠爲null的HashMap,實際就是經過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的緣由。

應用場景

Redis set對外提供的功能與list相似是一個列表的功能,特殊之處在於set是能夠自動排重的,當你須要存儲一個列表數據,又不但願出現重複數據時,set是一個很好的選擇,而且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。

又或者在微博應用中,每一個用戶關注的人存在一個集合中,就很容易實現求兩我的的共同好友功能。

相關命令

  • SADD
    SADD key member [member ...] 添加一個或者多個元素到集合(set)裏
  • SACRD
    SCARD key 獲取集合裏面的元素數量
  • SDIFF
    SDIFF key [key ...] 得到隊列不存在的元素
  • SDIFFSTORE
    SDIFFSTORE destination key [key ...] 得到隊列不存在的元素,並存儲在一個關鍵的結果集
  • SINTER
    SINTER key [key ...] 得到兩個集合的交集
  • SINTERSTORE
    SINTERSTORE destination key [key ...] 得到兩個集合的交集,並存儲在一個集合中
  • SISMEMBER
    SISMEMBER key member 肯定一個給定的值是一個集合的成員
  • SMEMBERS
    SMEMBERS key 獲取集合裏面的全部key
  • SMOVE
    SMOVE source destination member 移動集合裏面的一個key到另外一個集合
  • SPOP
    SPOP key [count] 獲取並刪除一個集合裏面的元素
  • SRANDMEMBER
    SRANDMEMBER key [count] 從集合裏面隨機獲取一個元素
  • SREM
    SREM key member [member ...] 從集合裏刪除一個或多個元素,不存在的元素會被忽略
  • SUNION
    SUNION key [key ...] 添加多個set元素
  • SUNIONSTORE
    SUNIONSTORE destination key [key ...] 合併set元素,並將結果存入新的set裏面
  • SSCAN
    SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set裏面的元素

使用示例

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "World"
2) "Hello"
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0

使用集合數據結構的典型用例是朋友名單的實現:

redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica
(integer) 4
redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia
(integer) 3
redis 127.0.0.1:6379> sismember friends:leto jessica
(integer) 1   #無論一個用戶有多少個朋友,咱們都能高效地(O(1)時間複雜度)識別出用戶X是否是用戶Y的朋友
redis 127.0.0.1:6379> sismember friends:leto vladimir
(integer) 0
redis 127.0.0.1:6379> sinter friends:leto friends:duncan    #咱們能夠查看兩個或更多的人是否是有共同的朋友
1) "paul"
2) "jessica"
redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 能夠在一個新的關鍵字裏存儲結果
(integer) 2

5. Sorted Set(有序集合)

Redis有序集合相似Redis集合,不一樣的是增長了一個功能,即集合是有序的。一個有序集合的每一個成員帶有分數,用於進行排序。

Redis有序集合添加、刪除和測試的時間複雜度均爲O(1)(固定時間,不管裏面包含的元素集合的數量)。列表的最大長度爲2^32- 1元素(4294967295,超過40億每一個元素的集合)。

Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap裏放的是成員到score的映射,而跳躍表裏存放的是全部的成員,排序依據是HashMap裏存的score,使用跳躍表的結構能夠得到比較高的查找效率,而且在實現上比較簡單。

使用場景

Redis sorted set的使用場景與set相似,區別是set不是自動有序的,而sorted set能夠經過用戶額外提供一個優先級(score)的參數來爲成員排序,而且是插入有序的,即自動排序。當你須要一個有序的而且不重複的集合列表,那麼能夠選擇sorted set數據結構,好比twitter 的public timeline能夠以發表時間做爲score來存儲,這樣獲取時就是自動按時間排好序的。

又好比用戶的積分排行榜需求就能夠經過有序集合實現。還有上面介紹的使用List實現輕量級的消息隊列,其實也能夠經過Sorted Set實現有優先級或按權重的隊列。

相關命令

  • ZADD
    ZADD key score1 member1 [score2 member2] 添加一個或多個成員到有序集合,或者若是它已經存在更新其分數
  • ZCARD
    ZCARD key 獲得的有序集合成員的數量
  • ZCOUNT
    ZCOUNT key min max 計算一個有序集合成員與給定值範圍內的分數
  • ZINCRBY
    ZINCRBY key increment member 在有序集合增長成員的分數
  • ZINTERSTORE
    ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,並存儲生成一個新的鍵有序集合。
  • ZLEXCOUNT
    ZLEXCOUNT key min max 計算一個給定的字典範圍之間的有序集合成員的數量
  • ZRANGE
    ZRANGE key start stop [WITHSCORES] 由索引返回一個成員範圍的有序集合(從低到高)
  • ZRANGEBYLEX
    ZRANGEBYLEX key min max [LIMIT offset count]返回一個成員範圍的有序集合(由字典範圍)
  • ZRANGEBYSCORE
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,全部 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員,有序集成員按 score 值遞增(從小到大)次序排列
  • ZRANK
    ZRANK key member 肯定成員的索引中有序集合
  • ZREM
    ZREM key member [member ...] 從有序集合中刪除一個或多個成員,不存在的成員將被忽略
  • ZREMRANGEBYLEX
    ZREMRANGEBYLEX key min max 刪除全部成員在給定的字典範圍之間的有序集合
  • ZREMRANGEBYRANK
    ZREMRANGEBYRANK key start stop 在給定的索引以內刪除全部成員的有序集合
  • ZREMRANGEBYSCORE
    ZREMRANGEBYSCORE key min max 在給定的分數以內刪除全部成員的有序集合
  • ZREVRANGE
    ZREVRANGE key start stop [WITHSCORES] 返回一個成員範圍的有序集合,經過索引,以分數排序,從高分到低分
  • ZREVRANGEBYSCORE
    ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一個成員範圍的有序集合,以socre排序從高到低
  • ZREVRANK
    ZREVRANK key member 肯定一個有序集合成員的索引,以分數排序,從高分到低分
  • ZSCORE
    ZSCORE key member 獲取給定成員相關聯的分數在一個有序集合
  • ZUNIONSTORE
    ZUNIONSTORE destination numkeys key [key ...] 添加多個集排序,所得排序集合存儲在一個新的鍵
  • ZSCAN
    ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相關的分數

使用示例

redis 127.0.0.1:6379> zadd dbs 100 redis
(integer) 1
redis 127.0.0.1:6379> zadd dbs 98 memcached
(integer) 1
redis 127.0.0.1:6379> zadd dbs 99 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd dbs 99 leveldb
(integer) 1
redis 127.0.0.1:6379> zcard dbs
(integer) 4
redis 127.0.0.1:6379> zcount dbs 10 99
(integer) 3
redis 127.0.0.1:6379> zrank dbs leveldb
(integer) 1
redis 127.0.0.1:6379> zrank dbs other
(nil)
redis 127.0.0.1:6379> zrangebyscore dbs 98 100
1) "memcached"
2) "leveldb"
3) "mongodb"
4) "redis"

Reference

相關文章
相關標籤/搜索