天天看點

Redis三種特殊資料類型Redis三種特殊結構的資料類型

Redis三種特殊結構的資料類型

geospatial

朋友的定位、附近的人、打車距離計算?

Redis的Geospatial在Redis3.2就推出了,這個功能可以推算地理位置的資訊,兩地之間的距離,方圓幾裡的人!

  1. getadd 添加地理位置,規則:兩級無法直接添加,我們一般會下載下傳城市資料,直接通過java程式一次性導入!參數 key 值(次元、經度、名稱)

    例如:

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing #添加城市的經度緯度

(integer) 1

127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen

(integer) 2

127.0.0.1:6379> GEOPOS china:city beijing shenzhen #擷取指定城市的經度緯度

1) 1) “116.39999896287918091”

2) “39.90000009167092543”

2) 1) “114.04999762773513794”

2) “22.5200000879503861”

  1. GEODIST:兩人之間的距離!

    機關:

    m表示機關、km表示千米

    127.0.0.1:6379> GEODIST china:city beijing shenzhen #北京到深圳的直線距離 機關:米

    “1945788.0901”

    127.0.0.1:6379> GEODIST china:city beijing shenzhen km #北京到深圳的直線距離 機關:千米

    “1945.7881”

  2. GEORADIUS 以給定的經緯度為中心,找出某一半徑内的元素

    我附近的人?(獲得所有附近的人的位址,定位!)通過半徑來查詢!

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #查詢以110 30經緯度為中心,半徑為1000km的中國城市

1) “chongqing”

2) “shenzhen”

127.0.0.1:6379> GEORADIUS china:city 110 30 500 km

1) “chongqing”

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist #withdist顯示直線距離

1) 1) “chongqing”

2) “341.9374”

2) 1) “shenzhen”

2) “924.6408”

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord #顯示經緯度

1) 1) “chongqing”

2) 1) “106.49999767541885376”

2) “29.52999957900659211”

2) 1) “shenzhen”

2) 1) “114.04999762773513794”

2) “22.5200000879503861”

#找出位于指定元素周圍的其他元素:

127.0.0.1:6379> GEORADIUSBYMEMBER china:city chongqing 1100 km

1) “chongqing”

2) “shenzhen”

GEOHASH指令-傳回一個或多個位置元素的Geohash字元串屬性

127.0.0.1:6379> ZRANGE china:city 0 -1

1) “chongqing”

2) “shenzhen”

3) “beijing”

127.0.0.1:6379> zrem china:city beijing

(integer) 1

127.0.0.1:6379> ZRANGE china:city 0 -1

1) “chongqing”

2) “shenzhen”

Hyperloglog

什麼是基數?

A{1,3,5,7,8,9} B{1,3,5,7,8}

基數(不重複的元素)= 5,可以接受誤差!

簡介

Redis2.8.9版本就更新了Hyperloglog資料結構!

Redis Hyperloglog 基數統計的算法!

優點:占用的記憶體是固定,2^64不同的元素的技術,隻需要費12KB記憶體!

網頁的UV(一個人通路一個網站多次,但是還是算作一個人!)

傳統的方式,set儲存使用者的id,然後就可以統計set中的元素數量作為标準判斷!

這個方式如果儲存大量的使用者id,就會比較麻煩!我們的目的是為了技術,而不是儲存使用者id;0.81%錯誤率!統計UV任務,可以忽略不計的!

127.0.0.1:6379> PFadd mykey a b c d e f g h i j #建立第一組元素 mykey

(integer) 1

127.0.0.1:6379> PFCOUNT mykey #統計mykey元素的基數數量

(integer) 10

127.0.0.1:6379> PFadd mykey2 i j z x c v b n m #建立第二組元素 mykey2

(integer) 1

127.0.0.1:6379> PFCOUNT mykey2

(integer) 9

127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 #合并兩組 mykey mykey2 => mykey3 并集

OK

127.0.0.1:6379> PFCOUNT mykey3 #看并集的數量!

(integer) 15

如果允許容錯,那麼一定可以使用Hyperloglog!

如果不允許容錯,就使用set或者自己的資料類型即可!

Bitmaps

位存儲

統計使用者資訊,活躍,不活躍!登入,未登入!打卡,365打卡!兩個狀态的,都可以使用Bitmaps!

Bitmaps位圖,資料結構!都是操作二進制位來進行記錄,就隻有0和1兩個狀态!

365天=365bit 1位元組=8bit 46個位元組左右!

  1. 常用操作:模拟一周打卡的情況

127.0.0.1:6379> setbit sign 0 1

(integer) 0

127.0.0.1:6379> setbit sign 1 0

(integer) 0

127.0.0.1:6379> setbit sign 2 0

(integer) 0

127.0.0.1:6379> setbit sign 3 1

(integer) 0

127.0.0.1:6379> setbit sign 4 1

(integer) 0

127.0.0.1:6379> setbit sign 5 0

(integer) 0

127.0.0.1:6379> setbit sign 6 0

(integer) 0

127.0.0.1:6379> getbit sign 3

(integer) 1

127.0.0.1:6379> bitcount sign #統計這周的打卡記錄,就可以看到是否有全勤!

(integer) 3

繼續閱讀