前言
redis中的這三個數據類型在很多開源的項目中都有使用到,除了日常開發中使用JAVA去實現某些功能外,還可以通過這些特殊的數據類型進行實現,本文也簡單介紹了這三種數據類型使用的場景,可以幫助讀者在開發中實現功能提供新的思路。
一、Geospatial(地理位置)
Geospatial類型Redis官方文檔-Redis geospatial | Redis
Redis中的Geospatial是一個用于地理空間數據的功能模塊,它可以存儲和查詢地理坐標、半徑、矩形、多邊形等地理空間對象。通過使用Geospatial,您可以對地理空間對象進行各種操作,例如計算兩個地點之間的距離、查找位于給定半徑內的地點、查找位于給定矩形或多邊形內的地點等。
基礎命令
- GEOADD adds a location to a given geospatial index (note that longitude comes before latitude with this command).
- GEOSEARCH returns locations with a given radius or a bounding box.
命令演示
1. 添加地理位置
Geospatial規則: 兩級無法直接添加,我們一般會下載城市數據,直接通過java序一次性導入!
有效的經度從-180度到180度. 有效的緯度從-85.05112878度到85.05112878度。
參數:key 值:經度 緯度 名稱
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijin
(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 chognqin 114.05 22.52 shenzheng
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
2. 獲取城市地理位置
127.0.0.1:6379> GEOPOS china:city beijin #獲取城市的經度和緯度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
3. 計算兩個城市之間的距離
127.0.0.1:6379> GEODIST china:city beijin shanghai
"1067378.7564"
127.0.0.1:6379> GEODIST china:city beijin shanghai km #單位有m、km、mi、ft
"1067.3788"
4. 以給定的經緯度為中心,找出某一半徑內的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #經度110,緯度30為中心,尋找半徑1000km以內的城市
1) "chognqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km count 2 #限制查詢的數量
1) "chognqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord #顯示經度緯度
1) 1) "chognqin"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
3) 1) "shenzheng"
2) 1) "114.04999762773513794"
2) "22.5200000879503861"
4) 1) "hangzhou"
2) 1) "120.1600000262260437"
2) "30.2400003229490224"
5. 以城市為中心尋找其它城市
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijin 1000 km
1) "beijin"
2) "xian"
6. 將經緯度轉化為字符串
127.0.0.1:6379> GEOHASH china:city beijin
1) "wx4fbxxfke0"
7. 使用Zset的命令來操作Geospatial
==Geospatial的底層實現原理就是Zset,可以用Zset命令來操作Geospatial==
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijin"
127.0.0.1:6379> ZREM china:city xian
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chognqin"
2) "shenzheng"
3) "hangzhou"
4) "shanghai"
5) "beijin"
二、 HyperLogLog(基數統計)
HyperLogLog類型Redis官方文檔-HyperLogLog | Redis
HyperLogLog常用于大數據量的統計,比如頁面訪問量統計或者用戶訪問量統計。其實現最多使用 12 KB,并提供 0.81% 的標準誤差。
什么是基數?
基數在數學中是集合論中刻畫任意集合大小的一個概念。它表示一個集合中不同元素的個數。例如,集合{1, 2, 3, 3, 4, 5, 5, 6, 6, 6}中有9個元素,但其中不重復的元素只有1、2、3、4、5、6,所以它的基數是6。
基礎命令
- PFADD adds an item to a HyperLogLog.
- PFCOUNT returns an estimate of the number of items in the set.
- PFMERGE combines two or more HyperLogLogs into one.
命令演示
1. 創建元素,并統計其中的個數
127.0.0.1:6379> PFADD mykey a b c d e f g h i j #創建一組元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey #統計基數數量
(integer) 10
127.0.0.1:6379> PFADD mykey2 i jz x c v b n m
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 8
2. 合并元素
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #mykey 和mykey2合并為mykey3(并集)
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
三、BitMaps
BitMaps類型Redis官方文檔-Redis bitmaps | Redis
Redis中的BitMaps是一種基于位圖的數據結構,它允許用戶將位圖存儲為字符串,并對其進行位操作。
基礎命令
- SETBIT sets a bit at the provided offset to ==0 or 1==.
- GETBIT returns the value of a bit at a given offset.
- BITOP lets you perform bitwise operations against one or more strings.
命令演示
1. 使用BitMaps來記錄狀態
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 1
(integer) 0
2. 查看狀態
127.0.0.1:6379> GETBIT sign 1
(integer) 0
127.0.0.1:6379> GETBIT sign 3
(integer) 1
3. 統計狀態
127.0.0.1:6379> BITCOUNT sign
(integer) 4