天机学堂3-ES+Caffeine

文章目录

  • day05-问答系统
  • 用户端分页查询问题
    • 目标效果
    • 代码实现
  • 3.6.管理端分页查询问题
      • ES相关
    • 管理端互动问题分页实现
    • 三级分类
      • 3.6.5.2.多级缓存
      • 3.6.5.3.Caffeine
      • TODO:使用Caffeine作为本地缓存,另外使用redis或者memcache作为分布式缓存,构造多级缓存体系
  • 4.评论相关接口
    • 目标效果
    • 新增回答或评论

day05-问答系统

效果:
在这里插入图片描述

互动提问的问题表:

CREATE TABLE IF NOT EXISTS `interaction_question` (`id` bigint NOT NULL COMMENT '主键,互动问题的id',`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '互动问题的标题',`description` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '问题描述信息',`course_id` bigint NOT NULL COMMENT '所属课程id',`chapter_id` bigint NOT NULL COMMENT '所属课程章id',`section_id` bigint NOT NULL COMMENT '所属课程节id',`user_id` bigint NOT NULL COMMENT '提问学员id',`latest_answer_id` bigint DEFAULT NULL COMMENT '最新的一个回答的id',`answer_times` int unsigned NOT NULL DEFAULT '0' COMMENT '问题下的回答数量',`anonymity` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否匿名,默认false',`hidden` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否被隐藏,默认false',`status` tinyint DEFAULT '0' COMMENT '管理端问题状态:0-未查看,1-已查看',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '提问时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_course_id` (`course_id`) USING BTREE,KEY `section_id` (`section_id`),KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='互动提问的问题表';

回答或评论表:

CREATE TABLE IF NOT EXISTS `interaction_reply` (`id` bigint NOT NULL COMMENT '互动问题的回答id',`question_id` bigint NOT NULL COMMENT '互动问题问题id',`answer_id` bigint DEFAULT '0' COMMENT '回复的上级回答id',`user_id` bigint NOT NULL COMMENT '回答者id',`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '回答内容',`target_user_id` bigint DEFAULT '0' COMMENT '回复的目标用户id',`target_reply_id` bigint DEFAULT '0' COMMENT '回复的目标回复id',`reply_times` int NOT NULL DEFAULT '0' COMMENT '评论数量',`liked_times` int NOT NULL DEFAULT '0' COMMENT '点赞数量',`hidden` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否被隐藏,默认false',`anonymity` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否匿名,默认false',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_question_id` (`question_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='互动问题的回答或评论';

KEY 关键字用于定义索引,而 USING BTREE 是一个可选的子句,用于显式指定索引的存储类型。如果不指定 USING BTREE,MySQL 会默认使用 B-Tree 索引结构

用户端分页查询问题

目标效果

在这里插入图片描述

代码实现

在这里插入图片描述

3.6.管理端分页查询问题

ES相关

Feign接口

package com.tianji.api.client.search;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@FeignClient("search-service")
public interface SearchClient {@GetMapping("/courses/name")List<Long> queryCoursesIdByName(@RequestParam(value = "keyword", required = false) String keyword);
}

Controller:

package com.tianji.search.controller;import com.tianji.common.domain.dto.PageDTO;
import com.tianji.search.domain.query.CoursePageQuery;
import com.tianji.search.domain.vo.CourseVO;
import com.tianji.search.service.ICourseService;
import com.tianji.search.service.ISearchService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;@RestController
@RequestMapping("courses")
@Api(tags = "课程搜索接口")
@RequiredArgsConstructor
public class CourseController {private final ISearchService searchService;private final ICourseService courseService;@ApiOperation("用户端课程搜索接口")@GetMapping("/portal")public PageDTO<CourseVO> queryCoursesForPortal(CoursePageQuery query){return searchService.queryCoursesForPortal(query);}@ApiIgnore@GetMapping("/name")public List<Long> queryCoursesIdByName(@RequestParam("keyword") String keyword){return searchService.queryCoursesIdByName(keyword);}

在这里插入图片描述

管理端互动问题分页实现

管理端互动问题分页: Admin可以通过关键字搜索课程,但由于问题表中没有课程名称字段,所以通过
课程ID获取课程名字,课程ID可以从Feign获取
QuestionAdminPageQuery.getCourseName是课程名称的关键字
课程ID可以从Feign获取:接受课程关键字,搜ES

public PageDTO<QuestionAdminVO> getInterationQuestionByAdminPage(QuestionAdminPageQuery pageQuery) {// 如果用户传了课程名称参数,则从es中获取该名称对应的课程idList<Long> courseIdList = null;if (StringUtils.isNotBlank(pageQuery.getCourseName())) {// feign远程调用,从es中获取该名称对应的课程idcourseIdList = searchClient.queryCoursesIdByName(pageQuery.getCourseName());// 判断查询结果是否为空if (CollUtil.isEmpty(courseIdList)) {return PageDTO.empty(0L, 0L);}}// 查询互动问题表Page<InteractionQuestion> questionPage = lambdaQuery().eq(pageQuery.getStatus() != null, InteractionQuestion::getStatus, pageQuery.getStatus()).ge(pageQuery.getBeginTime() != null, InteractionQuestion::getCreateTime, pageQuery.getBeginTime()).le(pageQuery.getEndTime() != null, InteractionQuestion::getCreateTime, pageQuery.getEndTime()).in(!CollUtil.isEmpty(courseIdList), InteractionQuestion::getCourseId, courseIdList)   // 实现课程名称模糊查询.page(pageQuery.toMpPageDefaultSortByCreateTimeDesc());// 查询到的列表为空,则返回空集List<InteractionQuestion> records = questionPage.getRecords();if (CollUtil.isEmpty(records)) {return PageDTO.of(questionPage, Collections.emptyList());}// 这里用for循环而不是Stream流,减少循环次数Set<Long> userIds = new HashSet<>();Set<Long> courseIds = new HashSet<>();Set<Long> chapterAndSections = new HashSet<>();for (InteractionQuestion question : records) {userIds.add(question.getUserId());courseIds.add(question.getCourseId());chapterAndSections.add(question.getChapterId());chapterAndSections.add(question.getSectionId());}// feign远程调用用户服务,获取用户信息List<UserDTO> userDTOS = userClient.queryUserByIds(userIds);if (CollUtil.isEmpty(userDTOS)) {throw new BizIllegalException("用户不存在");}Map<Long, UserDTO> userMap = userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, userDTO -> userDTO));// feign远程调用课程服务,获取课程信息List<CourseSimpleInfoDTO> courseDTOs = courseClient.getSimpleInfoList(courseIds);if (CollUtil.isEmpty(courseDTOs)) {throw new BizIllegalException("课程不存在");}Map<Long, CourseSimpleInfoDTO> courseMap = courseDTOs.stream().collect(Collectors.toMap(CourseSimpleInfoDTO::getId, courseDTO -> courseDTO));// feign远程调用课程服务,获取章节信息List<CataSimpleInfoDTO> catalogueDTOs = catalogueClient.batchQueryCatalogue(chapterAndSections);if (CollUtil.isEmpty(catalogueDTOs)) {throw new BizIllegalException("章节不存在");}// 封装为章节id,章节名称(需要根据章节id赋值章节名称)Map<Long, String> catalogueMap = catalogueDTOs.stream().collect(Collectors.toMap(CataSimpleInfoDTO::getId, CataSimpleInfoDTO::getName));// 封装VO并返回List<QuestionAdminVO> voList = new ArrayList<>();for (InteractionQuestion record : records) {QuestionAdminVO questionAdminVO = BeanUtils.copyBean(record, QuestionAdminVO.class);UserDTO userDTO = userMap.get(record.getUserId());if (userDTO != null) {questionAdminVO.setUserName(userDTO.getName());  // 用户昵称}CourseSimpleInfoDTO courseDTO = courseMap.get(record.getCourseId());if (courseDTO != null) {questionAdminVO.setCourseName(courseDTO.getName());    // 课程名称// 获取课程的三级分类id,根据三级分类id拼接分类名称String categoryName = categoryCache.getCategoryNames(courseDTO.getCategoryIds());questionAdminVO.setCategoryName(categoryName);  // 课程所述分类名称}// 使用getOrDefault防止异常questionAdminVO.setChapterName(catalogueMap.getOrDefault(record.getChapterId(), ""));   // 章节名称questionAdminVO.setSectionName(catalogueMap.getOrDefault(record.getSectionId(), ""));   // 小节名称voList.add(questionAdminVO);}return PageDTO.of(questionPage, voList);}

三级分类

在这里插入图片描述
表里设置parent_id代表上级是谁
在这里插入图片描述
都是IT-互联网下面的二级分类(红框里的)
因为分类信息的改动量比较小,一般都不会动了,所以就缓存起来

  • 课程分类数据在很多业务中都需要查询,这样的数据如此频繁的查询,有没有性能优化的办法呢?

3.6.5.2.多级缓存

相信很多同学都能想到借助于Redis缓存来提高性能,减少数据库压力。非常好!不过,Redis虽然能提高性能,但每次查询缓存还是会增加网络带宽消耗,也会存在网络延迟。

而分类数据具备两大特点:

  • 数据量小
  • 长时间不会发生变化。

像这样的数据,除了建立Redis缓存以外,还非常适合做本地缓存(Local Cache)。这样就可以形成多级缓存机制:

  • 数据查询时优先查询本地缓存
  • 本地缓存不存在,再查询Redis缓存
  • Redis不存在,再去查询数据库。

本地缓存简单来说就是JVM内存的缓存,比如你建立一个HashMap,把数据库查询的数据存入进去。以后优先从这个HashMap查询,一个本地缓存就建立好了。
本地缓存由于无需网络查询,速度非常快。不过由于上述缺点,本地缓存往往适用于数据量小、更新不频繁的数据。而课程分类恰好符合。

3.6.5.3.Caffeine

当然,我们真正创建本地缓存的时候并不是直接使用HashMap之类的集合,因为维护起来不太方便。而且内存淘汰机制实现起来也比较麻烦。
所以,我们会使用成熟的框架来完成,比如Caffeine:
Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。
在这里插入图片描述
在这里插入图片描述
第二次get就不会执行了

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder().maximumSize(1) // 设置缓存大小上限为 1.build();
  • 基于时间:设置缓存的有效时间
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()// 设置缓存有效期为 10 秒,从最后一次写入开始计时 .expireAfterWrite(Duration.ofSeconds(10)) .build();
Caffeine.newBuilder().initialCapacity(1) // 初始容量 缓存初始化时会分配足够的内存来存储1个键值对。.maximumSize(10_000) // 最大容量 缓存最多可以存储10,000个键值对。.expireAfterWrite(Duration.ofMinutes(30)) // 指定了缓存项在写入后多长时间过期。Duration.ofMinutes(30)是一个静态方法,用于创建一个表示30分钟的时间持续对象.build();

和上面明星例子一样,如果缓存没有则远程调用获取放到缓存中 下次30分钟查 直接返回【一级分类id、二级分类id、三级分类id】:

public Map<Long, CategoryBasicDTO> getCategoryMap() {return categoryCaches.get("CATEGORY", key -> {// 1.从CategoryClient查询List<CategoryBasicDTO> list = categoryClient.getAllOfOneLevel();if (list == null || list.isEmpty()) {return CollUtils.emptyMap();}return list.stream().collect(Collectors.toMap(CategoryBasicDTO::getId, Function.identity()));});
}

拼接三级分类名称,用/分隔:

 /*** 根据三级分类id拼接三级分类名称* @param ids   一级分类id、二级分类id、三级分类id* @return  拼接三级分类名称,用/分隔*/public String getCategoryNames(List<Long> ids) {if (ids == null || ids.size() == 0) {return "";}// 1.读取分类缓存Map<Long, CategoryBasicDTO> map = getCategoryMap();// 2.根据id查询分类名称并组装StringBuilder sb = new StringBuilder();for (Long id : ids) {sb.append(map.get(id).getName()).append("/");}// 3.返回结果return sb.deleteCharAt(sb.length() - 1).toString();}

调用:

questionAdminVO.setCourseName(courseDTO.getName());    // 课程名称
// 获取课程的三级分类id,根据三级分类id拼接分类名称
String categoryName = categoryCache.getCategoryNames(courseDTO.getCategoryIds());
questionAdminVO.setCategoryName(categoryName);  // 课程所述分类名称

SpringBoot的自动加载机制启动缓存生效这一系列流程:

在这里插入图片描述

Feign客户端的实现类是由Feign在运行时动态生成的,你不需要手动编写实现类。只要你的项目配置正确,Feign会自动处理接口的实现,并通过HTTP请求调用远程服务。

在这里插入图片描述

TODO:使用Caffeine作为本地缓存,另外使用redis或者memcache作为分布式缓存,构造多级缓存体系

在这里插入图片描述

4.评论相关接口

目标效果

回答
评论是 回答下面的
在这里插入图片描述

新增回答或评论

在这里插入图片描述

@Data
@ApiModel(description = "互动回答信息")
public class ReplyDTO {@ApiModelProperty("回答内容")@NotNull(message = "回答内容不能为空")private String content;@ApiModelProperty("是否匿名提问")private Boolean anonymity;@ApiModelProperty("互动问题id")@NotNull(message = "问题id不能为空")private Long questionId;// 该字段为null,表示是回答;否则表示评论@ApiModelProperty("回复的上级回答id,没有可不填")private Long answerId;@ApiModelProperty("回复的目标回复id,没有可不填")private Long targetReplyId;@ApiModelProperty("回复的目标用户id,没有可不填")private Long targetUserId;@ApiModelProperty("标记是否是学生提交的回答,默认true")private Boolean isStudent = true;
}
@Transactional
public void addReply(ReplyDTO replyDTO) {// 拷贝实体InteractionReply reply = BeanUtil.toBean(replyDTO, InteractionReply.class);if (reply.getAnswerId() == null) {   // 当前是回答的话,不需要target_user_id字段reply.setTargetUserId(null);}// 获取当前登录用户Long userId = UserContext.getUser();reply.setUserId(userId);// 保存评论或回答this.save(reply);// 查询关联的问题InteractionQuestion question = questionMapper.selectById(reply.getQuestionId());if (question == null) {throw new BizIllegalException("参数异常");}// 根据answerId是否为null判断是回答还是评论,如果是需要在`interaction_question`中记录最新一次回答的idif (reply.getAnswerId() == null) {    // answerId为null表示当前是回答question.setLatestAnswerId(reply.getId());  // 更新问题的最新回答idquestion.setAnswerTimes(question.getAnswerTimes() + 1);   // 该问题的回答数量+1} else {     // 如果是评论// 获取评论关联的回答InteractionReply interactionReply = this.getById(reply.getAnswerId());interactionReply.setReplyTimes(interactionReply.getReplyTimes() + 1);   // 该回答的评论数量+1// 更新评论关联的回答this.updateById(interactionReply);}// 如果是学生提交,则需要更新问题状态为未查看if (replyDTO.getIsStudent()) {question.setStatus(QuestionStatus.UN_CHECK);}// 更新问题questionMapper.updateById(question);// 发送MQ消息,新增积分rabbitMqHelper.send(MqConstants.Exchange.LEARNING_EXCHANGE,MqConstants.Key.WRITE_REPLY,SignInMessage.of(userId,5));    // 一个问题+5积分}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重拾Python学习,先从把python删除开始。。。

自己折腾就是不行啊&#xff0c;屡战屡败&#xff0c;最近终于找到前辈教我 第一步 删除Python 先把前阵子折腾的WSL和VScode删掉。还是得用spyder&#xff0c;跟matlab最像&#xff0c;也最容易入手。 从VScode上搞python&#xff0c;最后安装到appdata上&#xff0c;安装插…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

flutter 装饰类【BoxDecoration】

装饰类 BoxDecoration BoxDecoration 是 Flutter 中用于控制 Container 等组件外观的装饰类&#xff0c;它提供了丰富的属性来设置背景、边框、圆角、阴影等样式。 BoxDecoration 的主要属性 1.color 背景颜色。类型&#xff1a;Color?示例&#xff1a; color: Colors.blu…

Datawhale-self-llm-Phi-4 Langchain接入教程

本项目是一个围绕开源大模型、针对国内初学者、基于 AutoDL 平台的中国宝宝专属大模型教程&#xff0c;针对各类开源大模型提供包括环境配置、本地部署、高效微调等技能在内的全流程指导&#xff0c;简化开源大模型的部署、使用和应用流程&#xff0c;让更多的普通学生、研究者…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)

本文项目编号 T 141 &#xff0c;文末自助获取源码 \color{red}{T141&#xff0c;文末自助获取源码} T141&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

NVIDIA发布个人超算利器project digital,标志着ai元年的开启

上图NVIDIA公司创始人兼首席执行官 黄仁勋&#xff08;Jensen Huang&#xff09; 这些年被大家熟知的赛博朋克风格一直都是未来的代言词&#xff0c;可以承载人类记忆的芯片&#xff0c;甚至能独立思考的仿生人&#xff0c;现在&#xff0c;随着NVIDIA的project digital发布之后…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(六)

文章目录 一、考试管理模块实现1、添加考试功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、考试管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下载…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

SpringMVC (2)

目录 1. RequestMapping 注解介绍 2. RequestMapping 使用 3. RequestMapping与请求方式 3.1 RequestMapping 支持Get和Post类型的请求 3.2 RequestMapping 指定接收某种请求 3.3 GetMapping和PostMapping 4. 传参 4.1 通过查询字符串传参 4.2 在 Body 中传参 4.2.1 …

RPA赋能内容创作:打造小红书入门词语图片的全自动化流程

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 用RPA全自动化批量生产【入门词语】图片做小红书商单&#xff0c;保姆级工具开发教程 最近由…

css 实现自定义虚线

需求&#xff1a; ui 画的图是虚线&#xff0c;但是虚线很宽正常的border 参数无法做到 进程&#xff1a; 尝试使用 border&#xff1a;1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单&#xff0c;让ui 画一个图然…

【机器学习实战入门】使用Python进行MNIST手写数字识别

什么是手写数字识别&#xff1f; 手写数字识别是计算机识别手写数字的能力。这对手工制造的设备来说是一个难题&#xff0c;因为手写数字并不完美&#xff0c;且人们书写数字的方式多种多样。手写数字识别旨在解决这一问题&#xff0c;通过使用数字的图像来识别该图像中的数字…

hive连接mysql报错:Unknown version specified for initialization: 3.1.0

分享下一些报错的可能原因吧 1.要开启hadoop 命令&#xff1a;start-all.sh 2.检查 hive-site.xml 和 hive-env.sh。 hive-site.xml中应设置自己mysql的用户名和密码 我的hive-site.xml如下&#xff1a; <configuration><property><name>javax.jdo.opt…

反转字符串中的单词 II:Swift 实现与详解

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

51c大模型~合集106

我自己的原文哦~ https://blog.51cto.com/whaosoft/13115290 #GPT-5、 Opus 3.5为何迟迟不发 新猜想&#xff1a;已诞生&#xff0c;被蒸馏成小模型来卖 「从现在开始&#xff0c;基础模型可能在后台运行&#xff0c;让其他模型能够完成它们自己无法完成的壮举——就像一个老…