溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-08-24 11:23:18 來源:億速云 閱讀:136 作者:chen 欄目:關(guān)系型數(shù)據(jù)庫

本篇內(nèi)容主要講解“redis中的三種特殊數(shù)據(jù)類型”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“redis中的三種特殊數(shù)據(jù)類型”吧!

redis 三種特殊的數(shù)據(jù)類型

  • Geospatial 地理位置

  • Hyperloglog 基數(shù)統(tǒng)計(jì)

  • Bitmap 位圖場景

Geospatial 地理位置

redis 3.2 版本就推出了  Geospatial

官方文檔上可以詳細(xì)的看到用法:

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

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

Geospatial 可以使用在如下場景:

  • 附近的人

  • 打車計(jì)算距離

  • 朋友定位

  • 等一系列跟定位有關(guān)的場景

Geospatial 只有 六個(gè)命令

  • GEOADD

  • GEODIST

  • GEOHASH

  • GEOPOS

  • GEORADIUS

  • GEORADIUSBYMEMBER

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),指定半徑,查詢?cè)谥付ǚ秶鷥?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 myhash3 3 4 5 6 7 8 9 0 88 99
(integer) 1
127.0.0.1:6379> PFMERGE res myhash myhash3
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 myhash3
(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

到此,相信大家對(duì)“redis中的三種特殊數(shù)據(jù)類型”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI