Redis实战——实现类附近商铺功能

基于ASP.NET+SQLServer的美妆网站的设计与实现 通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。 阅读详情

目录

前言

附近商户搜索

为了支持 GEOSEARCH 命令,需要更新 Redis 版本

实现代码


前言

首先需要了解 Redis 中 GEO 的使用,和GeoHash算法的基本原理

链接:Redis——GEO


附近商户搜索

将类型相同的商户分为同一组


为了支持 GEOSEARCH 命令,需要更新 Redis 版本


实现代码

加载商铺数据(含坐标)

    @Test
    void loadShopData(){
        //1.查询商户信息
        List<Shop> shops = shopService.list();

        //2.把店铺分组,按照typeId分组
//        Map<Long, List<Shop>> map = new Map<Long, List<Shop>>;
        Map<Long,List<Shop>> map=shops.stream().collect(Collectors.groupingBy(Shop::getTypeId));

        //3.分批完成写入Redis
        for(Map.Entry<Long,List<Shop>> entry:map.entrySet()){
            //3.1获取类型id
            Long typeId=entry.getKey();
            String key="shop:geo:"+typeId;
            //3.2获取同类型的店铺集合
            List<Shop> value=entry.getValue();
            List<RedisGeoCommands.GeoLocation<String>> locations=new ArrayList<>(value.size());

            //3.3写入Redis GEOADD key 经度 纬度 member
            for (Shop shop : value) {
                //此为一个一个添加,可以通过迭代器的方法一次性添加完成
//                stringRedisTemplate.opsForGeo().add(key,new Point(shop.getX(),shop.getY()),shop.getId().toString());
                locations.add(new RedisGeoCommands.GeoLocation<>(
                        shop.getId().toString(),new Point(shop.getX(),shop.getY())));
            }

            stringRedisTemplate.opsForGeo().add(key,locations);
        }
    }

typeId为商铺类型,current为当前页码,x,y为经纬度坐标

    @Override
    public Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {
        //1.判断是否需要根据坐标查询
        if(x==null||y==null){
            //不需要坐标查询,按数据库查询
            Page<Shop> page = query()
                    .eq("type_id", typeId)
                    .page(new Page<>(current, SystemConstants.DEFAULT_PAGE_SIZE));
            return Result.ok(page.getRecords());
        }
        //2.计算分页参数
        int begin = (current-1)*SystemConstants.DEFAULT_PAGE_SIZE;
        int end = current * SystemConstants.DEFAULT_PAGE_SIZE;

        //3.查询redis、按照距离升序、分页 结果:shopId、distance
        String key=SHOP_GEO_KEY+typeId;
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = stringRedisTemplate.opsForGeo()  //GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHINDISTANCE
                .search(key,
                        GeoReference.fromCoordinate(x, y),
                        new Distance(5000), //5000米内
                        RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end)
                );
        //4.解析出id
        if(results==null){
            return Result.ok(Collections.emptyList());
        }
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> list = results.getContent();
        if(list.size()<=begin){
            //没有下一页,结束
            return Result.ok(Collections.emptyList());
        }
        //4.1截取begin——end的部分
        List<Long> ids=new ArrayList<>(list.size());
        Map<String,Distance> distanceMap=new HashMap<>(list.size());

        list.stream().skip(begin).forEach(result->{
            //4.2获取店铺id
            String shopIdStr = result.getContent().getName();
            ids.add(Long.valueOf(shopIdStr));
            //4.3获取距离
            @NonNull
            Distance distance = result.getDistance();
            distanceMap.put(shopIdStr,distance);
        });
        //5.根据id查询Shop
        String idStr=StrUtil.join(",",ids);
        List<Shop> shops = query().in("id", ids).last("ORDER BY FIELD(id," + idStr + ") ").list();

        for (Shop shop : shops) {
            shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());
        }
        //6.返回
        return Result.ok(shops);
    }

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.6 在kernel 中实现系统复位和系统关机驱动 上一章节`Qemu`篇我们已经实现了我们`SOC`的`power reset`和 `power down` 寄存器,本章节我们就在`Linux driver`中去实现它 阅读详情

相关推荐

ubuntu打实时内核补丁教程以及安装后显卡驱动问题解决方法

