[Redis 系列]redis 學習五,多學習一些 redis 的三種特殊資料型別

小魔童哪吒發表於2022-02-14

redis 三種特殊的資料型別

  • Geospatial 地理位置

  • Hyperloglog 基數統計

  • Bitmap 點陣圖場景

Geospatial 地理位置

redis 3.2 版本就推出了 Geospatial

官方文件上可以詳細的看到用法:

www.redis.net.cn/order/3685.html

Geospatial 可以使用在如下場景:

  • 附近的人
  • 叫車計算距離
  • 朋友定位
  • 等一系列跟定位有關的場景

Geospatial 只有 六個命令

GEOADD

新增地理位置

  • 有效的經度從-180度到180度。
  • 有效的緯度從-85.05112878度到85.05112878度。

當座標位置超出上述指定範圍時,該命令將會返回一個錯誤。

  • GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member …]

新增經緯度,城市名

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 …]

獲取指定城市的經緯度資訊

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 個單位:

m :米

km:公里

ft:英尺

mi:英里

獲取兩個城市之間的距離

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 …]

返回一個或者多個GEOHASH 表示的元素, 返回 11 個字元 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

指定經緯度作為原點,指定半徑,查詢在指定範圍內的城市,這些城市都是在我們自己的集合裡面

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 有序集合來實現的,我們可以使用 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 基數統計

基數是個啥?

基數,就是不重複的數,例如:

A = {1,2,3,4,5}

B = {2,3,4,5,6}

那麼 A 和 B 的取並集的基數就是 6

簡介

Hyperloglog 是 redis 2.8.9 版本開始有的這種資料結構

redis hyperloglog 基數統計也是一種演算法

例如有這樣的應用場景:

  • 網頁訪問人數統計,同一個使用者多次訪問網站,也是隻算作 1

    傳統的方式是使用 set 集合的方式來儲存 id,統計 set 裡面 id 的個數,來計算人數

    這種方式也沒有問題,但是若資料量很大的時候,就會非常麻煩,因為我們拿 id 是沒有用的,我們只需要計數而已

優點

​ Hyperloglog 佔用的記憶體空間是固定的,2^16 次方,只需要佔用 12 KB 記憶體,從記憶體的角度來技術選型,Hyperloglog 是首選哦

  • PFADD key element [element …]

向 Hyperloglog 中新增一個或者多個元素

  • PFMERGE destkey sourcekey [sourcekey …]

將多個 Hyperloglog 取並集,得到一個結果 Hyperloglog ,裡面的資料是不會重複的

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 點陣圖,位儲存

一般用於,統計使用者資訊,活躍,不活躍,

登入,不登入

打卡,不打卡 等等,兩種狀態

Bitmaps 點陣圖,也是一種資料結構,是操作二進位制的方式來進行記錄的,只有 0 和 1 兩種狀態

例如我們舉個例子,來記錄著一週每天的心情,1 是開心,0 是沮喪

  • SETBIT key offset value

設定 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

歡迎點贊,關注,收藏

朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這裡

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~

本作品採用《CC 協議》,轉載必須註明作者和本文連結
關注微信公眾號:小魔童哪吒

相關文章