Redis三種特殊資料型別
- Bitmaps
- Bitmaps型別的基礎操作
- 應用案例
- Hyperloglog
- HyperLogLog型別的基本操作
- Geospatial
- GEO型別的基本操作
Bitmaps
Bitmaps這個資料結構可以實作對位的操作,Bitmaps實際上就是字串,但是它可以對字串的位進行操作,
可以把Bitmaps想象成一個以位為單位陣列,陣列中的每個單元只能存0或者1,陣列的下標在bitmaps中叫做偏移量,單個bitmaps的最大長度是512MB,即2^32個位元位,
詳細可以參考大佬寫的
Bitmaps型別的基礎操作
- 獲取指定key對應偏移量上的bit值
getbit key offset
- 設定指定key對應偏移量上的bit值,value只能是1或0
setbit key offset value
使用bitmap來記錄 周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1.....
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
# 查看某一天是否有打卡!
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
#統計操作,統計打卡的天數
127.0.0.1:6379> bitcount sign # 統計這周打卡記錄,就可以看見是否全勤
(integer) 3
應用案例
- 電影網站
- 統計每天某一部電影是否被點播
- 統計每天有多少部電影被點播
- 統計每周/月/年有多少部電影被點播
- 統計年度哪部電影沒有被點播
解決方案
-
對指定key按位進行交、并、非、異或操作,并將結果保存到destKey中
bitop op destKey key1 [key2…]
- and:交
or:并
not:非
xor:異或
- and:交
-
統計指定key中1的數量
bitcount key [start end]
狀態的統計
127.0.0.1:6379> setbit 20201229 0 1 # 20201229日這一天 0號電腦 點播過 因此為1
(integer) 0
127.0.0.1:6379> setbit 20201229 4 1
(integer) 0
127.0.0.1:6379> setbit 20201229 8 1
(integer) 0
127.0.0.1:6379> setbit 20201230 0 1
(integer) 0
127.0.0.1:6379> setbit 20201230 5 1
(integer) 0
127.0.0.1:6379> setbit 20201230 8 1
(integer) 0
127.0.0.1:6379> bitcount 20201229
(integer) 3
127.0.0.1:6379> bitcount 20201230
(integer) 3
127.0.0.1:6379> setbit 20201229 6 1
(integer) 0
127.0.0.1:6379> bitcount 20201229
(integer) 4
127.0.0.1:6379> bitop or 29-30 20201229 20201230 # 合并
(integer) 2
127.0.0.1:6379> bitcount 29-30 # 就可以查看出有多少電影被點播
(integer) 5
- redis 應用于資訊狀態統計
Hyperloglog
Redis 2.8.9版本就更新了Hyperloglog資料結構
Redis Hyperloglog 基數統計的演算法
-
優點:占用的記憶體是固定,2^64 不同的元素的基數,只需要費12kb記憶體 ,如果要從記憶體角度來比較的話 Hyperloglog 就是首選
-
網頁的UV(一個人訪問一個網站多次,但是還是算作一個人)
-
傳統的方式,set保存用戶的id,然后就可以統計set中元素數量作為標準判斷!這個方式如果保存大量的用戶id,就會比較麻煩,我們的目的是為了計數,而不是保存用戶id
基數
- 基數是資料集去重后元素個數
- HyperLogLog 是用來做基數統計的,運用了LogLog的演算法

HyperLogLog型別的基本操作
-
添加資料
pfadd key element [element …]
-
統計資料
pfcount key [key …]
-
合并資料
pfmerge destkey sourcekey [sourcekey…]
127.0.0.1:6379> pfadd mykey a b c d e f g h i j # 創建第一組元素 mykey
(integer) 1
127.0.0.1:6379> pfcount mykey # 統計mykey中元素的基數數量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n a m # 創建第二組元素 mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 10
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 # 合并兩組 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3 # 查看并集的數量!
(integer) 15
如果允許容錯,那么一定可以使用Hyperloglog!
如果不允許容錯 ,就使用set或者自己的資料型別即可!
相關說明
- 用于進行基數統計,不是集合,不保存資料,只記錄數量而不是具體資料
- 核心是基數估算演算法,最終數值存在一定誤差
- 誤差范圍:基數估計的結果是一個帶有 0.81% 標準錯誤的近似值
- 耗空間極小,每個hyperloglog key占用了12K的記憶體用于標記基數
- pfadd命令不是一次性分配12K記憶體使用,會隨著基數的增加記憶體逐漸增大
- Pfmerge命令合并后占用的存盤空間為12K,無論合并之前資料量多少
Geospatial
Geospatial 地理位置
朋友的定位,附近的人,打車距離計算,但是計算出來的位置只算水平距離,不算垂直距離
Redis的Geo在Redis3.2版本就推出了!這功能可以推算地理位置的資訊,兩地之間的距離,方圓幾里的人
GEO型別的基本操作
-
添加坐標點
geoadd key longitude latitude member [longitude latitude member …]
-
獲取坐標點
geopos key member [member …]
-
計算坐標點距離
geodist key member1 member2 [unit]
-
根據坐標點求范圍內的資料
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
-
根據點求范圍內資料
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
-
獲取指定點對應的坐標hash值
geohash key member [member …]
geoadd 添加地理位置
規則:兩極無法直接添加,我們一般會下載城市資料,直接通過java程式一次性匯入!
引數 key 值(經度,緯度,名稱)
有效的經度從-180度到180度
有效的維度從-85.05112878度到85.05112878度
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin
(integer) 1
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 114.05 22.52 shengzhen 108.96 34.26 xian
(integer) 3
geopos 獲得當前定位:一定是一個坐標值
獲取指定城市的經度和緯度
127.0.0.1:6379> geopos china:city beijing chongqin xian shengzhen
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
4) 1) "114.04999762773513794"
2) "22.5200000879503861"
geodist
兩人之間的距離
單位:
m 表示單位為米,
km 表示單位為千米,
mi 表示單位為英里,
ft 表示單位為英尺,
127.0.0.1:6379> geodist china:city beijing shanghai # 查看北京到上海的直線距離
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqin km
"1464.0708"
127.0.0.1:6379> geodist china:city beijing xian km
"910.0565"
georadius 以給定的經緯度為中心, 找出某一半徑內的元素
我附近的人(獲取所有附近的人的地址 定位)通過半徑來查詢
所有的資料都應該錄入:china:city 才會讓結果更加清晰
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以110 30這個經緯度為中心尋找方圓1000km內的城市
1) "chongqin"
2) "xian"
3) "shengzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 顯示他人的定位資訊
1) 1) "chongqin"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 顯示到中心距離的位置
1) 1) "chongqin"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
# 篩選出指定的的結果
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 3
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
GEORADIUSBYMEMBER
找出位于指定元素周圍的其他元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 200 km
1) "hangzhou"
2) "shanghai"
GEOHASH
回傳一個或多個位置元素的 Geohash
將二維的經緯度轉換為一維的字串,如果兩個字串越接近,那么則距離越近
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
GEO底層的實作原理其實就是Zset 我們可以使用Zset命令來操作geo
zrem移除
127.0.0.1:6379> zrange china:city 0 -1 # 查看地圖中全部的元素
1) "chongqin"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing # 移除指定的元素
(integer) 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277823.html
標籤:其他
上一篇:常用Git命令
下一篇:hive sql系列(總結)
