附件商户,用户签到,uv统计功能(geo,bitmap,hyperloglog结构的使用)

目录

  • 附近商户
    • 一:Geo数据结构
    • 二:附近商户搜索
  • 用户签到
    • 一:BitMap功能演示
    • 二:实现签到功能
    • 三:统计签到功能
  • uv统计
    • 一:hyperloglog的用法
    • 二:测试百万数据的t'ji
    • 二:测试百万数据的t'ji

附近商户

一:Geo数据结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:附近商户搜索

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写一个测试方法,将店铺的信息:经纬度传入geo中,且按照typeid分组查询,因为我们查询距离都是在一个模块中查看的,所以需要根据类型分组;member就是店铺的id;

@Testvoid loadShopData() {//获取店铺的所有信息List<Shop> list = shopService.list();//使用stream流对list进行分组,按照typeidMap<Long, List<Shop>> collect = list.stream().collect(Collectors.groupingBy(Shop::getTypeId));//遍历map,获取每个类型的id和每个类型的所有商家,每一次查询都是一个typeidfor (Map.Entry<Long, List<Shop>> longListEntry : collect.entrySet()) {Long typeId = longListEntry.getKey();String key =RedisConstants.SHOP_GEO_KEY + typeId;List<Shop> value = longListEntry.getValue();//创建一个GeoLocation的集合原来存储geo相关信息List<RedisGeoCommands.GeoLocation<String>> locations=new ArrayList<>(value.size());for (Shop shop : value) {
//                stringRedisTemplate.opsForGeo().add(key,new Point(shop.getX(),shop.getY())
//                ,shop.getId().toString());//写入信息:x,y,memberlocations.add( new RedisGeoCommands.GeoLocation<String>(shop.getId().toString(),new Point(shop.getX(),shop.getY())));}//将每个类型的店铺geo信息批量插入redisstringRedisTemplate.opsForGeo().add(key,  locations);}

然后就要将商品连带着距离返回给前端,并且返回的数据是以距离进行排序:

@Override
@Transactional
public Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {//判断有没有传入x,和y,没有就直接去数据库查询if (x == null || y == null) {Page<Shop> shopPage = query().eq("type_id", typeId).page(new Page<Shop>(current, SystemConstants.DEFAULT_PAGE_SIZE));return Result.ok(shopPage.getRecords());}String key = RedisConstants.SHOP_GEO_KEY + typeId;//设置redis-geo中分页查询的参数Integer from = (current - 1) * SystemConstants.DEFAULT_PAGE_SIZE;//开始的索引Integer end = current * SystemConstants.DEFAULT_PAGE_SIZE;//结束的索引//从redis中的geo中搜索附近的店铺id并且按照距离排序GeoResults<RedisGeoCommands.GeoLocation<String>> search = stringRedisTemplate.opsForGeo().search(key,GeoReference.fromCoordinate(x, y),new Distance(5000),RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));if (search == null) {return Result.ok(Collections.emptyList());}//获取geo中的内容,每个内容都包含value的值,和距离List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();List<Long> ids = new ArrayList<>(content.size());Map<String, Distance> map = new HashMap<>(content.size());//遍历每一条内容,并且将获取到的value(店铺id)和距离存储起来,店铺id用list存储,距离因为是和店铺在一起的,所以选择用map来存储,能够保留对应关系//因为是分页查询,前面获取的是从0到end的所以内容,我们这里要从from开始而不是0开始,所以使用stream流的skip,直接跳过0-from,从from开始content.stream().skip(from).forEach(geoResult -> {//将店铺id存入集合,将距离存入mapString name = geoResult.getContent().getName();ids.add(Long.valueOf(name));map.put(name, geoResult.getDistance());});//判断集合是否为空,因为刚才我们从跳过了前面的从from开始,所以获取到的id集合可能为空,所以要判断一下,否则在sql的in中会报错if (ids==null||ids.isEmpty()){return Result.ok();}//一样的将集合转成字符串,用‘,’隔开String join = StrUtil.join(",", ids);//从数据库中查询id集合中的对应的店铺,并且顺序要和ids的顺序一致List<Shop> shops = query().in("id", ids).last("order by field(id," + join + ")").list();//遍历每一个shop,为他们的distance属性赋值for (Shop shop : shops) {String id = shop.getId().toString();Distance distance = map.get(id);shop.setDistance(distance.getValue());}return Result.ok(shops);
}

用户签到

一:BitMap功能演示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用法:setbit:向指定位置存入一个0或1,getbit,从指定位置取出值0/1;bitcount,统计bitmap中值为1的个数;

bitops,查询数组中第一个是0或者1的位置;

二:实现签到功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现签到功能我们就使用bitmap,因为签到对我们来说就是签上和没签上,签上就是1,没签上就是0,我们可以以一个月为一个key,然后以bitmap来存储就行,在java中使用bitmap是和字符串一起的:

@Override
public Result sign() {Long id = UserHolder.getUser().getId();LocalDate now = LocalDate.now();String format = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));String key=RedisConstants.USER_SIGN_KEY+id+format;//true代表我们设置的值是1;stringRedisTemplate.opsForValue().setBit(key,now.getDayOfMonth()-1,true);return Result.ok();
}

