Redis存储用户策略的位置

时间:2013-11-15 11:34:13

标签: redis

我想在redis数据库中存储用户位置(long,lat)。在我最初的想法中,密钥将是用户ID。我需要2个功能:设置位置获取所有位置。我应该如何执行它,或者我应该将它存储在哪种结构中以便于快速访问。

1 个答案:

答案 0 :(得分:1)

看起来SETS是个好主意(如果需要位置唯一性):

  • UserId为关键。
  • 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最好选择:

  • 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,最好选择:

  • 所有用户的一个密钥,例如locations
  • HSET其中field是您的userId,value是序列化数据

PHP示例

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