使用Redis來實現LBS的應用

2022-05-07 08:51:09 字數 2412 閱讀 7953

1、僅需每分鐘將使用者的經緯度,上報到資料庫;

2、然後每次使用者查詢附近好友時,通過 like 'wm3yr3%',即可獲取

缺點:稍有一定資料量,對資料庫的鴨梨可想而知

假象把中國分成,若干個一平方公里的單元格

1)、使用者位置的變更,理解為乙個單元格移動到另外乙個單元格(或者不移動)

2)、使用者查詢附近,理解為查詢,自己所在方塊的的所有人

1)、使用者基本資訊 緯度、經度、geohash值(經緯度,僅用於後期距離計算)

2)、單元格 集合(使用者1,使用者2,…)

1)、redis string(key->value) 結構,儲存使用者基本資訊

2)、redis set(集合) 結構,以geohash值,前6位作為key(約表示一平方千公尺),儲存單元格的使用者群

1)、更新使用者資訊,先刪除使用者原所在集合,再更新當前使用者資訊,最後更新當前使用者所在集合

2)、查詢附近,直接查詢,所在單元格集合所有使用者id

<?php

/*** lbs核心類

* @author name * @site

*/include_once('geohash.class.php');

class lbs

/*** 更新使用者資訊

* @param mixed $latitude 緯度

* @param mixed $longitude 經度

*/public function upinfo($user_id,$latitude,$longitude)

//新資料處理

//緯度

$this->redis->hset($user_id,'la',$latitude);

//經度

$this->redis->hset($user_id,'lo',$longitude);

//geohash

$hashdata = $this->geohash->encode($latitude,$longitude);

$this->redis->hset($user_id,'geo',$hashdata);

//索引

$index_key = substr($hashdata, 0, $this->index_len);

//存入

$this->redis->sadd($index_key,$user_id);

return true;

}/**

* 獲取附近使用者

* @param mixed $latitude 緯度

* @param mixed $longitude 經度

*/public function serach($latitude,$longitude)

}?>

<?php

/*** 模擬資料上報

* @author name * @site

*/include_once('lbs.class.php');

$b_time = microtime(true);

$n = 0;

while(1) }

function mylog($content)

?>

<?php

/*** 模擬附近查詢

* @author name * @site

*/include_once('lbs.class.php');

$b_time = microtime(true);

$n = 0;

while(1) }

function mylog($content)

?>

vmware虛擬機器,記憶體256m,主頻2.93ghz

模擬了100w活躍使用者行為,不斷更新,不斷查詢附近好友

//60 seconds insert

88544

//60 seconds search

117660

//成都 100w人,資料占用記憶體

1、geohash,可寫成php c擴充套件;或者其他geohash實現方式

2、redis,記憶體消耗較大,可考慮redis集群方案

3、本文僅查出本單元格使用者,提高精度,可查出周圍八個單元個,求交集

1)假設我現在設定的hash長度為7 ,那乙個個hash值對應乙個塊,如何得到這個塊的座標區間呢?

例如,成都永豐立交的geohash值為:wm3yr31d2524;如取7位,則為,wm3yr31;

根據geohash的演算法,那麼區間就會是 wm3yr3100000 ~ wm3yr31zzzzz;

根據如上兩值,通過「geohash->經緯度」算出經緯度,可大致確定區間。

2)如果使用者上報的位置資訊有時效性(比如:15秒內有效)如何處理?

可以在redis儲存的時候,設定有效時間

使用Redis來實現LBS的應用

目標 查詢附近的某某某,由近到遠返回結果,且結果中有與目標點的距離。針對查詢附近的某某某,提出兩個方案,如下 方案a 本方案前,請先閱讀 基於lbs功能應用的geohash方案,看過該文章便可簡單知道 1 僅需每分鐘將使用者的經緯度,上報到資料庫 2 然後每次使用者查詢附近好友時,通過 like w...

使用thin neverblock來部署應用

neverblock出了之後就想試一試,但是跟mongrel配合有點問題,所以還是選擇thin,感覺不錯。url 下完後解壓,打包成gem,然後安裝。thin可以用gem直接安裝 sudo gem install thin thin來啟動rails非常簡單,切換到應用程式目錄,直接用 thin st...

使用 Redis 來實現定時任務

在 redis 的2.8.0版本之後,其推出了乙個新的特性 鍵空間訊息 redis keyspace notifications 它配合 2.0.0 版本之後的 subscribe 就能完成這個定時任務的操作了,不過定時的單位是秒。redis 在 2.0.0 之後推出了 pub sub 的指令,大致...