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:
- 設定資料減少指定範圍的值
- 預設每次減1:
decr key
- 每次減少value:
decrby key value
- 預設每次減1:
時效操作
- 設定過期時間:
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)用於儲存多個有序的字串。列表是一種比較靈活的資料結構,可以充當棧和佇列的角色,在實際開發上有很多應用場景
列表的特點:
- 列表中的元素是有序的,可以通過索引下標來獲取某個元素或者某個範圍內的元素列表
- 列表中的元素是可以重複的
基本操作
- 新增 / 修改資料
- 左邊新增:
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}