1. 程式人生 > 其它 >Redis常見的資料型別

Redis常見的資料型別

Redis--5種資料型別的基本操作

學習地址推薦

String(字串型別)

  • String 是 Redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。
  • String 型別是二進位制安全的。Redis 的 String 可以包含任何資料。比如jpg圖片或者序列化的物件
  • String 型別是 Redis 最基本的資料型別,String 型別的值最大能儲存 512MB。

基本操作

  • 新增 / 修改資料:set key value
  • 獲取資料:get key
  • 刪除資料:del key
  • 新增 / 修改多個數據:mset key value key1 value1
  • 獲取多個數據:mget key key1
  • 追加資訊到原始資料後邊(不存在時則新增):append key value

增減操作

  • 設定數值增加指定範圍的值
    • 預設每次加1:incr key
    • 每次新增value:incrby key value
  • 設定資料減少指定範圍的值
    • 預設每次減1:decr key
    • 每次減少value:decrby key value

時效操作

  • 設定過期時間:setex key seconds value

Hash

  • Redis hash 是一個鍵值(key=>value)對集合。
  • Redis hash 是一個 String 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

基本操作

  • 新增 / 修改資料:hset key field value
  • 獲取資料
    • 獲取一個:hget key field
    • 獲取多個:hgetall key
  • 刪除資料:hdel key field field1
  • 新增 / 修改多個數據:hmset key field value field1 value1
  • 獲取多個數據:hmget key field field1
  • 獲取表中欄位數量:hlen key
  • 獲取表中是否存在某個欄位:hexists key field

擴充套件操作

  • 獲取hash表中所有的欄位key:hkeys key
  • 獲取hash表中所有的欄位值:hvals key
  • 設定指定欄位的數值增加指定範圍的值:
    • hincrby key field increment
    • hincrbyfloat key field increment

List(列表)

  • 資料儲存需求:儲存多個數據,並對資料進行儲存空間的順序進行區分

  • 需要的資料結構:一個儲存空間儲存多個數據,且通過資料可以體現進入順序

  • list型別:儲存多個數據,底層使用雙向連結串列儲存結構實現

  • 列表(list)用於儲存多個有序的字串。列表是一種比較靈活的資料結構,可以充當棧和佇列的角色,在實際開發上有很多應用場景

    列表的特點:

    1. 列表中的元素是有序的,可以通過索引下標來獲取某個元素或者某個範圍內的元素列表
    2. 列表中的元素是可以重複的

基本操作

  • 新增 / 修改資料
    • 左邊新增: lpush key value value1
    • 右邊新增:rpush key value value1
  • 獲取資料
    • lrange key start end
    • lindex key index
    • llen key
  • 刪除資料
    • rpop key
    • lpop key

擴充套件操作

  • 在規定時間內獲取並移除資料
    • blpop key1 key2 timeout
    • brpop key1 key2 timeout

Set(集合)

  • 新的儲存需求:儲存大量的資料,在查詢方便提供更高的效率
  • 需要的儲存結構:能夠儲存大量的資料,高效的內部儲存機制,便於查詢
  • Set型別:與hash儲存結構完全相同,僅儲存鍵,不儲存值(nil),並且值是不允許重複的

基本操作

  • 新增 / 修改資料:sadd key member member1
  • 獲取資料:smembers key
  • 刪除資料:srem key member1
  • 獲取集合資料總量:scard key
  • 判斷集合中是否包含指定資料:sismember key member

擴充套件操作(隨機取數,交、並、差集)

  • 隨機獲取集合中指定數量的資料:srandmember key count
  • 隨機獲取集合中某個資料並將改資料集移除集合:spop key

兩個集合的交、並、差集

  • sinter key key1
  • sunion key key1
  • sdiff key key1

兩個集合的交、並、差集並存儲到指定集合中

  • sinterstore destination key1 key2
  • sunionstore destination key1 key2
  • sdiffstore destination key1 key2

ZSet(Sorted Set 有序集合)

在之前的四個型別中都不支援排序的,下來咱們看的sorted_set型別是既支援儲存大資料,也支援排序功能。

基本操作

  • 新增資料:zadd key score member
  • 獲取資料
    • zrange key start stop
    • zrevrange key start stop
  • 刪除資料:zrem key member
> zadd zset1 10 setVal1
(integer) 1
> zadd zset1 9 setVal2
(integer) 1
> zadd zset1 10 setVal3
(integer) 1

> zrange zset1 0 -1
1) "setVal2"
2) "setVal1"
3) "setVal3"
> zrange zset1 0 -1 withscores
1) "setVal2"
2) 9.0
3) "setVal1"
4) 10.0
5) "setVal3"
6) 10.0
> zrevrange zset1 0 -1 withscores
1) "setVal3"
2) 10.0
3) "setVal1"
4) 10.0
5) "setVal2"
6) 9.0

> zrem zset1 setVal1
1

擴充套件操作

  • 按條件獲取資料:
    • zrangebyscore key min max
    • zrevrangescore key max min
  • 條件刪除資料:
    • zremrangebyrank key start stop
    • zremrangebyscore key min max
  • 獲取集合資料總量:
    • zcard key
    • zcount key min max
> zrangebyscore test 2 3
1) "val2"
2) "val3"
> zrevrangebyscore test 3 2
1) "val3"
2) "val2"

> zremrangebyrank test 0 1
(integer) 2
> zremrangebyscore test 0 1
0

