5 redis的GEO操作

一、GEO

Redis 3.2版本 提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置 、摇一摇 这类依赖于地理位置信息的功能。

有效纬度从-85.05112878度到85.05112878度

注意:当坐标位置超出上述指定范围时,将会返回一个错误。

二、实现方式

  1. 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
    geoadd命令
java 复制代码
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
  1. geodist命令
    如果两个位置之间的其中一个不存在, 那么命令返回空值。
java 复制代码
指定单位的参数 unit 必须是以下单位的其中一个:
	m 表示单位为米。
	km 表示单位为千米。
	mi 表示单位为英里。
	ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 geodist默认使用米 作为单位。
注意 :GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

返回值:

计算出的距离会以双精度浮点数的形式被返回。 如果给定的位置元素不存在, 那么命令返回空值。

java 复制代码
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania	//默认米
"166274.15156960039"
redis> GEODIST Sicily Palermo Catania km	//指定了单位
"166.27415156960038"
redis> GEODIST Sicily Palermo Catania mi    //英里
"103.31822459492736"
redis> GEODIST Sicily Foo Bar
(nil)
  1. 代码实现
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.*;
import redis.clients.jedis.params.GeoRadiusParam;

import java.util.List;
import java.util.Map;

@Component
public class RedisGEO {

    //表示是存储geo的key
    public final static String RS_GEO_NS = "rg:";

    @Autowired
    private JedisPool jedisPool;

    /**
     *
     * @param key
     * @param longitude 经度
     * @param latitude 纬度
     * @param member 成员名
     * @return
     */
    public Long addLocation(String key, double longitude, double latitude, String member) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.geoadd(RS_GEO_NS+key,longitude,latitude,member);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    /**
     *
     * @param key
     * @param memberCoordinateMap 成员为key,经纬度为value的map
     * @return
     */
    public Long addLocations(String key, Map<String, GeoCoordinate> memberCoordinateMap) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.geoadd(RS_GEO_NS+key,memberCoordinateMap);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }

    public List<GeoRadiusResponse> nearbyMore(String key, String member, double radius,
                                              boolean withDist, boolean isASC) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            GeoRadiusParam geoRadiusParam = new GeoRadiusParam();
            if (withDist) geoRadiusParam.withDist();
            if(isASC) geoRadiusParam.sortAscending();
            else geoRadiusParam.sortDescending();
            return jedis.georadiusByMember(RS_GEO_NS+key, member, radius, GeoUnit.KM,geoRadiusParam);
        } catch (Exception e) {
            return null;
        } finally {
            jedis.close();
        }
    }
}

不是重点,其他的geo功能不做赘述。

相关推荐
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
IT大白鼠3 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql
白远山3 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析