2013-11-15 77 views
1

我想在redis數據庫中存儲用戶位置(long,lat)。在我最初的想法中,鍵將是用戶ID。我需要2個功能:設置位置,獲取所有位置。我應該如何執行它,或者應該將其存儲到哪個結構中以便於快速訪問。Redis商店位置的用戶策略

回答

1

貌似SETS是一個不錯的主意(如果需要位置的獨特性):

  • 用戶ID作爲密鑰。
  • SADD組位置(需要O(N),其中N是要添加的成員的數量)
  • SMEMBERS獲得的所有位置特徵。
  • 保持long,lat作爲一些分隔符分隔的字符串或序列化的值(例如json)。

PHP樣本

$location = json_encode(array('long' => '...', 'lat' => '...')); 
$redis->sAdd('locations:' . $userId, $location); 
... 
$redis->sAdd('locations:' . $userId, $location2); 
... 
$redis->sAdd('locations:' . $userId, $location2); 
... 
$userLocations = $redis->sMembers('locations:' . $userId); 

你不說這個,但如果不需要的位置獨特LISTS將是最好的choise:

  • RPUSH集位置 (要求O(1))
  • LRANGE獲取所有位置功能。
  • 鍵和值格式,如SETS的情況。

PHP樣本

$location = json_encode(array('long' => '...', 'lat' => '...')); 
$redis->rPush('locations:' . $userId, $location); 
... 
$redis->rPush('locations:' . $userId, $location2); 
... 
$redis->rPush('locations:' . $userId, $location2); 
... 
$userLocations = $redis->lRange('locations:' . $userId, 0, -1); 

如果用戶只有一個位置HASH將是最好的choise:

  • 一個面向所有用戶的關鍵,例如locations
  • HSET其中field是你的userId和值是序列化數據

PHP樣本

$location = json_encode(array('long' => '...', 'lat' => '...')); 
$redis->hSet('locations', $userId, $location); 
... 
$userLocation = json_decode($redis->hGet('locations', $userId)); 
+0

我有很多的用戶每個人都有它自己的ID和長緯度。我可以序列化我的用戶的json對象並將其存儲在redis集中嗎? –

+0

如何將其存儲爲地圖,ID => JSON對象? –

+0

每個用戶只能有一個位置或多個位置? – misterion