基于 Redis GEO 实现条件分页查询用户附近的场馆列表
🎯 本文档详细介绍了如何使用Redis GEO模块实现场馆位置的存储与查询,以支持“附近场馆”搜索功能。首先,通过微信小程序获取用户当前位置,并将该位置信息与场馆的经纬度数据一同存储至Redis中。利用Redis GEO高效的地理空间索引能力,文档展示了如何初始化缓存、批量处理和存储场馆位置信息,以及执行基于距离和多种条件的分页查询。此外,还提供了计算两个地理位置间距离的工具类。此方案适用于开发具备地理定位功能的应用程序,如体育场馆预订系统。
🏠️ HelloDam/场快订(场馆预定 SaaS 平台)
文章目录
- Redis GEO 介绍
- 流程
- 数据库设计
- 实体类
- 位置缓存初始化
- 附近场馆条件查询
Redis GEO 介绍
Redis GEO模块为Redis数据库引入了地理位置处理的功能,使得开发者能够基于地理坐标(经纬度)进行数据的操作和查询。通过使用GEO功能,可以方便地存储带有地理位置信息的数据,并执行如添加地理位置、计算两个位置之间的距离、查找指定半径内所有位置等操作。这些特性非常适合于构建需要处理地理位置的应用程序,比如附近的人或地点搜索功能。Redis GEO背后的技术基于高效的GeoHash算法,将地理位置映射到一个字符串上,从而允许对地理位置进行快速检索。这一功能极大地扩展了Redis在地理空间数据处理方面的能力,使其成为开发具有地理定位功能应用的强大工具。
流程
1、小程序前端获取位置(在小程序中获取当前位置的功能通常是通过调用微信小程序提供的API来实现的)
2、后端将位置存储到数据库
3、附近场馆查询
- 将位置信息存储到Redis GEO中
- 查询的时候,先根据缓存查询附近的场馆,再带着附近场馆ID和查询条件去数据库中查询
数据库设计
为了实现附近场馆功能,需要存储场馆的经纬度信息
DROP TABLE IF EXISTS `venue`;
CREATE TABLE `venue`(`id` bigint NOT NULL COMMENT 'ID',`create_time` datetime,`update_time` datetime,`is_deleted` tinyint default 0 COMMENT '逻辑删除 0:没删除 1:已删除',`organization_id` bigint NOT NULL COMMENT '所属机构ID',`name` varchar(30) NOT NULL COMMENT '场馆名称',`type` int NOT NULL COMMENT '场馆类型 1:篮球馆(场) 2:足球场 3:羽毛球馆(场) 4:排球馆(场)100:体育馆 1000:其他',`address` varchar(255) NOT NULL COMMENT '场馆地址名称',`latitude` DECIMAL(9, 6) NOT NULL COMMENT '纬度',`longitude` DECIMAL(9, 6) NOT NULL COMMENT '经度',`description` varchar(255) DEFAULT '' COMMENT '场馆描述,也可以说是否提供器材等等',`open_time` varchar(2000) NOT NULL COMMENT '场馆营业时间',`phone_number` varchar(11) NULL DEFAULT '' COMMENT '联系电话',`status` tinyint NOT NULL COMMENT '场馆状态 0:关闭 1:开放 2:维护中',`is_open` tinyint NOT NULL COMMENT '是否对外开放 0:否 1:是 如果不对外开放,需要相同机构的用户才可以预定',`advance_booking_day` int NOT NULL COMMENT '提前可预定天数,例如设置为1,即今天可预订明天的场',`start_booking_time` time NOT NULL COMMENT '开放预订时间',PRIMARY KEY (`id`) USING BTREE
)
实体类
【查询请求类】
import com.vrs.convention.page.PageRequest;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;/*** @Author dam* @create 2024/12/7 10:51*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VenueListReqDTO extends PageRequest {/*** 场馆名称*/private String name;/*** 场馆类型 1:篮球馆(场) 2:足球场 3:羽毛球馆(场) 4:排球馆(场)100:体育馆 1000:其他*/private Integer type;/*** 维度*/private BigDecimal latitude;/*** 经度*/private BigDecimal longitude;/*** 多少千米*/private double km;/*** 场馆状态 0:关闭 1:开放 2:维护中*/private Integer status;
}
【返回实体类】
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vrs.domain.base.BaseEntity;
import lombok.Data;import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;/*** * @TableName venue*/
@TableName(value ="venue")
@Data
public class VenueRespDTO extends BaseEntity implements Serializable {/*** 所属机构ID*/private Long organizationId;/*** 所属机构名称*/private String organizationName;/*** 场馆名称*/private String name;/*** 场馆类型 1:篮球馆(场) 2:足球场 3:羽毛球馆(场) 4:排球馆(场)100:体育馆 1000:其他*/private Integer type;private String typeName;/*** 场馆地址*/private String address;/*** 场馆描述,也可以说是否提供器材等等*/private String description;/*** 场馆营业时间*/private String openTime;/*** 联系电话*/private String phoneNumber;/*** 场馆状态 0:关闭 1:开放 2:维护中*/private Integer status;private String statusName;/*** 是否对外开放 0:否 1:是 如果不对外开放,需要相同机构的用户才可以预定*/private Integer isOpen;/*** 提前可预定天数,例如设置为1,即今天可预订明天的场*/private Integer advanceBookingDay;/*** 开放预订时间*/private LocalTime startBookingTime;/*** 维度*/private BigDecimal latitude;/*** 经度*/private BigDecimal longitude;/*** 距离多少公里*/private Double distance;@TableField(exist = false)private static final long serialVersionUID = 1L;
}
位置缓存初始化
【初始化类】
当场馆服务启动起来的时候,调用cacheVenueLocations
方法
import com.vrs.service.VenueService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;/*** @Author dam* @create 2025/1/28 9:59*/
@Component
@Slf4j
@RequiredArgsConstructor
public class VenueLocationCacheInit implements CommandLineRunner {private final VenueService venueService;@Overridepublic void run(String... args) throws Exception {log.info("读取数据库中的场馆信息,将其位置存储缓存到Redis");venueService.cacheVenueLocations();log.info("场馆位置缓存成功");}
}
【位置缓存加载】
这段代码通过流式处理从数据库中查询场馆的位置信息(经度和纬度),等到缓冲区数据到达容量之后,使用 Redis 的管道技术将这些信息批量存储到 Redis 的地理空间索引中。
通过分批处理(每次处理 1000 条数据)和管道技术,代码优化了数据存储的效率,减少了与 Redis 的交互次数,从而提升了性能。优点是降低了数据库和 Redis 的负载,提高了数据写入的速度,同时避免了内存溢出风险。
/*** 将场馆的位置信息存储到 Redis 中*/
@Override
@SneakyThrows
public void cacheVenueLocations() {// 获取 dataSource Bean 的连接@Cleanup Connection conn = dataSource.getConnection();@Cleanup Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);stmt.setFetchSize(Integer.MIN_VALUE);// 查询sql,只查询关键的字段String sql = "SELECT id,latitude,longitude FROM venue where is_deleted = 0";@Cleanup ResultSet rs = stmt.executeQuery(sql);// 每次获取一行数据进行处理,rs.next()如果有数据返回true,否则返回falseList<VenueDO> buffer = new ArrayList<>();int bufferSize = 1000;while (rs.next()) {// 获取数据中的属性VenueDO venueDO = new VenueDO();venueDO.setId(rs.getLong("id"));venueDO.setLongitude(rs.getBigDecimal("longitude"));venueDO.setLatitude(rs.getBigDecimal("latitude"));buffer.add(venueDO);if (buffer.size() >= bufferSize) {cacheLocations(buffer);buffer.clear();}}if (buffer.size() >= 0) {cacheLocations(buffer);buffer.clear();}
}/*** 使用 Redis 管道将场馆位置添加到 Redis 缓存中** @param buffer*/
private void cacheLocations(List<VenueDO> buffer) {// 使用 Redis 管道批量操作redisTemplate.executePipelined((RedisCallback<?>) (connection) -> {for (VenueDO venue : buffer) {// 确保经纬度信息不为空if (venue.getLongitude() != null && venue.getLatitude() != null) {// 将场馆的经纬度信息存储到 Redis 中Point point = new Point(venue.getLongitude().doubleValue(), venue.getLatitude().doubleValue());connection.geoAdd(RedisCacheConstant.VENUE_LOCATION_KEY.getBytes(), point, venue.getId().toString().getBytes());}}// 管道操作不需要返回值return null;});
}
附近场馆条件查询
这段代码实现了一个基于地理位置和多种条件的分页查询场馆信息的功能。
- 首先根据用户提供的经纬度和半径范围,从缓存中查询出附近的场馆ID列表。
- 然后,结合用户输入的其他条件(如场馆名称、类型、状态等),构建查询条件,从数据库中筛选出符合条件的场馆信息。注意构建查询条件的时候,需要使用 in 语句 传入 附近场馆ID列表。
- 接着将查询结果转换为响应对象(DTO),并计算每个场馆与用户当前位置的距离,最后返回分页后的场馆信息列表。
@Override
public PageResponse<VenueRespDTO> pageVenueDO(VenueListReqDTO request) {List<Long> venueIdList = null;if (request.getLatitude() != null && request.getLongitude() != null) {// 先去缓存中,把位置靠近的场馆ID查询出来venueIdList = this.findVenuesWithinRadius(request.getLongitude(), request.getLatitude(), request.getKm());}LambdaQueryWrapper<VenueDO> queryWrapper = Wrappers.lambdaQuery(VenueDO.class);// 只查询附近的场馆if (venueIdList != null) {if (venueIdList.size() > 0) {queryWrapper.in(VenueDO::getId, venueIdList);} else {return new PageResponse(request.getCurrent(), request.getSize(), 0L, null);}}// 根据名字模糊查询if (!StringUtils.isBlank(request.getName())) {queryWrapper.like(VenueDO::getName, "%" + request.getName() + "%");}// 根据类型查询if (request.getType() != null) {queryWrapper.eq(VenueDO::getType, request.getType());}// 根据状态查询if (request.getStatus() != null) {queryWrapper.eq(VenueDO::getStatus, request.getStatus());}// 查询对方开放场馆,或者相同机构的场馆queryWrapper.eq(VenueDO::getIsOpen, 1).or().eq(VenueDO::getOrganizationId, UserContext.getOrganizationId());IPage<VenueDO> page = baseMapper.selectPage(new Page(request.getCurrent(), request.getSize()), queryWrapper);List<VenueRespDTO> venueRespDTOList = new ArrayList<>();for (VenueDO record : page.getRecords()) {VenueRespDTO venueRespDTO = new VenueRespDTO();BeanUtils.copyProperties(record, venueRespDTO);venueRespDTO.setTypeName(VenueTypeEnum.findValueByType(record.getType()));venueRespDTO.setStatusName(VenueStatusEnum.findValueByType(record.getStatus()));// 计算距离并设置到 DTO 中if (request.getLatitude() != null && request.getLongitude() != null) {double distance = DistanceUtil.calculateDistance(request.getLatitude().doubleValue(),request.getLongitude().doubleValue(),record.getLatitude().doubleValue(),record.getLongitude().doubleValue());venueRespDTO.setDistance(distance);}venueRespDTOList.add(venueRespDTO);}return new PageResponse(request.getCurrent(), request.getSize(), page.getTotal(), venueRespDTOList);
}/*** 根据经纬度和半径(公里)查询附近的场馆 ID** @param longitude 经度* @param latitude 纬度* @param radiusKm 半径(公里)* @return 附近的场馆 ID 列表*/
public List<Long> findVenuesWithinRadius(BigDecimal longitude, BigDecimal latitude, double radiusKm) {// 获取 GeoOperationsGeoOperations<String, String> geoOps = redisTemplate.opsForGeo();// 定义查询的中心点和半径Point center = new Point(longitude.doubleValue(), latitude.doubleValue());Distance distance = new Distance(radiusKm, Metrics.KILOMETERS);Circle circle = new Circle(center, distance);// 执行地理空间查询GeoResults<RedisGeoCommands.GeoLocation<String>> results = geoOps.radius(// Redis 中的 keyRedisCacheConstant.VENUE_LOCATION_KEY,circle);// 提取场馆 ID 并返回return results.getContent().stream().map(result ->{Long venueId = Long.parseLong(result.getContent().getName());
// double venueDistance = result.getDistance().getValue();
// System.out.println("场馆 ID: " + venueId + ", 距离: " + venueDistance + " 公里");return venueId;}).collect(Collectors.toList());
}
【工具类】
该工具列的作用是:给定两个经纬度,求它们之间的距离(单位:千米)
/*** 根据经纬度结算公里* @Author dam* @create 2025/1/28 19:39*/
public class DistanceUtil {/*** 地球半径,单位:公里*/private static final double EARTH_RADIUS = 6371;/*** 计算两个经纬度点之间的距离(公里)** @param lat1 纬度 1* @param lon1 经度 1* @param lat2 纬度 2* @param lon2 经度 2* @return 距离(公里)*/public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {double dLat = Math.toRadians(lat2 - lat1);double dLon = Math.toRadians(lon2 - lon1);double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)+ Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))* Math.sin(dLon / 2) * Math.sin(dLon / 2);double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));return EARTH_RADIUS * c;}
}
相关文章:
基于 Redis GEO 实现条件分页查询用户附近的场馆列表
🎯 本文档详细介绍了如何使用Redis GEO模块实现场馆位置的存储与查询,以支持“附近场馆”搜索功能。首先,通过微信小程序获取用户当前位置,并将该位置信息与场馆的经纬度数据一同存储至Redis中。利用Redis GEO高效的地理空间索引能…...
项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser
文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么,有存就有取 在取值的时候,报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中:LoginUser u…...
Python算法详解:贪心算法
贪心算法(Greedy Algorithm)是一种通过选择当前最优解以期望达到全局最优解的算法思想。它在每一步选择时只考虑当前状态下的局部最优,而不关心全局问题的复杂性。这种算法简单高效,适用于某些特定问题,尤其是存在贪心…...
5.3.2 软件设计原则
文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…...
sublime_text的快捷键
sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行:通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行:通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…...
【项目集成Husky】
项目集成Husky 安装初始化 Husky在.husky → pre-commit文件中添加想要执行的命令 安装 使用 Husky 可以帮助你在 Git 钩子中运行脚本,例如在提交代码前运行测试或格式化代码pnpm add --save-dev husky初始化 Husky npx husky init这会在项目根目录下创建一个 .hu…...
本地运行大模型效果及配置展示
电脑上用ollama安装了qwen2.5:32b,deepseek-r1:32b,deepseek-r1:14b,llama3.1:8b四个模型,都是Q4_K_M量化版。 运行过程中主要是cpu和内存负载比较大,qwen2.5:32b大概需要22g,deepseek-r1:32b类…...
数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...
进阶数据结构——高精度运算
目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版(c)六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…...
第一届“启航杯”网络安全挑战赛WP
misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...
前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局
一、盒模型 题目:简述CSS的盒模型 答:盒模型有两种类型,可以通过box-sizing设置 1.标准盒模型(content-box):默认值,宽度和高度只包含内容区域,不包含内边距、边框和外边距。 2.边框盒模型&a…...
使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI,是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手,感觉收获还蛮多的,今天来分享下开发过程中的一些经验~ 为啥要做这个…...
Windows程序设计10:文件指针及目录的创建与删除
文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…...
Rk3588芯片介绍(含数据手册)
芯片介绍:RK3588是一款低功耗,高性能的处理器,适用于基于arm的PC和边缘计算设备,个人移动互联网设备和其他数字多媒体应用,集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面:提供…...
golang 使用双向链表作为container/heap的载体
MyHeap:container/heap的数据载体,需要实现以下方法: Len:堆中数据个数 Less:第i个元素 是否必 第j个元素 值小 Swap:交换第i个元素和 第j个元素 Push:向堆中追加元素 Pop:从堆…...
HTML DOM 修改 HTML 内容
HTML DOM 修改 HTML 内容 引言 HTML DOM(文档对象模型)是浏览器内部用来解析和操作HTML文档的一种机制。通过DOM,我们可以轻松地修改HTML文档的结构、样式和行为。本文将详细介绍如何使用HTML DOM来修改HTML内容,包括元素的增删改查、属性修改以及事件处理等。 1. HTML …...
基于51单片机和WS2812B彩色灯带的流水灯
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯,谁不喜欢呢? 所用单片机:STC15W204S (也可以用其他1T单片机,例如,S…...
React第二十八章(css modules)
css modules 什么是 css modules 因为 React 没有Vue的Scoped,但是React又是SPA(单页面应用),所以需要一种方式来解决css的样式冲突问题,也就是把每个组件的样式做成单独的作用域,实现样式隔离,而css modules就是一种…...
瑞芯微方案:RV1126定制开发板方案定制
产品简介 RV1126 核心板是常州海图电子科技有限公司推出的一款以瑞芯微 RV1126处理器为核心的通用产品,其丰富的设计资源、稳定的产品性能、强力的设计支持,为客户二次开发快速转化产品提供强有力的技术保障。RV1126 核心板集多种优势于一身,…...
吴恩达深度学习——有效运作神经网络
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...
ollama改模型的存盘目录解决下载大模型报c:盘空间不足的问题
使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1,非常简单方便,参见:使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1…...
springboot集成钉钉,发送钉钉日报
目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api,主要用到以下几个api: ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...
Day49:添加字典元素
在 Python 中,字典是一个可变的数据类型,这意味着你可以随时添加新的键值对。今天我们将学习如何向字典中添加元素。 1. 使用方括号 ([]) 添加新元素 最简单的方法是通过字典的键,使用方括号 [] 来添加新的键值对。如果该键已经存在&#x…...
Keepalived 安装
环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64…...
AI应用部署——streamlit
如何把项目部署到一个具有公网ip地址的服务器上,让他人看到? 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库,也包括这些库的…...
C++中vector追加vector
在C中,如果你想将一个vector追加到另一个vector的后面,可以使用std::vector的成员函数insert或者std::copy,或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法: 方法1:使用insert方…...
普通人可以从DeepSeek工具获得什么帮助?
普通人可以从DeepSeek工具获得多方面的帮助,具体如下: 学习与教育 DeepSeek可以为学生提供作业辅导、知识点整理、论文思路生成等服务,帮助他们更好地理解和掌握学习内容。例如,学生可以通过DeepSeek获得详细的解题步骤和思路&…...
EtherCAT-快速搭建
EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...
[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头…...
【AIGC专栏】AI在自然语言中的应用场景
ChatGPT出来以后,突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类,虽然这是一句夸大其词的话,但是经过未来几十年的迭代,ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说,ChatGPT毫无疑问在当前…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
数科OFD证照生成原理剖析与平替方案实现
数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD(Open Fixed-layout Document)是一种基于XML的固定版式文档格式,广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面: OFD文…...
未来无线技术的发展方向
未来无线技术的发展趋势呈现出多样化、融合化的特点,涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升:Wi-Fi 技术迭代加快,如 Wi-Fi7 理论峰值速率达 46Gbps&#…...
验证二叉搜索数(98)
98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
Day51:type()函数
在 Python 中,type() 是一个内置函数,用于返回对象的类型。它可以用于检查变量的类型,也可以用于动态创建新的类型。今天,我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...
DeepSeek-R1大模型本地部署及简单测试
目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世,这是一款免费、开源且隐私优…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...
灵芝黄金基因组注释-文献精读109
The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝(Ganoderma lingzhi)的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...
【Proteus仿真】【51单片机】多功能计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、加减乘除,开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含:程序&…...
MySQL数据类型转换应注意什么?
文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时,需要注意以下几个关键点ÿ…...
【LLM-agent】(task1)简单客服和阅卷智能体
note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:Role (角色) -> Profile(角色…...
【Linux】使用管道实现一个简易版本的进程池
文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
力扣017_最小覆盖字串题解----C++
题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动…...
C++:函数
在之前的博客中已经讲过了C语言中的函数概念了,重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充,在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变…...
linux asio网络编程理论及实现
最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…...
第一篇:数据库基础与概念
第一篇:数据库基础与概念 目标读者: 没有接触过数据库的初学者。 内容概述: 在本篇文章中,我们将从零开始,详细介绍数据库的基本概念、常见的数据库管理系统(DBMS)以及数据库设计的基础知识…...
从理论到实践:Django 业务日志配置与优化指南
在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...