三:统计签到功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

统计签到就是从今天开始向前,有多少个连续的1;

首先我们要得到到今天为止这个月所有签到的数据,可以使用bitfield获取

如果从后向前遍历每个bit位:可以先与1做与运算,然后再向右移一位;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Override
public Result signCount() {Long userId = UserHolder.getUser().getId();LocalDate now = LocalDate.now();String format = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));String key=RedisConstants.USER_SIGN_KEY+userId+format;int dayOfMonth = now.getDayOfMonth();//bitfield key get u14 0表示获取从0开始14个字节,放到这就是从0开始到当前日的所有签到数据List<Long> longs = stringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));//健壮性判断if (longs==null||longs.isEmpty()){return Result.ok();}//我们虽然得到的是一个集合,但是我们的值只有一个直接获取就行Long res = longs.get(0);if (res==0||res==null){return Result.ok();}//计数器Integer count=0;//循环统计while (true){//与1做与运算,得到当前最后一位是0还是1long i =  (res&1);//是1就计数器加1if (i==1){count++;}else {//不是1直接结束循环break;}//最后要将数字向右移一位,不然会死循环res>>>=1;}return Result.ok(count);
}

uv统计

一:hyperloglog的用法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

uv:用户量统计

pv:点击量统计

hhl在redis中如何使用:

pfadd:将要统计的值添加进去,比如用户id

pfcount:统计

pfmerge:合并统计量

二:测试百万数据的t’ji

存中…(img-80mHMYws-1730682836468)]

[外链图片转存中…(img-Jn0VjHSl-1730682836468)]

uv:用户量统计

pv:点击量统计

hhl在redis中如何使用:

pfadd:将要统计的值添加进去,比如用户id

pfcount:统计

pfmerge:合并统计量

二:测试百万数据的t’ji

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9732.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus

0x00 缘起 LuatOS以及Lua能够提供微秒或者毫秒的时间戳获取工具&#xff0c;但并没有提供获取纳秒的工具。通过编辑LuatOS源码以及相关BSP源码&#xff0c;添加能够获取纳秒的timeplus库并重新编译&#xff0c;以解决在64位Windows操作系统中LuatOS模拟器获取纳秒的问题&#…

[Python学习日记-64] 组合

[Python学习日记-64] 组合 简介 继承与组合 组合的使用 简介 继承其实就是生活当中的归类&#xff0c;就是把对象之间的共同特征再一次提炼&#xff0c;然后形成一个类&#xff0c;但是在实际的开发当中不单单只有归类这一个动作&#xff0c;对象与对象之间都会有一些关系&a…

关于stm32中IO映射的一些问题

在STM32固件库&#xff08;比如HAL或LL库&#xff09;中&#xff0c;GPIO的寄存器映射已经定义好了&#xff0c;开发者可以通过标准的读写操作访问GPIO引脚的状态。 一、我们可以直接通过位移操作来修改特定值。 二、下面我们提供另一种方法&#xff0c;位带操作 首先要定义一…

Python游戏开发之《人机大战象棋》-附完整源码-python教程

今天给大家带来的是人机大战的象棋 中国象棋 首先绘制一下棋盘&#xff0c;看看样子&#xff1a; 黑白经典款 绘制棋盘&#xff1a; class Board(QLabel):棋盘坐标与屏幕坐标类似&#xff0c;左上角为 (0, 0)&#xff0c;右下角为 (8, 9)BOARD str(dirpath / u"images…

AutoCAD2014

链接: https://pan.baidu.com/s/1Q4fhVmiSYDZ2DbPNi7m4cA 提取码: f3bm

