java抽奖系统(八)
9. 抽奖模块
9.1 抽奖设计
抽奖过程是抽奖系统中最重要的核⼼环节,它需要确保公平、透明且⾼效。以下是详细的抽奖过程设计:
对于前端来说,负责控制抽奖的流程,确定中奖的人员
对于后端来说:
接口1:查询完整的活动信息
接口2: 前端确定好中奖的人员之后奖人员信息发送给后端,后端完整的保存好中奖信息。(扭转活动,奖品,人员状态,有的奖品抽完了,有的人员中奖了就不能参加下一个等级的抽奖了,这个活动是不是已经抽奖结束了)(完成中奖人员通知的操作)
接口三:查询中奖列表。
9.2 查询活动完整信息接口
activityDetailDTO类里面包含抽奖活动所需要的所有参数。
前端:向后端发起请求,从redis中查询相关的数据(如果没有存储,或者redis中的缓存过期,就会查询相关的数据库表,整合所需要的所有数据,再一次存放到redis中),最后奖数据返回给前端。
controller:
@RequestMapping("/activity-detail/find")public CommonResult<GetActivityDetailResult> getActivityDetail(Long activityId) {logger.info("ActivityController getActivityDetail activityId:{}", activityId);ActivityDetailDTO detailDTO = activityService.getActivityDetail(activityId);return CommonResult.success(convertToGetActivityDetailResult(detailDTO));}private GetActivityDetailResult convertToGetActivityDetailResult(ActivityDetailDTO detailDTO) {if (detailDTO == null) {throw new ControllerException(ControllerErrorCodeConstants.GET_ACTIVITY_DETAIL_ERROR);}GetActivityDetailResult result = new GetActivityDetailResult();result.setActivityId(detailDTO.getActivityId());result.setActivityName(detailDTO.getActivityName());result.setDescription(detailDTO.getDesc());result.setValid(detailDTO.valid());// 抽奖顺序:一等奖、二、三result.setPrizes(detailDTO.getPrizeDTOList().stream().sorted(Comparator.comparingInt(prizeDTO -> prizeDTO.getTiers().getCode()))//按照奖品code1,2,3等奖来进行从小到大的排序.map(prizeDTO -> {GetActivityDetailResult.Prize prize = new GetActivityDetailResult.Prize();prize.setPrizeId(prizeDTO.getPrizeId());prize.setName(prizeDTO.getName());prize.setImageUrl(prizeDTO.getImageUrl());prize.setPrice(prizeDTO.getPrice());prize.setDescription(prizeDTO.getDescription());prize.setPrizeTierName(prizeDTO.getTiers().getMessage());prize.setPrizeAmount(prizeDTO.getPrizeAmount());prize.setValid(prizeDTO.valid());return prize;}).collect(Collectors.toList()));result.setUsers(detailDTO.getUserDTOList().stream().map(userDTO -> {GetActivityDetailResult.User user = new GetActivityDetailResult.User();user.setUserId(userDTO.getUserId());user.setUserName(userDTO.getUserName());user.setValid(userDTO.valid());return user;}).collect(Collectors.toList()));return result;}
service:
ActivityDetailDTO getActivityDetail(Long activityId);@Overridepublic ActivityDetailDTO getActivityDetail(Long activityId) {if (activityId == null) {logger.warn("查询活动详细信息失败,activityId为空!");return null;}// 查询 redisActivityDetailDTO detailDTO = getActivityFromCache(activityId);if (detailDTO != null) {logger.info("查询活动详细信息成功!detailDTO={}",JacksonUtil.writeValueAsString(detailDTO));return detailDTO;}// 如果redis不存在,查表// 活动表ActivityDO aDO = activityMapper.selectById(activityId);// 活动奖品表List<ActivityPrizeDO> apDOList = activityPrizeMapper.selectByActivityId(activityId);// 活动人员表List<ActivityUserDO> auDOList = activityUserMapper.selectByActivityId(activityId);// 奖品表: 先获取要查询的奖品idList<Long> prizeIds = apDOList.stream().map(ActivityPrizeDO::getPrizeId).collect(Collectors.toList());List<PrizeDO> pDOList = prizeMapper.batchSelectByIds(prizeIds);// 整合活动详细信息,存放redisdetailDTO = convertToActivityDetailDTO(aDO, auDOList, pDOList, apDOList);cacheActivity(detailDTO);// 返回return detailDTO;}
dao:
@Select("select * from activity_prize where activity_id = #{activityId}")List<ActivityPrizeDO> selectByActivityId(@Param("activityId") Long activityId);@Select("select * from activity_user where activity_id = #{activityId}")List<ActivityUserDO> selectByActivityId(@Param("activityId") Long activityId);
postman进行测试:
返回结果如下:
{"code": 200,"data": {"activityId": 26,"activityName": "测试抽奖活动2.0","description": "测试抽奖活动2.0","valid": true,"prizes": [{"prizeId": 23,"name": "snh48演唱会门票","imageUrl": "bc10a8f2-eb31-4e1e-8a72-2883b3968f0c.jpg","price": 498.00,"description": "演唱会门票","prizeTierName": "一等奖","prizeAmount": 1,"valid": true},{"prizeId": 21,"name": "奥迪a6","imageUrl": "a1452970-b709-4a51-8343-e969f5ac5c64.jpg","price": 260000.00,"description": "一个四轮车子","prizeTierName": "二等奖","prizeAmount": 1,"valid": true}],"users": [{"userId": 44,"userName": "王奕","valid": true},{"userId": 45,"userName": "周诗雨","valid": true}]},"msg": ""
}
9.3 抽奖接口分析
抽奖场景:当确定中奖人员信息之后,处于用户体验,需要当前页面马上显示出相关的人员信息,但是前端将相关中奖人确定的信息传入到后端之后,后端要进行(保存中奖信息,扭转对协应的转态,完成通知),之后才会将先关数据发送到前端显示的页面上,这样会极大地消耗时间,这就是同步接口,该接口完全不符合当前的抽奖接口。
异步接口:
前端:确定中间人之后前往后端。
后端:前端来请求之后直接返回数据,对上面三个步骤进行异步处理。
异步处理流程,会另找时间完成后端所要完成的三个步骤。
9.3.1 异步处理业务流程图
9.3.2 业务逻辑分析
1、抽奖请求处理(重要)
随机抽取:前端随机选择后端提供的参与者,确保每次抽取的结果是公平的。
请求提交:在活动进⾏时,管理员可发起抽奖请求。请求包含活动ID、奖品ID和中奖⼈员等附加 信息。
消息队列通知:有效的抽奖请求被发送⾄MQ队列中,等待MQ消费者真正处理抽奖逻辑。
请求返回:抽奖的请求处理接⼝将不再完成任何的事情,直接返回。
2、 抽奖结果公布
前端展⽰:中奖名单通过前端随机抽取的⼈员,公布展⽰出来。
3、 抽奖逻辑执⾏(重要)
消 息消费:MQ消费者收到异步消息,系统开始执⾏以下抽奖逻辑。
4、 中奖结果处理(重要)
请求验证:
◦ 系统验证抽奖请求的有效性,如是否满⾜系统根据设定的规则(如奖品数量、每⼈中奖次数 限制等)等;
◦ 幂等性:若消息多发,已抽取的内容不能再次抽取
状态扭转:根据中奖结果扭转活动/奖品/参与者状态,如奖品是否已被抽取,⼈员是否已中奖等。
结果记录:中奖结果被记录在数据库中,并同步更新Redis缓存。
5、 中奖者通知
通知中奖者:通知中奖者和其他相关系统(如邮件发送服务)。
奖品领取:中奖者根据通知中的指引领取奖品。
6、 抽奖异常处理
回滚处理:当抽奖过程中发⽣异常,需要保证事务⼀致性。
补救措施:抽奖⾏为是⼀次性的,因此异步处理抽奖任务必须保证成功,若过程异常,需采取补 救措施
技术实现细节:
异步处理:提⾼抽奖性能,不影响抽奖流程,将抽奖处理放⼊队列中进⾏异步处理,且保证了幂 等性。
活动状态扭转处理:状态扭转会涉及活动及奖品等多横向维度扭转,不能避免未来不会有其他内 容牵扯进活动中,因此对于状态扭转处理,需要⾼扩展性(设计模式)与维护性。 并发处理:中奖者通知,可能要通知多系统(邮箱和手机两种方式),但相互解耦,可以设计为并发处理,加快抽奖效率 作⽤。
事务处理:在抽奖逻辑执⾏时,如若发⽣异常,需要确保数据库表原⼦性、事务⼀致性,因此要 做好事务处理。
本次的异步处理操作使用rabbitmq工具来实现。
9.4 mq
MQ( Message queue ),从字⾯意思上看,本质是个队列,FIFO先⼊先出,只不过队列中存放的内容 是消息(message)⽽已.消息可以⾮常简单,⽐如只包含⽂本字符串,JSON等,也可以很复杂,⽐如内嵌对象. MQ多⽤于分布式系统之间进⾏通信,系统之间的调⽤通常有两种⽅式:
1. 同步通信
直接调⽤对⽅的服务,数据从⼀端发出后⽴即就可以达到另⼀端.
2. 异步通信
数据从⼀端发出后,先进⼊⼀个容器进⾏临时存储,当达到某种条件后,再由这个容器发送给另⼀端. 容器的⼀个具体实现就是MQ( message queue)
RabbitMQ 就是MQ的⼀种实现
9.4.1 MQ主要作用
MQ主要⼯作是接收并转发消息,在不同的应⽤场景下可以展现不同的作⽤:
1. 异步解耦:
在业务流程中,⼀些操作可能⾮常耗时,但并不需要即时返回结果.可以借助MQ把这些操 作异步化,⽐如⽤⼾注册后发送注册短信或邮件通知,可以作为异步任务处理,⽽不必等待这些操作 完成后才告知⽤⼾注册成功.
2. 流量削峰:
在访问量剧增的情况下,应⽤仍然需要继续发挥作⽤,但是是这样的突发流量并不常⻅.如 果以能处理这类峰值为标准⽽投⼊资源,⽆疑是巨⼤的浪费.使⽤MQ能够使关键组件⽀撑突发访问压 ⼒,不会因为突发流量⽽崩溃.⽐如秒杀或者促销活动,可以使⽤MQ来控制流量,将请求排队,然后系 统根据⾃⼰的处理能⼒逐步处理这些请求.
3. 异步通信:
在很多时候应⽤不需要⽴即处理消息,MQ提供了异步处理机制,允许应⽤把⼀些消息放⼊ MQ中,但并不⽴即处理它,在需要的时候再慢慢处理.
4. 消息分发:
当多个系统需要对同⼀数据做出响应时,可以使⽤MQ进⾏消息分发.⽐如⽀付成功后,⽀ 付系统可以向MQ发送消息,其他系统订阅该消息,⽽⽆需轮询数据库.
5. 延迟通知:
在需要在特定时间后发送通知的场景中,可以使⽤MQ的延迟消息功能,⽐如在电⼦商务平 台中,如果⽤⼾下单后⼀定时间内未⽀付,可以使⽤延迟队列在超时后⾃动取消订单
9.4.2 rabbitmq核心概念
如下图所示,生产者和消费者是通过网络进行连接的,网络之中是有信道的,发送的消息是存放在队列中遵循先进先出的规则,交换机的作用是用来路由消息的,消息由生产者发送到网络中,由交换机经过路由将消息传递给队列(交换机绑定的队列)。
消费者消费消息,就是去相应对的队列里面进行拿取相应的消息。
多个消费者可以订阅同一个队列。
9.4.3 . web界⾯操作
RabbitMQ Management访问
RabbitMQ 介绍.pdf 基本步骤见文件
9.4.4 rabbitmq的配置与使用
1、引入依赖:
<!-- RabbitMQ --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2、application.properties 配置 MQ
## mq ##
spring.rabbitmq.host=49
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#消息确认机制,默认auto
spring.rabbitmq.listener.simple.acknowledge-mode=auto
#设置失败重试 5次
spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.max-attempts=5
3、DirectRabbitConfig 配置类
@Configuration
public class DirectRabbitConfig {public static final String QUEUE_NAME = "DirectQueue";public static final String EXCHANGE_NAME = "DirectExchange";public static final String ROUTING = "DirectRouting";public static final String DLX_QUEUE_NAME = "DlxDirectQueue";public static final String DLX_EXCHANGE_NAME = "DlxDirectExchange";public static final String DLX_ROUTING = "DlxDirectRouting";/*** 队列 起名:DirectQueue** @return*/@Beanpublic Queue directQueue() {// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。// return new Queue("DirectQueue",true,true,false);// 一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue(QUEUE_NAME,true);// 普通队列绑定死信交换机
// return QueueBuilder.durable(QUEUE_NAME)
// .deadLetterExchange(DLX_EXCHANGE_NAME)
// .deadLetterRoutingKey(DLX_ROUTING).build();}/*** Direct交换机 起名:DirectExchange** @return*/@BeanDirectExchange directExchange() {return new DirectExchange(EXCHANGE_NAME,true,false);}/*** 绑定 将队列和交换机绑定, 并设置用于匹配键:DirectRouting** @return*/@BeanBinding bindingDirect() {return BindingBuilder.bind(directQueue()).to(directExchange()).with(ROUTING);}/*** 死信队列** @return*/@Beanpublic Queue dlxQueue() {// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。// return new Queue("DirectQueue",true,true,false);// 一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue(DLX_QUEUE_NAME,true);}/*** 死信交换机** @return*/@BeanDirectExchange dlxExchange() {return new DirectExchange(DLX_EXCHANGE_NAME,true,false);}/*** 绑定死信队列与交换机** @return*/@BeanBinding bindingDlx() {return BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with(DLX_ROUTING);}@Beanpublic MessageConverter jsonMessageConverter(){return new Jackson2JsonMessageConverter();}
}
在当前生产消费的模块中,生产者是前端的抽奖接口,消费者是处理抽奖流程的方法。
相关文章:
java抽奖系统(八)
9. 抽奖模块 9.1 抽奖设计 抽奖过程是抽奖系统中最重要的核⼼环节,它需要确保公平、透明且⾼效。以下是详细的抽奖过程设计: 对于前端来说,负责控制抽奖的流程,确定中奖的人员 对于后端来说: 接口1:查询完…...
在技术文档中多使用各种图
有些事情在文档中掰扯十几页,不如一幅图讲的明白!举个例子下面这幅图就是一个EDI 835电子报文(就是医保了,美国加州的)的业务流程。如果纯靠文字来描述,写很多文字不一定能说清楚。所以俺画了这幅图&#x…...
GB28181学习总结
GB28181学习总结 前言 我认为,学习一个新东西可以分成两步: 作用是什么? 原理是什么? 所以本文将从两个问题出发,对GB28181进行总结: GB28181是什么? GB28181原理是什么? GB…...
矩阵论:Vector-Valued Linear and Affine Functions介绍:中英双语
最近在翻看 这本书,对其中的一些英文概念做一些记录。 Link:https://web.stanford.edu/~boyd/books.html 中文版 向量值线性函数和仿射函数的详解 在机器学习、数据科学和工程应用中,向量值线性函数和仿射函数是非常重要的数学工具。本…...
网络七层杀伤链
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&…...
某狐畅游24校招-C++开发岗笔试(单选题)
某狐畅游24校招-C开发岗笔试 目录 某狐畅游24校招-C开发岗笔试一、单选题二、单选题解析 本文题目源来自:[PTA程序设计类实验辅助教学平台](PTA | 程序设计类实验辅助教学平台) 一、单选题 1-1 若有说明 int a[2][3]; 则对 a 数组元素的正确引用是 A. a[0][11]B. …...
spring mvc | servlet :serviceImpl无法自动装配 UserMapper
纯注解SSM整合 解决办法: 在MybatisConfig添加 Configuration MapperScan("mapper")...
在 CentOS 上安装 MySQL 8
在 CentOS 上安装 MySQL 8 您可以按照以下步骤操作: 1. 更新系统 首先,更新系统软件包以确保安装的最新版本。 sudo yum update -y 2. 安装 MySQL 8 安装 MySQL 存储库 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.r…...
EMC VMAX/DMX 健康检查方法
近期连续遇到2个由于对VMAX存储系统没有做及时的健康检查,出现SPS电池故障没有及时处理,然后同一pair就是同一对的另外一个SPS电池再次出现故障,然后存储系统保护性宕机vault,然后业务系统挂掉的案例。 开始之前,先纠…...
深入理解Kafka:核心设计与实践原理读书笔记
目录 初识Kafka基本概念安装与配置ZooKeeper安装与配置Kafka的安装与配置 生产与消费服务端参数配置 生产者客户端开发消息对象 ProducerRecord必要的参数配置发送消息序列化分区器生产者拦截器 原理分析整体架构元数据的更新 重要的生产者参数acksmax.request.sizeretries和re…...
Ubuntu命令行网络配置
临时连接 为什么需要临时连接,你最好测试你的网络适配器驱动能够连接到网络,然后再进行进一步的配置自动连接,否则也许会一直处在“折腾”中。 查看网络状态 ip addr show激活网络接口: sudo ip link set <适配器名称> up使…...
Wireshark软件下载安装及基础
前言 本次学习的是在b站up主泷羽sec课程有感而发,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 !!…...
16asm - 宏汇编语法
文章目录 前言宏汇编表达式算术表达式逻辑运算关系运算符 标号匿名标号调整偏移量指令ORG当前地址指令$ 结构体宏equ语句语句macro语句 多文件编译源文件头文件函数使用全局变量编译 选择结构循环结构 总结 前言 各位师傅大家好,我是qmx_07,今天讲解 宏汇编的相关内…...
5.C语言内存分区-堆-栈
目录 内存分区 运行之前 代码区 全局初始化数据区 、静态数据区 (data) 未初始化数据区(bss(Block Started by Symbol)区) 总结 运行之后 代码区 (text segment) 未初始化数据区(bss) 全局初始化数据区,静态…...
【模拟】饮料促销
题目描述 暑期到了,各大商场都开始举办饮料促销优惠活动,卡卡维他命水凭3个瓶盖可以再换一瓶并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么对于他初始买入的 n 瓶…...
RFdiffusion get_torsions函数解读
函数功能 get_torsions 函数根据输入的原子坐标(xyz_in)和氨基酸序列(seq),计算一组主链和侧链的扭转角(torsions)。同时生成备用扭转角(torsions_alt),用于表示可以镜像翻转的几何结构,并返回掩码(tors_mask)和是否平面化(tors_planar)的信息。 输入参数 xyz…...
重拾设计模式--组合模式
文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...
IntelliJ IDEA Docker集成
一、概述 Docker是一种用于在隔离和可复制环境中部署和运行可执行文件的工具。这可能很有用,例如,在与生产相同的环境中测试代码。 IntelliJ IDEA集成了Docker功能,并为创建Docker映像、运行Docker容器、管理Docker Compose应用程序、使用公…...
【Blender】【源码详解】BLI_mesh_boolean 实现详解
1. 背景: 最近因为项目需要,需要阅读 Blender 中关于 mesh boolean 的源码;因此,对 blender 中的 mesh boolean 源码进行解读; Github 上源码下载很慢,一般使用 Gitee: gitee Blender 源码 2. Mesh Boole…...
36. Three.js案例-创建带光照和阴影的球体与平面
36. Three.js案例-创建带光照和阴影的球体与平面 实现效果 知识点 Three.js基础 WebGLRenderer WebGLRenderer 是Three.js中最常用的渲染器,用于将场景渲染到网页上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobject可选参数&#…...
C语言 函数嵌套
#include <stdio.h> void new_line() {printf("hehe\n"); } void three_line() {int i 0;for (i 0; i < 3; i){new_line;} } int main() {three_line();return 0; } 函数可以嵌套调用,但不能嵌套定义 链式访问 main有三个参数 //main函数的…...
Android adb查看某个进程的总线程数
Android adb查看某个进程的总线程数 adb shell 进入控制台,然后: top -m 20 列出当前系统的进程,找到目标进程的id, ps -T 进程id | wc -l Android adb shell ps进程查找以及kill-CSDN博客文章浏览阅读777次,点赞3次&a…...
安装milvus以及向量库增删改操作
首先电脑已经安装了docker windows电脑可下载yml文件 https://github.com/milvus-io/milvus/releases/download/v2.4.6/milvus-standalone-docker-compose.yml 创建milvus文件夹,并在这个目录下创建五个文件夹:conf、db、logs、pic、volumes、wal 然后…...
基于深度学习多图像融合的屏幕缺陷检测方案
公司项目,已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展,因其自主学习图像数据特征的性能避免了人工设计算法的繁琐,精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能,使得深度学习技术在…...
OAuth 2.0
简介 OAuth 是一种开放标准的授权协议或框架,它提供了一种安全的方式,使第三方应用程序能够访问用户在其他服务上的受保护资源,而无需共享用户的凭证(如用户名和密码)。OAuth 的核心思想是通过“授权令牌”来代替直接…...
2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题
2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题(选择题) 题目总数:5 总分数:50 选择题 第 1 题 单选题 Scratch运行以下程宇后,小兔子会( )。 A. 变小 B. 变大 C. 变色 D. …...
pat乙级1072 开学寄语
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面、理发、整衣&am…...
【Linux系统编程】:信号(2)——信号的产生
1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号,比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍,本文介绍下面三种. 2. 调用函数产生信号 2.1 k…...
Qwen2.5-7B 微调rz吧数据集
Qwen2.5-7B 微调弱智吧数据集 模型微调简介 模型微调是一种在已有预训练模型的基础上,通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时,适应特定任务的细微差别。使用微调模型ÿ…...
未来将要被淘汰的编程语言
COBOL - 这是一种非常古老的语言,主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休,COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算,Fortran在特定领域仍然有其应用,但随着更现代的语言(如Py…...
翻转(蓝桥杯2023大学C组试题E)
【问题描述】:小蓝用黑白棋的n个棋子排成了一行,他在脑海里想象出了一个长度为n的01串T,他发现如果把黑棋当作1、白棋当做0,这一行棋子是一个长度为n的01串S。 小蓝如果在S中发现一颗棋子和它两边的棋子都不一样,可以将…...
期权VIX指数构建与择时应用
芝加哥期权交易 所CBOE的波动率指数VIX 是反映 S&P 500 指数未来 30 天预测期波动率的指标,由于预期波动率多用于表征市场情绪,因此 VIX 也被称为“ 恐慌指数”。 VIX指数计算 VIX 反映了市场情绪和投资者的风险偏好, 对于欧美市场而言…...
Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建
环境信息 服务器基本信息 如下表,本次安装总共使用2台服务器,具体信息如下: 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为:…...
torch.unsqueeze:灵活调整张量维度的利器
在深度学习框架PyTorch中,张量(Tensor)是最基本的数据结构,它类似于NumPy中的数组,但可以在GPU上运行。在日常的深度学习编程中,我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...
为什么使用环形队列
1.看以下两种情况。第一种不会出现问题,当主流程读取次数比较慢时,数据会被覆盖。 2.扩大空间。不可取。 3.什么是队列...
Qt之QML应用程序开发:给应用程序添加图标文件
开发环境: 1、Qt Creator 14.0.1 2、windows10 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 先看下面的步骤,不明白再返回来看下面官方指导链接。 --------------------------------------------------------…...
基于xiaothink对Wanyv-50M模型进行c-eval评估
使用pypi安装xiaothink: pip install xiaothink1.0.2下载模型: 万语-50M 开始评估(修改模型路径后即可直接开始运行,结果保存在output文件夹里): import os import json import pandas as pd import re from tqdm import tqdm i…...
大模型项目如何成功落地?
随着人工智能的快速发展,大模型已经成为企业转型和提升效率的关键工具。要让大模型成功落地,需要几个关键要素,以及明白如何组建一个高效的团队。 首先,成功的关键在于业务人员的积极参与,这是项目成功的起点。 其次…...
重构(二)
继续"提高代码质量" 接着上文提高代码质量, 需要从这几个特点入手 1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。 仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了 递归的"可读性"不如while循环 递归…...
Sapro编程软件
Sapro软件是由西门子建筑科技公司开发的一款编程软件,主要用于Climatix控制器的编程、调试及相关功能实现.以下是其具体介绍: • 功能强大:可进行HVAC控制编程,实现设备控制、HMI用户访问和设备集成等功能,满足复杂的…...
EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南
随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台,作为基于国标GB28181协议的视频流媒体平台,为用户提供了强大的视频监控直播功能。然而,在实际应用中,P2P远程访问可…...
学生管理系统,增加教师管理,班级管理,角色功能权限管理
为了在现有的学生管理系统中增加**教师管理**、**班级管理**以及**角色和权限管理**,我们需要对数据库进行扩展,并相应地更新 Python 代码和用户界面。以下是详细的步骤和代码示例。 ## 1. 数据库扩展 ### 1.1 创建新表 #### 教师表 (teachers) sql …...
Vue CLI 脚手架创建项目流程详解 (2)
更新 CLI 脚手架 确保你安装的是最新版本的 Vue CLI,以支持最新的特性及改进。你可以通过以下命令全局安装或更新 Vue CLI: npm install -g vue/cli创建 Vue 3.x 项目 启动创建向导 使用 vue create 命令来开始创建一个新的 Vue 项目: vue …...
LabVIEW机械故障诊断中的传感器选择
在机械设备故障诊断中,传感器是关键设备,用于采集设备运行状态的各种数据。常见的传感器类型和选择方法如下: 1. 振动传感器 用于检测设备运行中的振动特征,常见于旋转机械和轴承故障诊断。 加速度传感器:检测高频振…...
二叉树_堆
目录 一. 树(非线性结构) 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构) 1.1 树的概念与结构 概念ÿ…...
Java图片拼接
最近遇到一个挺离谱的功能,某个表单只让上传一张图,多图上传会使导出失败。跟开发沟通后表示,这个问题处理不了。我... 遂自己思考,能否以曲线救国的方式拯救一下,即不伤及代码之根本,又能解决燃眉之急。灵…...
使用qemu搭建armv7嵌入式开发环境
目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…...
新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
经过近3个月的迭代开发,新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了,最新的EasyGBD支持了国标GB28181-2022版,还支持了语音对讲、位置上报、本地录像等功能,比原有GB28181-2016版的EasyGBD更加高效、…...
Hashtable 描述及源码解析
目录 一、Hashtable的基本概念 二、Hashtable的源码解析 构造函数 哈希算法函数 处理哈希冲突 类定义和成员变量 构造方法 插入元素 查找元素 删除元素 扩容 Hashtable(哈希表)是一种非常重要的数据结构,它提供了快速的数据插入、删…...
clickhouse-数据库引擎
1、数据库引擎和表引擎 数据库引擎默认是Ordinary,在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列,也是官方主推的引擎。 MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功…...