Redission之GeoHash

本文介绍了在项目中利用Redis的GeoHash进行距离计算和附近位置功能,由于网上关于Redission与GeoHash结合的工具类稀缺,作者自行编写了两层封装:RedissonTemplate和RedisService,并提供了一些测试。注意,GeoHash在Redis中通过sorted set存储,删除操作可借助sorted set的方法完成。
摘要由CSDN通过智能技术生成
由于最近项目中需要用到距离计算, 附近位置等功能, 就想到redis了的GeoHash, 关于GeoHash的概念就不过多介绍, 用法也比较简单, 但由于项目中使用的是Redission, 网上有关Redission 使用GeoHash的工具类也非常之少, 无奈只能自己动手写了。

话不多说,直接上工具类, 做了两层封装。

一.RedissonTemplate

/**
 * 操作对象
 */
public class RedissonTemplate {
   
    @Resource
    private RedissonClient redissonClient;
   
    private static RedissonTemplate redissonTemplate;

    public static RedissonTemplate getInstance() {
   
        if (redissonTemplate == null) {
   
            redissonTemplate = SpringUtils.getBean(RedissonTemplate.class);
        }
        return redissonTemplate;
    }

	 /**
     * sortedSet删除元素
     *
     * @param name
     * @param o
     * @return
     */
    public boolean zrem(String name, Object o) {
   
        RScoredSortedSet<Object> scoredSortedSet = redissonClient.getScoredSortedSet(name);
        return scoredSortedSet.remove(o);
    }

    /**
     * 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
     *
     * @param name   集合名称
     * @param lng    经度
     * @param lat    纬度
     * @param member 成员名称
     * @return 添加元素个数
     */
    public Long geoAdd(String name, double lng, double lat, Object member) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.add(lng, lat, member);
    }

    /**
     * 返回两个给定位置之间的距离
     *
     * @param name         集合名称
     * @param firstMember  第一个成员
     * @param secondMember 第二个成员
     * @param geoUnit      返回距离单位
     * @return
     */
    public Double geoDist(String name, Object firstMember, Object secondMember, GeoUnit geoUnit) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.dist(firstMember, secondMember, geoUnit);
    }

    /**
     * 从key里返回所有给定位置元素的位置(经度和纬度)
     *
     * @param name    集合名称
     * @param members 成员
     * @return
     */
    public Map<Object, GeoPosition> geoPos(String name, Object... members) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.pos(members);
    }

    /**
     * 返回一个或多个位置元素的 Geohash 表示
     *
     * @param name    集合名称
     * @param members 成员
     * @return
     */
    public Map<Object, String> geoHash(String name, Object... members) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.hash(members);
    }

    /**
     * 以给定的经纬度为中心, 找出某一半径内的元素
     *
     * @param name    集合名称
     * @param lng     经度
     * @param lat     纬度
     * @param radius  半径
     * @param geoUnit 单位
     * @return
     */
    public List<Object> geoRadius(String name, double lng, double lat, double radius, GeoUnit geoUnit) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(lng, lat, radius, geoUnit);
    }

    /**
     * 以给定的经纬度为中心, 找出某一半径内的元素
     *
     * @param name    集合名称
     * @param lng     经度
     * @param lat     纬度
     * @param radius  半径
     * @param geoUnit 单位
     * @param count   返回元素个数
     * @return
     */
    public List<Object> geoRadius(String name, double lng, double lat, double radius, GeoUnit geoUnit, int count) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(lng, lat, radius, geoUnit, count);
    }

    /**
     * 以给定的经纬度为中心, 找出某一半径内的元素
     *
     * @param name     集合名称
     * @param lng      经度
     * @param lat      纬度
     * @param radius   半径
     * @param geoUnit  单位
     * @param geoOrder 排序规则
     * @return
     */
    public List<Object> geoRadius(String name, double lng, double lat, double radius, GeoUnit geoUnit, GeoOrder geoOrder) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(lng, lat, radius, geoUnit, geoOrder);
    }

    /**
     * 以给定的经纬度为中心, 找出某一半径内的元素
     *
     * @param name    集合名称
     * @param member  成员
     * @param radius  半径
     * @param geoUnit 单位
     * @return
     */
    public List<Object> geoRadiusByMember(String name, Object member, double radius, GeoUnit geoUnit) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(member, radius, geoUnit);
    }

    /**
     * 以给定的成员为中心, 找出某一半径内的元素
     *
     * @param name    集合名称
     * @param member  成员
     * @param radius  半径
     * @param geoUnit 单位
     * @param count   返回元素个数
     * @return
     */
    public List<Object> geoRadiusByMember(String name, Object member, double radius, GeoUnit geoUnit, int count) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(member, radius, geoUnit, count);
    }

    /**
     * 以给定的成员为中心, 找出某一半径内的元素
     *
     * @param name     集合名称
     * @param member   成员
     * @param radius   半径
     * @param geoUnit  单位
     * @param geoOrder 排序规则
     * @return
     */
    public List<Object> geoRadiusByMember(String name, Object member, double radius, GeoUnit geoUnit, GeoOrder geoOrder) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(member, radius, geoUnit, geoOrder);
    }

    /**
     * 以给定的成员为中心, 找出某一半径内的元素
     *
     * @param name     集合名称
     * @param member   成员
     * @param radius   半径
     * @param geoUnit  单位
     * @param geoOrder 排序规则
     * @param count    返回元素个数
     * @return
     */
    public List<Object> geoRadiusByMember(String name, Object member, double radius, GeoUnit geoUnit, GeoOrder geoOrder, int count) {
   
        RGeo<Object> geo = redissonClient.getGeo(name);
        return geo.radius(member, radius, geoUnit, geoOrder, count);
    }

    /**
     * 以给定的经纬度为中心, 找出某一半径内的元素, 并返回距离
     *
     * @param name    集合名称
Redisson是一个基于Redis的Java驻留内存数据网格(In-Memory Data Grid)和分布式锁,它提供了一致性哈希算法来实现数据的分片和负载均衡。 使用Redisson的一致性哈希算法,可以将数据分散存储在多个Redis节点上,以实现数据的分布式存储和访问。一致性哈希算法通过将数据的键映射到一个哈希环上的位置来确定数据应该存储在哪个节点上。当需要访问数据时,Redisson会根据键的哈希值找到对应的节点,并从该节点上获取数据。 下面是使用Redisson的一致性哈希算法进行数据存储和访问的示例: ```java // 创建Redisson客户端 Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonClient redisson = Redisson.create(config); // 获取一致性哈希对象 RMap<String, String> map = redisson.getMap("myMap"); // 存储数据 map.put("key1", "value1"); map.put("key2", "value2");map.put("key3", "value3"); // 访问数据 String value1 = map.get("key1"); String value2 = map.get("key2"); String value3 = map.get("key3"); // 关闭Redisson客户端 redisson.shutdown(); ``` 在上述示例中,我们首先创建了一个Redisson客户端,并通过该客户端获取了一个分布式Map对象。然后,我们使用一致性哈希算法将数据存储在多个Redis节点上,并通过键来访问数据。 使用Redisson的一致性哈希算法,可以实现数据的分布式存储和访问,提高系统的性能和可扩展性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值