在ubuntu20.04上安装成功,亲测有效 目录ubuntu打实时内核补丁教程1、下载实时内核2、解压和打补丁(patch)3、安装依赖和编译安装4、修改一些文件,便于之后切换内核5、重启电脑实时内核版本下安装nvidia显卡驱动的问题1、先切换回之前的内核(非实时)版本2、重装之前内核(非实时)版本下的显卡驱动3、切换回实时内核(按照上面的步骤)4、在实时内核下安装显卡驱动 ubuntu打实时内核补丁教程 安装目标系统:ubuntu20.04 电脑配置:i9,2080ti 1、下载实时内核 打开终端,输

weixin_39275295的博客 7996

RedisTemplate.opsForGeo()用法简介并举例

是RedisTemplate类提供的用于操作Geo类型(地理位置)的方法。它可以用于对Redis中的Geo数据结构进行各种操作,如添加地理位置、获取距离、获取位置信息等。请注意,示例中的"mygeo"是Geo键的名称,“Beijing”、"Shanghai"等是地理位置对应的成员名。方法的常见用法,你可以根据具体的业务需求选择适合的方法进行操作。

一起coding,一起嗨。 3456

C# ArcGIS Engine二次开发——实现“加载shp文件”

private void AddShpDataToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog OpFileDialog=new OpenFileDialog();//OpenFileDialog:打开文件对话框 OpFileDialog.Title="添加矢量数据"; OpFileDialog.Filter="(*.shp)|*.shp";//filter:过滤器;"(*.shp)|*.shp"

weixin_42191203的博客 5255

7.Springboot集成Redis

感谢秦疆老师的redis视频教程,更多了解哔哩哔哩搜索【狂神说Java】。 本文内容源于秦疆老师的redis视频教程。给狂神推荐,点赞吧! SpringBoot整合 SpringBoot操作数据:spring-data jpa mongodb redids! SpringData也是和SpringBoot齐名的项目! 说明:在SpringBoot2.x之后,原来使用的jedis被替换成了lettuce jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis poo.

我有满天星辰的博客 890

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1729

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

【代码】redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能。

小哇 1902

基于Python的高考志愿辅助填报系统

在实际应用中,系统需要处理更复杂的数据,包括更多的高校和专业信息、更详细的录取规则、以及用户的历史选择等。系统需要提供用户友好的界面,让考生输入自己的信息和偏好,然后通过后端的模型计算出推荐的志愿列表。此外,系统还应该提供一些个性化的服务,如根据考生的输入动态调整推荐策略、保存用户的填报历史和偏好等。特征可能包括考生的分数、所在省份、文理科类别、专业偏好、高校的地理位置、排名、专业的就业前景等。3. **推荐逻辑**:根据用户的分数和专业偏好,结合历史录取数据,使用简单的算法来推荐可能录取的高校和专业。

coder_wwwdy的博客 1978

Redis GEO 常用 RedisTemplate API(Java)

package com.um.my_demo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.geo.*; import org..

weixin_39274753的博客 4371

特征选择/筛选方法总结

作者:jliang https://blog.csdn.net/jliang3 1.特征选择介绍 1)特征分类 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出; 2)特征选择的目的 对于一个特定的学习算法...

jliang3的博客 8万+

基于 FPGA Vivado 示波器设计(附源工程)

今天给大侠带来基于 FPGA Vivado 示波器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于添加文件和IP的Vivado工程设计流程,掌握基于Tcl的Vivado工程设计流程,学习示波器的基本组成结构。获取本篇相关源工程代码,可在公众号内回复“示波器设计源工程”。 原理介绍 数字存储示波器能够将模拟信号进行采样、存储以及显示。本系统在DIGILENT ...

7389

redis-RedisTemplate.opsForGeo 的geo地理位置相关的方法演示

获取元素经纬度坐标经过geohash算法生成的base32编码值。: 获取集合中任意元素的经纬度坐标,可以一次获取多个。:查询某个坐标或某个成员,附近范围的成员。: 计算两个元素之间的距离。: 添加一个地理位置。

小哇 960

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

本文主要介绍了在使用codex过程中出现Reconnecting和stream disconnected before completion: stream closed before response.completed的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

【 Redis | 实战篇 扩展 】

实现达人探店,好友关注,附件商铺,用户签到,UV统计。

2402_88700528的博客 8140

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

附近商铺-Redis GEO

附近商铺功能

m0_52710583的博客 883

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)

