1. 程式人生 > 實用技巧 >Redis_三種特殊資料型別

Redis_三種特殊資料型別

三種特殊資料型別

目錄

1. geospatial

1. 概述

朋友的定位, 附近的人, 打車距離實現

Redis 的 Geo 在 Redis 3.2 版本就推出了! 這個功能可以推算地理位置的資訊: 兩地之間的距離, 方圓幾裡的人

所有的geospatial命令都是geo開頭的

2. 相關命令

1. geoadd

新增地理位置

127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3

規則

  • 地球的兩極無法直接新增, 我們一般會下載城市資料, 通過java程式一次性匯入!
  • 引數 key 經度(longitude) 緯度(latitude) 名稱

2. geopos

獲取指定的成員的經度和緯度

127.0.0.1:6379> geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
   2) "37.86000073876942196"
2) 1) "118.75999957323074341"
   2) "32.03999960287850968"

獲得當前定位, 一定是一個座標值!

3. geodist

如果不存在, 返回空

單位如下

  • m
  • km
  • mi 英里
  • ft 英尺
127.0.0.1:6379> geodist china:city taiyuan shenyang m
"1026439.1070"
127.0.0.1:6379> geodist china:city taiyuan shenyang km
"1026.4391"

4. georadius

附近的人 ==> 獲得所有附近的人的地址, 定位, 通過半徑來查詢

獲得指定數量的人

127.0.0.1:6379> georadius china:city 110 30 1000 km			以 100,30 這個座標為中心, 尋找半徑為1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
2) 1) "manjing"
   2) "864.9816"
   3) 1) "118.75999957323074341"
      2) "32.03999960287850968"

引數 key 經度 緯度 半徑 單位 [顯示結果的經度和緯度] [顯示結果的距離] [顯示的結果的數量]

5. georadiusbymember

顯示與指定成員一定半徑範圍內的其他成員

127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
   2) "0.0000"
   3) 1) "112.54999905824661255"
      2) "37.86000073876942196"
2) 1) "xian"
   2) "514.2264"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"

引數與 georadius 一樣

6. geohash(較少使用)

該命令返回11個字元的hash字串

127.0.0.1:6379> geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"

將二維的經緯度轉換為一維的字串, 如果兩個字串越接近, 則距離越近

3. 底層

geo底層的實現原理實際上就是Zset, 我們可以通過Zset命令來操作geo

127.0.0.1:6379> type china:city
zset

檢視全部元素 刪除指定的元素

127.0.0.1:6379> zrange china:city 0 -1 withscores
 1) "xian"
 2) "4040115445396757"
 3) "hangzhou"
 4) "4054133997236782"
 5) "manjing"
 6) "4066006694128997"
 7) "taiyuan"
 8) "4068216047500484"
 9) "shenyang"
10) "4072519231994779"
11) "shengzhen"
12) "4154606886655324"
127.0.0.1:6379> zrem china:city manjing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"

2. hyperloglog

基數 ---- 不重複的元素, 可以接受誤差

1. 簡介

  • Redis 2.8.9 版本就更新了 Hyperloglog 資料結構!

  • Hyperloglog是基數統計的演算法

  • 用於統計網頁的 UV (一個人訪問一個網站多冊, 但是還是算作一個人)

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

    • 這種方式如果儲存大量的使用者 id, 就會比較麻煩
    • 我們的目的是為了計數, 而不是儲存使用者 id
  • 優點

    • 佔用的記憶體是固定的 (存放 2^64 不同元素的基數, 只需要使用 12KB 的記憶體)
    • 有 0.81% 的錯誤率, 對於統計 UV , 可以忽略不計
  • 命令都是pf開頭的

  • 如果允許容差, 可以使用Hyperloglog統計數量

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

2.測試使用

127.0.0.1:6379> pfadd mykey a b c d e f g h i j
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
  • pfadd 建立一組元素
  • pfcount 統計元素中的基數數量
  • pfmerge 合併兩組 引數為 pfmerge 並集 來源... 會去掉相同的元素

3. bitmaps

1. 簡介

位儲存, one hot編碼

統計使用者資訊, 活躍, 不活躍! 登入, 未登入! 打卡, 365打卡!

只有兩個狀態的, 都可以使用bitmaps!

Bitmaps 點陣圖, 資料結構, 都是操作二進位制位來進行記錄, 只有 0 和 1 兩個狀態

例如 : 365 天 = 365 bit 1位元組 = 8 bit ==> 只需要 46 個位元組左右就可以儲存使用者的一年打卡的資訊了!

2. 測試

使用bitmap來記錄週一至週日的打卡

週一: 1 週二: 0 ...

判斷有幾天是 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 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
  • setbit key offset value
    • value只能為0 和 1
    • offset從0開始

檢視某一天是否有打卡 getbit key value

127.0.0.1:6379> getbit sign 5
(integer) 1

同級操作, 統計打卡的天數( 1的個數 ) bitcount key

127.0.0.1:6379> bitcount sign
(integer) 4