主题
面试速答(先看这里)
**一句话结论:**实现"查找附近的人"功能,可以利用Redis的Geospatial数据类型,结合用户经纬度信息进行存储和查询。
60秒标准回答:
实现"查找附近的人"功能,可以利用Redis的Geospatial数据类型,结合用户经纬度信息进行存储和查询
使用Redis的GEOADD命令将用户经纬度信息存储在一个指定的键值中,然后再使用Redis的GEORADIUS命令可以查询指定经纬度附近一定范围内的用户信息就能简单实现这个功能了
以上就是查询中国台湾附近1000km的人的两行命令
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**使用Redis的GEOADD命令将用户经纬度信息存储在一个指定的键值中,然后再使用Redis的GEORADIUS命令可以查询指定经纬度附近一定范围内的用户信息就能简单实现这个功能了。
- **要点2:**以上就是查询中国台湾附近1000km的人的两行命令。
**记忆锚点:**Redis → Geospatial → GEORADIUS → GEOADD → 数据类
追问准备:
- 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Geospatial」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「GEORADIUS」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
实现"查找附近的人"功能,可以利用Redis的Geospatial数据类型,结合用户经纬度信息进行存储和查询。
使用Redis的GEOADD命令将用户经纬度信息存储在一个指定的键值中,然后再使用Redis的GEORADIUS命令可以查询指定经纬度附近一定范围内的用户信息就能简单实现这个功能了。
plain
GEOADD user_location 121.57465 25.04100 user1
GEORADIUS user_location 121.57465 25.04100 1000 km以上就是查询中国台湾附近1000km的人的两行命令。
代码实现:
plain
import redis.clients.jedis.GeoRadiusResponse;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.stream.Collectors;
public class RedisGeoDemo {
private static final String USER_LOCATION_KEY = "user_location";
// 存储用户经纬度信息
public static void saveUserLocation(String userId, double longitude, double latitude, Jedis jedis) {
jedis.geoadd(USER_LOCATION_KEY, longitude, latitude, userId);
}
// 查询附近的人
public static List<String> getNearbyUsers(double longitude, double latitude, double radius, Jedis jedis) {
List<GeoRadiusResponse> responses = jedis.georadius(USER_LOCATION_KEY, longitude, latitude, radius, "km");
return responses.stream().map(GeoRadiusResponse::getMemberByString).collect(Collectors.toList());
}
}