查询某位置方圆1千米范围店铺、红包等 -------基于redis的解决方法

前言
跟朋友聊天碰到一个问题,计算1000米范围内的红包信息(基于位置的查询同理)。数据量小的时候通过mysql遍历所有数据计算,完全不成问题。当数据量增加到百万千万级,全量计算系统会直接崩溃。有博客写过确定经纬度的边界的算法,详情https://blog.csdn.net/Baple/article/details/53004541。这里借鉴此方法,并使用redis提升性能。

处理流程
1、 红包数据的录入(按经纬度分别存入redis的两个sortset),userid 或者红包id 作为member,经度或者纬度作为score。
2、 查询的中心位置传入服务器,按算法计算出正方形边界(注:国内大致位置信息,不存在跨东西经度,南北纬度的问题。如果应用到有跨度需要做相关处理。
最东端 东经135度2分30秒 黑龙江和乌苏里江交汇处
最西端 东经73度40分 帕米尔高原乌兹别里山口(乌恰县)
最南端 北纬3度52分 南沙群岛曾母暗沙
最北端 北纬53度33分 漠河以北黑龙江主航道(漠河)

3、通过经纬度的边界值 查询包含的member,然后两集合做交集,获取到正方形内的所有红包数据信息。这样目标数据就排除了大部分数据。运算量可以缩小几个数量级。
4、通过多线程遍历计算再剔除掉正方形内距离中心大于1000米的数据。获取到的就是所需数据信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值