深入淺析redis中的三種特殊數(shù)據(jù)類型

本篇文章帶大家了解一下redis中的三種特殊數(shù)據(jù)類型,感興趣的朋友可以學(xué) 習(xí)了解一下~

深入淺析redis中的三種特殊數(shù)據(jù)類型

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

深入淺析redis中的三種特殊數(shù)據(jù)類型

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)

深入淺析redis中的三種特殊數(shù)據(jù)類型

? ? ? ? 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)

深入淺析redis中的三種特殊數(shù)據(jù)類型

例如我們舉個(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視頻教程!!

以上就是深入淺析

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享