> zcard test
3
> zcount test 1 3
3
  • 集合交、並操作:

    • zinterstore destination numkeys key

    • zunionstore destination numkeys key

      (這個指令就不做演示了,可以自己檢視文件。跟set有點類似,只不過會把所有交集的和給加起來。然後這裡邊有個numkeys這個引數是一共幾個key進行計算 後邊的key就需要幾個)

  • 獲取資料對應的索引:

    • zrank key member
    • zrevrank key member
  • socre值獲取與修改:

    • zscore key member
    • zincrby key increment member

Redis其他的資料型別

bitmap 點陣圖

Redis 中的 bitmap 點陣圖是一串連續的二進位制數字,底層實際是基於 string 進行封裝儲存的,按 bit 位進行指令操作的。bitmap 中每一 bit 位所在的位置就是 offset 偏移,可以用 setbit、bitfield 對 bitmap 中每個 bit 進行置 0 或置 1 操作,也可以用 bitcount 來統計 bitmap 中的被置 1 的 bit 數,還可以用 bitop 來對多個 bitmap 進行求與、或、異或等操作。

bitmap 點陣圖的特點是按位設定、求與、求或等操作很高效,而且儲存成本非常低,用來存物件標籤屬性的話,一個 bit 即可存一個標籤。可以用 bitmap,存使用者最近 N 天的登入情況,每天用 1 bit,登入則置 1。個性推薦在社交應用中非常重要,可以對新聞、feed 設定一系列標籤,如軍事、娛樂、視訊、圖片、文字等,用 bitmap 來儲存這些標籤,在對應標籤 bit 位上置 1。對使用者,也可以採用類似方式,記錄使用者的多種屬性,並可以很方便的根據標籤來進行多維度統計。bitmap 點陣圖的重要指令包括:setbit、 getbit、bitcount、bitfield、 bitop、bitpos 等。

在移動社交時代,LBS 應用越來越多,比如微信、陌陌中附近的人,美團、大眾點評中附近的美食、電影院,滴滴、優步中附近的專車等。要實現這些功能,就得使用地理位置資訊進行搜尋。地球的地理位置是使用二維的經緯度進行表示的,我們只要確定一個點的經緯度,就可以確認它在地球的位置。

Redis 在 3.2 版本之後增加了對 GEO 地理位置的處理功能。Redis 的 GEO 地理位置本質上是基於 sorted set 封裝實現的。在儲存分類 key 下的地理位置資訊時,需要對該分類 key 構建一個 sorted set 作為內部儲存結構,用於儲存一系列位置點。

在儲存某個位置點時,首先利用 Geohash 演算法,將該位置二維的經緯度,對映編碼成一維的 52 位整數值,將位置名稱、經緯度編碼 score 作為鍵值對,儲存到分類 key 對應的 sorted set 中。

需要計算某個位置點 A 附近的人時,首先以指定位置 A 為中心點,以距離作為半徑,算出 GEO 雜湊 8 個方位的範圍, 然後依次輪詢方位範圍內的所有位置點,只要這些位置點到中心位置 A 的距離在要求距離範圍內,就是目標位置點。輪詢完所有範圍內的位置點後,重新排序即得到位置點 A 附近的所有目標。

  • 使用 geoadd,將位置名稱(如人、車輛、店名)與對應的地理位置資訊新增到指定的位置分類 key 中;
  • 使用 geopos 方便地查詢某個名稱所在的位置資訊;
  • 使用 georadius 獲取指定位置附近,不超過指定距離的所有元素;
  • 使用 geodist 來獲取指定的兩個位置之間的距離。

這樣,是不是就可以實現,找到附近的餐廳,算出當前位置到對應餐廳的距離,這樣的功能了?

Redis GEO 地理位置,利用 Geohash 將大量的二維經緯度轉一維的整數值,這樣可以方便的對地理位置進行查詢、距離測量、範圍搜尋。但由於地理位置點非常多,一個地理分類 key 下可能會有大量元素,在 GEO 設計時,需要提前進行規劃,避免單 key 過度膨脹。

Redis 的 GEO 地理位置資料結構,應用場景很多,比如查詢某個地方的具體位置,查當前位置到目的地的距離,查附近的人、餐廳、電影院等。GEO 地理位置資料結構中,重要指令包括 geoadd、geopos、geodist、georadius、georadiusbymember 等。

hyperLogLog 基數統計

Redis 的 hyperLogLog 是用來做基數統計的資料型別,當輸入巨大數量的元素做統計時,只需要很小的記憶體即可完成。HyperLogLog 不儲存元資料,只記錄待統計元素的估算數量,這個估算數量是一個帶有 0.81% 標準差的近似值,在大多數業務場景,對海量資料,不足 1% 的誤差是可以接受的。

Redis 的 HyperLogLog 在統計時,如果計數數量不大,採用稀疏矩陣儲存,隨著計數的增加,稀疏矩陣佔用的空間也會逐漸增加,當超過閥值後,則改為稠密矩陣,稠密矩陣佔用的空間是固定的,約為12KB位元組。

通過 hyperLoglog 資料型別,你可以利用 pfadd 向基數統計中增加新的元素,可以用 pfcount 獲得 hyperLogLog 結構中儲存的近似基數數量,還可以用 hypermerge 將多個 hyperLogLog 合併為一個 hyperLogLog 結構,從而可以方便的獲取合併後的基數數量。

hyperLogLog 的特點是統計過程不記錄獨立元素,佔用記憶體非常少,非常適合統計海量資料。在大中型系統中,統計每日、每月的 UV 即獨立訪客數,或者統計海量使用者搜尋的獨立詞條數,都可以用 hyperLogLog 資料型別來進行處理。

本文來自部落格園,作者:{BearBrick0},轉載請註明原文連結:{https://www.cnblogs.com/bearbrick}