GE0数据结构是Redis提供的用于地理位置信息存储和查询的数据结构,可以实现附近商铺功能。将店铺的位置信息导入到GEO数据结构中,以便实现附近商户功能。通过GEO数据结构,实现查找用户附近的商户的功能。BitMap是Redis提供的用于位操作的数据结构,可以用于记录用户签到情况。实现用户签到功能,记录用户每天的签到情况。统计用户的连续签到天数,可以通过BitMap的位操作实现。HyperLogLog是一种基数估算算法,可以用于统计UV(独立访客)数量。测试HyperLogLog算法在大数据量下的统计性能。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于Redis实现-附近商铺查询

Redis GEO支持地理坐标存储与查询,提供GEOADD添加坐标、GEOSEARCH范围搜索等功能,可快速实现附近地点查询。通过Spring Data Redis可便捷集成,支持按坐标或名称搜索,灵活控制返回结果排序和内容。适用于查找周边商铺、计算距离等场景,是构建位置服务的理想方案。

2302_77423520的博客 1509

【黑马点评日记】RedisGEO实战:黑马点评附近商铺功能

摘要:本文介绍了基于Redis GEO实现黑马点评项目附近商铺功能的技术方案。针对传统MySQL地理查询性能瓶颈,采用Redis GEO数据结构存储商铺ID和坐标,通过GeoHash算法实现高效距离计算与排序。详细解析了数据初始化、分页查询、距离计算等核心实现逻辑,并给出版本兼容、性能优化等解决方案。该方案显著提升了海量数据下的地理查询效率,为类似LBS应用提供了参考实现。

任岁月风干理想再也找不回真的我 1134

【Redis实战篇】附近商铺

本文介绍了Redis GEO数据结构在附近商户搜索功能中的应用。主要内容包括:1) GEO数据结构的常用命令,如GEOADD、GEODIST等;2) 将商户数据按类型分组导入Redis GEO的Java实现;3) 基于GEOSEARCH命令实现附近商户查询功能的技术方案,包括Spring Data Redis版本升级和分页查询处理。通过将商户坐标与类型信息存储在Redis中,系统能够高效地根据用户位置返回附近商户列表,并按距离排序展示

qq_63320529的博客 770

【Redis实战篇】基于Redis的功能实现附近商铺查询(Geo),用户签到与统计(Bitmap),网站UV统计(HyperLogLog)

【Redis实战篇】基于Redis的功能实现附近商铺查询(Geo),用户签到与统计(Bitmap),网站UV统计(HyperLogLog)

MonKingWD的博客 958

Redis实战—附近商铺、用户签到、UV统计

本文详细讨论和分析了“附近商铺、用户签到、UV统计”功能的具体实现思路和实现代码。

向上的咸鱼blueblue的博客 646

Redis实战篇(六)附近商铺、用户签到、UV统计

附近商铺、用户签到、UV统计

qq_38618691的博客 1014

Redis - 附近商铺、用户签到、UV统计

GET type offset 中的type表示读取多少位,几个bit位,其还需要指定返回的结果是有符号的还是无符号的,因为最终的返回结果是以十进制返回。下图中的value就是我们填进去的member,我们存进去的地理左边转换成了下面的一串数字,作为score传进去了。我们搜索的时候有一个限制条件,根据商户的类型做过滤,但是我们并没有把商铺的类型放入到GEO里面,所以过滤不了。我们使用的Springboot版本不是最新的,那对应的SpringDataRedis的版本也不是最新的。

weixin_51351637的博客 1316

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

m0_52380556的博客 1517

附近商铺/用户签到/UV统计

附近商户即基于地理坐标进行搜索。支持这种地理坐标搜索的技术有很多,而Redis就是其中之一。接下来学习如何基于Redis来实现这种地理坐标的搜索功能。本章内容会分成两个小节来学习。第一节:了解一下Redis中Geo数据的结构及其基本用法。第二节:实现业务当中的商户搜索功能。

qq_65501197的博客 1186

Redis实战篇《黑马点评》8 附近商铺

看样子是ShopController中的方法,那我们现在来修改其代码,除了typeId,分页码,我们还需要其坐标。

wyznan的博客 1031
上一篇: Redis——GEO
下一篇: 亿级别大数的排序查找
486过于烦躁
博客等级 码龄6年 17粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值