免费送源码:Java+ssm+MySQL 在线购票影城 计算机毕业设计原创定制

摘要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设在线购票影城。 本设计…

MYSQL——事务管理

什么是事务 在数据库使用者角度&#xff0c;事务就是完成一个事件。例如一个员工信息数据库&#xff0c;要完成员工离职的事件&#xff0c;可能需要很多操作&#xff0c;比如删除员工基本信息以及员工在公司的表现&#xff0c;薪资水平等。而这一系列的操作就是为了完成员工离…

书生实战营第四期-基础岛第四关-InternLM + LlamaIndex RAG 实践

一、任务要求1 基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前 浦语 API 不会回答&#xff0c;借助 LlamaIndex 后 浦语 API 具备回答 A 的能力&#xff0c;截图保存。 1、配置开发机系统 镜像&#xff1a;使用 Cuda12.0-conda 镜…

LC:二分查找——杂记

文章目录 268. 丢失的数字162. 寻找峰值 268. 丢失的数字 LC将此题归类为二分查找&#xff0c;并且为简单题&#xff0c;下面记一下自己对这道题目的思考。 题目链接&#xff1a;268.丢失的数字 第一次看到这个题目&#xff0c;虽然标注的为简单&#xff0c;但肯定不能直接排…

推荐一款国产数据库管理工具Chat2DB

什么是 Chat2DB ? Chat2DB 是一款专为现代数据驱动型企业打造的数据库管理、数据开发及数据分析工具。作为一款AI原生的产品&#xff0c;Chat2DB 将人工智能技术与传统数据库管理功能深度融合&#xff0c;旨在提供更为智能、便捷的工作体验&#xff0c;助力用户高效地管理数据…

前端三件套(HTML + CSS + JS)

前言&#xff1a; 前端三件套&#xff0c;会用就行 毕竟在后面学习JavaWeb&#xff0c;以及在学习vue的时候也有帮助 前端三件套&#xff1a; HTML 定义网页的结构和内容。CSS 负责网页的样式和布局。JavaScript 添加动态交互和功能。 使用到的工具是Visual Studio Code 即…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能&#xff0c;我使用了flutter_reactive_ble这个库&#xff0c;但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

网络编程示例之网络基础知识

TCP/IP 中有两个具有代表性的传输层协议&#xff0c;分别是 TCP 和 UDP&#xff1a; TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构&#xff0c;当应用程序采用 TCP 发送消息时&#xff0c;虽然可以保证发送的顺序&#xff0c;但还是犹如没有任何间隔的数据流发送…

十七:Spring Boot 依赖(2)-- spring-boot-starter-data-jpa 依赖详解

目录 1. 理解 JPA&#xff08;Java Persistence API&#xff09; 1.1 什么是 JPA&#xff1f; 1.2 JPA 与 Hibernate 的关系 1.3 JPA 的基本注解&#xff1a;Entity, Table, Id, GeneratedValue 1.4 JPA 与数据库表的映射 2. Spring Data JPA 概述 2.1 什么是 Spring Dat…

商品,订单业务流程梳理一

业务架构梳理 业务系统介绍 业务商品流程 业务订单流程 业务售后流程 系统架构 技术栈

HDR视频技术之二:光电转换与 HDR 图像显示

将自然界中的真实场景转换为屏幕上显示出来的图像&#xff0c;往往需要经过两个主要的步骤&#xff1a;第一个是通过摄影设备&#xff0c;将外界的光信息转换为图像信息存储起来&#xff0c;本质上是存储为数字信号&#xff1b;第二个是通过显示设备&#xff0c;将图像信息转换…

Linux完结

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 【linux基础之病毒编写&#xff08;完结&#xff09;】 https://www.bilibili.com/video…

苹果iOS 18.4将允许欧盟地区的iPhone用户设置默认地图和翻译应用

在一份最新文件中&#xff0c;苹果概述了其为遵守欧盟数字市场法案所采取的措施&#xff0c;并透露将允许欧盟的 iPhone 和 iPad 用户从"2025 年春季"开始设置默认导航和翻译应用程序。 这一时间表表明&#xff0c;这些选项将在 iOS 18.4 和 iPadOS 18.4 中添加&…

鸿蒙进阶篇-type、typeof、类

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

鸿蒙进阶篇-剩余和展开、简单和复杂类型

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…