本篇文章帶大家了解一下redis中的三種特殊數(shù)據(jù)類型,感興趣的朋友可以學(xué) 習(xí)了解一下~
redis 三種特殊的數(shù)據(jù)類型
-
Geospatial 地理位置
-
Hyperloglog 基數(shù)統(tǒng)計(jì)
-
Bitmap 位圖場景
【相關(guān)推薦:Redis視頻教程】
Geospatial 地理位置
redis 3.2 版本就推出了 ?Geospatial
官方文檔上可以詳細(xì)的看到用法:
https://www.redis.net.cn/order/3685.html
Geospatial 可以使用在如下場景:
- 附近的人
- 打車計(jì)算距離
- 朋友定位
- 等一系列跟定位有關(guān)的場景
Geospatial 只有 六個(gè)命令
GEOADD
添加地理位置
- 有效的經(jīng)度從-180度到180度。
- 有效的緯度從-85.05112878度到85.05112878度。
當(dāng)坐標(biāo)位置超出上述指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。
- GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member …]
添加經(jīng)緯度,城市名
127.0.0.1:6379>?GEOADD?city?113.087559?28.251818?changsha (integer)?1 127.0.0.1:6379>?GEOADD?city?114.064552?22.548457?shenzhen (integer)?1 127.0.0.1:6379>?GEOADD?city?104.087045?30.666416?chengdu (integer)?1 127.0.0.1:6379>?GEOADD?city?118.802422?32.064653?nanjing (integer)?1 127.0.0.1:6379>?GEOADD?city?106.558434?29.568996?chongqing (integer)?1 127.0.0.1:6379>?GEOADD?city?121.463615?31.195908?shanghai (integer)?1 127.0.0.1:6379>?GEOADD?city?117.208093?39.091103?tianjin (integer)?1
GEOPOS
- GEOPOS key member [member …]
獲取指定城市的經(jīng)緯度信息
127.0.0.1:6379>?GEOPOS?city?changsha 1)?1)?"113.08755666017532349" ???2)?"28.25181827470789386" 127.0.0.1:6379>?GEOPOS?city?tianjin 1)?1)?"117.20809489488601685" ???2)?"39.0911021322545551"
GEODIST
- GEODIST key member1 member2 [m|km|ft|mi]
其中有如下 4 個(gè)單位:
m :米
km:公里
ft:英尺
mi:英里
獲取兩個(gè)城市之間的距離
127.0.0.1:6379>?GEODIST?city?changsha?tianjin "1264101.6876" 127.0.0.1:6379>?GEODIST?city?changsha?tianjin?km "1264.1017" 127.0.0.1:6379>?GEODIST?city?changsha?shenzhen?km "641.9034"
GEOHASH
- GEOHASH key member [member …]
返回一個(gè)或者多個(gè)GEOHASH 表示的元素, 返回 11 個(gè)字符 Geohash 字符串
127.0.0.1:6379>?GEOHASH?city?changsha 1)?"wt02tr5fg00" 127.0.0.1:6379>?GEOHASH?city?changsha?beijing 1)?"wt02tr5fg00" 2)?(nil) 127.0.0.1:6379>?GEOHASH?city?changsha?beijing?tianjin?chongqing 1)?"wt02tr5fg00" 2)?(nil) 3)?"wwgq7hk64t0" 4)?"wm7b0yc7zk0"
GEORADIUS
- GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOR
指定經(jīng)緯度作為原點(diǎn),指定半徑,查詢在指定范圍內(nèi)的城市,這些城市都是在我們自己的集合里面
127.0.0.1:6379>?GEORADIUS?city?110?30?500?m (empty?array) 127.0.0.1:6379>?GEORADIUS?city?110?30?500?km 1)?"chongqing" 2)?"changsha" 127.0.0.1:6379>?GEORADIUS?city?110?30?1000?km 1)?"chongqing" 2)?"chengdu" 3)?"shenzhen" 4)?"changsha" 5)?"nanjing" 127.0.0.1:6379>?GEORADIUS?city?110?30?700?km?withcoord 1)?1)?"chongqing" ???2)?1)?"106.55843228101730347" ??????2)?"29.56899626404301529" 2)?1)?"chengdu" ???2)?1)?"104.08704489469528198" ??????2)?"30.6664164635846177" 3)?1)?"changsha" ???2)?1)?"113.08755666017532349" ??????2)?"28.25181827470789386" 127.0.0.1:6379>?GEORADIUS?city?110?30?700?km?withdist 1)?1)?"chongqing" ???2)?"335.6530" 2)?1)?"chengdu" ???2)?"572.3911" 3)?1)?"changsha" ???2)?"357.4711" 127.0.0.1:6379>?GEORADIUS?city?110?30?700?km?withhash 1)?1)?"chongqing" ???2)?(integer)?4026059435699931 2)?1)?"chengdu" ???2)?(integer)?4026137831798506 3)?1)?"changsha" ???2)?(integer)?4050903792284309
GEORADIUSBYMEMBER
- GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
找出位于指定元素周圍的城市
127.0.0.1:6379>?GEORADIUSBYMEMBER?city?tianjin?1000?km 1)?"nanjing" 2)?"tianjin" 3)?"shanghai" 127.0.0.1:6379>?GEORADIUSBYMEMBER?city?tianjin?500?km 1)?"tianjin" 127.0.0.1:6379>?GEORADIUSBYMEMBER?city?tianjin?5000?km 1)?"chongqing" 2)?"chengdu" 3)?"shenzhen" 4)?"changsha" 5)?"shanghai" 6)?"nanjing" 7)?"tianjin"
Geospatial 底層的原理就是使用 Zset 有序集合來實(shí)現(xiàn)的,我們可以使用 Zset 有序集合的命令來操作 Geo ,咱們是用 Zset 的指令來感受一波
127.0.0.1:6379>?ZRANGE?city?0?-1 1)?"chongqing" 2)?"chengdu" 3)?"shenzhen" 4)?"changsha" 5)?"shanghai" 6)?"nanjing" 7)?"tianjin" 127.0.0.1:6379>?ZCARD?city (integer)?7
Hyperloglog 基數(shù)統(tǒng)計(jì)
基數(shù)是個(gè)啥?
基數(shù),就是不重復(fù)的數(shù),例如:
A = {1,2,3,4,5}
B = {2,3,4,5,6}
那么 A 和 B 的取并集的基數(shù)就是 6
簡介
Hyperloglog 是 redis 2.8.9 版本開始有的這種數(shù)據(jù)結(jié)構(gòu)
redis hyperloglog 基數(shù)統(tǒng)計(jì)也是一種算法
例如有這樣的應(yīng)用場景:
-
網(wǎng)頁訪問人數(shù)統(tǒng)計(jì),同一個(gè)用戶多次訪問網(wǎng)站,也是只算作 1
傳統(tǒng)的方式是使用 set 集合的方式來保存 id,統(tǒng)計(jì) set 里面 id 的個(gè)數(shù),來計(jì)算人數(shù)
這種方式也沒有問題,但是若數(shù)據(jù)量很大的時(shí)候,就會(huì)非常麻煩,因?yàn)槲覀兡?id 是沒有用的,我們只需要計(jì)數(shù)而已
優(yōu)點(diǎn)
? ? ? ? Hyperloglog ?占用的內(nèi)存空間是固定的,2^16 次方,只需要占用 12 KB 內(nèi)存,從內(nèi)存的角度來技術(shù)選型,Hyperloglog ?是首選哦
- PFADD key element [element …]
向 Hyperloglog ?中添加一個(gè)或者多個(gè)元素
- PFMERGE destkey sourcekey [sourcekey …]
將多個(gè) Hyperloglog ?取并集,得到一個(gè)結(jié)果 Hyperloglog ,里面的數(shù)據(jù)是不會(huì)重復(fù)的
127.0.0.1:6379>?PFADD?myhash??1?2?3?4?5?6?7?8 (integer)?1 127.0.0.1:6379>?pfadd?myhash2?3?4?5?6?7?8?9?0?88?99 (integer)?1 127.0.0.1:6379>?PFMERGE?res?myhash?myhash2 OK 127.0.0.1:6379>?PFCOUNT?res (integer)?12 127.0.0.1:6379>?PFCOUNT?myhash (integer)?8 127.0.0.1:6379>?PFCOUNT?myhash2 (integer)?10
Bitmaps 位圖場景
Bitmaps 位圖,位存儲(chǔ)
一般用于,統(tǒng)計(jì)用戶信息,活躍,不活躍,
登錄,不登錄
打卡,不打卡 等等,兩種狀態(tài)
Bitmaps 位圖,也是一種數(shù)據(jù)結(jié)構(gòu),是操作二進(jìn)制的方式來進(jìn)行記錄的,只有 0 ?和 1 兩種狀態(tài)
例如我們舉個(gè)例子,來記錄著一周每天的心情,1 是開心,0 是沮喪
- SETBIT key offset value
設(shè)置 bit 位的值
- GETBIT key offset
獲取 bit 位的值
127.0.0.1:6379> SETBIT week 0 1 (integer) 0 127.0.0.1:6379> SETBIT week 1 1 (integer) 0 127.0.0.1:6379> SETBIT week 2 1 (integer) 0 127.0.0.1:6379> SETBIT week 3 0 (integer) 0 127.0.0.1:6379> SETBIT week 4 0 (integer) 0 127.0.0.1:6379> SETBIT week 5 1 (integer) 0 127.0.0.1:6379> SETBIT week 6 1 (integer) 0 127.0.0.1:6379> GETBIT week 6 (integer) 1 127.0.0.1:6379> GETBIT week 5 (integer) 1
更多編程相關(guān)知識,請?jiān)L問:Redis視頻教程!!