首頁  >  文章  >  資料庫  >  深入淺析redis中的三種特殊資料類型

深入淺析redis中的三種特殊資料類型

青灯夜游
青灯夜游轉載
2021-08-24 10:57:102293瀏覽

這篇文章帶大家了解redis中的三種特殊資料類型,有興趣的朋友可以學習了解一下~

深入淺析redis中的三種特殊資料類型

redis 三種特殊的資料型別

  • Geospatial 地理位置

  • #Hyperloglog 基數統計

  • Bitmap 位圖場景

【相關推薦:Redis影片教學

Geospatial 地理位置

redis 3.2 版本推出了 Geospatial

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

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

深入淺析redis中的三種特殊資料類型

#Geospatial 可以使用在下列場景:

  • 附近的人
  • 叫計程車計算距離
  • #朋友定位
  • 等一連串跟定位有關的場景

Geospatial 只有六個指令

  • GEOADD
  • ##GEODIST
  • GEOHASH
  • GEOPOS
  • ##GEORADIUS
  • #GEORADIUSBYMEMBER
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  是首選哦深入淺析redis中的三種特殊資料類型

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 两种状态

    深入淺析redis中的三種特殊資料類型

    例如我们举个例子,来记录着一周每天的心情,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

更多编程相关知识,请访问:编程视频!!

以上是深入淺析redis中的三種特殊資料類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除