【云岚到家】-day04-2-索引同步-搜索接口

【云岚到家】-day04-2-索引同步-搜索接口

  • 1 索引同步
    • 1.1 编写同步程序
      • 1.1.1 创建索引结构
      • 1.1.2 编写同步程序
        • 1.1.2.1 添加依赖
        • 1.1.2.2 配置连接ES
        • 1.1.2.3 编写同步程序
      • 1.1.3 测试
      • 1.1.4 小结
        • 1.1.4.1 如何保证Canal+MQ同步消息的顺序性?
        • 1.1.4.2 如何保证只有一个消费者接收消息?
    • 1.2 管理同步表
      • 1.2.1 管理同步表需求
      • 1.2.2 代码实现
        • 1.2.2.1 区域服务上架向serve_sync表添加记录
        • 1.2.2.2 区域服务下架从serve_sync表删除记录
        • 1.2.2.3 修改服务项修改serve_sync的记录
        • 1.2.2.4 修改服务分类修改serve_sync的记录
      • 1.2.3 测试
  • 2 搜索接口
    • 2.1 定义接口
    • 2.2 搜索方法
    • 2.3 service
    • 2.4 controller
    • 2.5 测试
  • 3 完善搜索接口-实战
    • 3.1 完善es搜索条件
    • 3.2 测试


1 索引同步

1.1 编写同步程序

刚才通过配置Canal+MQ的数据同步环境实现了Canal从数据库读取binlog并且将数据写入MQ。

下边编写同步程序监听MQ,收到消息后向ES创建索引。

1.1.1 创建索引结构

启动ES和kibana:

安装完成后进行启动:

docker start elasticsearch7.17.7 
docker start kibana7.17.7

下边创建索引serve_aggregation,serve_aggregation索引的结构与jzo2o-foundations数据库的serve_sync表结构对应。

首先通过下边的命令查询索引

GET /_cat/indices?v 

在这里插入图片描述

如果需要修改索引结构需要删除重新创建:

DELETE 索引名

查询索引结构

GET /索引名/_mapping

因为我们canal同步的是serve_sync表,所以按照serve_sync表创建serve_aggregation索引 (已经存在无法重复创建)

PUT /serve_aggregation
{"mappings" : {"properties" : {"city_code" : {"type" : "keyword"},"detail_img" : {"type" : "text","index" : false},"hot_time_stamp" : {"type" : "long"},"id" : {"type" : "keyword"},"is_hot" : {"type" : "short"},"price" : {"type" : "double"},"serve_item_icon" : {"type" : "text","index" : false},"serve_item_id" : {"type" : "keyword"},"serve_item_img" : {"type" : "text","index" : false},"serve_item_name" : {"type" : "text","analyzer": "ik_max_word","search_analyzer":"ik_smart"},"serve_item_sort_num" : {"type" : "short"},"serve_type_icon" : {"type" : "text","index" : false},"serve_type_id" : {"type" : "keyword"},"serve_type_img" : {"type" : "text","index" : false},"serve_type_name" : {"type" : "text","analyzer": "ik_max_word","search_analyzer":"ik_smart"},"serve_type_sort_num" : {"type" : "short"}}}
}

1.1.2 编写同步程序

1.1.2.1 添加依赖

首先在foundations工程添加下边的依赖

<dependency><groupId>com.jzo2o</groupId><artifactId>jzo2o-canal-sync</artifactId>
</dependency>
<dependency><groupId>com.jzo2o</groupId><artifactId>jzo2o-es</artifactId>
</dependency>

在这里插入图片描述

1.1.2.2 配置连接ES

修改foundations的配置文件:

在这里插入图片描述

修改nacos中es的配置文件

在这里插入图片描述

修改nacos中rabbitmq的配置文件

在这里插入图片描述

1.1.2.3 编写同步程序

创建com.jzo2o.foundations.handler.ServeCanalDataSyncHandler类,同步程序继承AbstractCanalRabbitMqMsgListener类,泛型中指定同步表对应的类型。

不仅可以同步mysql与es,也可以同步mysql和redis

根据数据同步环境去配置监听MQ:

@Component
public class ServeCanalDataSyncHandler extends AbstractCanalRabbitMqMsgListener<ServeSync> {@Resourceprivate ElasticSearchTemplate elasticSearchTemplate;//@RabbitListener(queues = "canal-mq-jzo2o-foundations", concurrency = "1")@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "canal-mq-jzo2o-foundations"),exchange = @Exchange(name = "exchange.canal-jzo2o", type = ExchangeTypes.TOPIC),key = "canal-mq-jzo2o-foundations"),concurrency = "1")public void onMessage(Message message) throws Exception {}

concurrency = "1":表示消费线程数为1。

AbstractCanalRabbitMqMsgListener是jzo2o-canal-sync模块中的,在同步程序中需要根据业务需求编写同步方法,当服务下架时会删除索引需要重写抽象类中的batchDelete(List<Long> ids)方法,此方法是当删除Serve_sync表的记录时 对索引执行删除操作。

当服务上架后需要添加索引,当服务信息修改时需要修改索引,需要重写抽象类中的batchSave(List<ServeSync> data)方法,此方法是当向Serve_sync表新增或修改记录时对索引执行添加及修改操作。

完整代码:

@Component
public class ServeCanalDataSyncHandler extends AbstractCanalRabbitMqMsgListener<ServeSync> {@Resourceprivate ElasticSearchTemplate elasticSearchTemplate;/*** 监听canal-mq-jzo2o-foundations队列* @param message* @throws Exception*/@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "canal-mq-jzo2o-foundations"),exchange = @Exchange(name = "exchange.canal-jzo2o", type = ExchangeTypes.TOPIC),key = "canal-mq-jzo2o-foundations"),concurrency = "1")public void onMessage(Message message) throws Exception {//解析消息后才会调用batchSave或batchDelete方法parseMsg(message);}/*** 向es中批量保存数据,解析binlog中的add、update都会调用此方法* @param data*/@Overridepublic void batchSave(List<ServeSync> data) {Boolean aBoolean = elasticSearchTemplate.opsForDoc().batchInsert(IndexConstants.SERVE, data);if(!aBoolean){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}throw new RuntimeException("同步失败");}}/*** 向es中批量删除数据,解析binlog中的delete都会调用此方法* @param ids*/@Overridepublic void batchDelete(List<Long> ids) {Boolean aBoolean = elasticSearchTemplate.opsForDoc().batchDelete(IndexConstants.SERVE, ids);if(!aBoolean){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}throw new RuntimeException("同步失败");}}
}

1.1.3 测试

启动jzo2o-foundations服务。

启动成功,jzo2o-foundations服务作为MQ的消费者和MQ建立通道,进入canal-mq-jzo2o-foundations队列的管理界面,查看是否建立了监听通道。

在这里插入图片描述

监听通道建立成功,下边在同步程序打断点:

在这里插入图片描述

手动修改jzo2o-foundations数据库的serve_sync表的记录,这里修改了服务项的名称

在这里插入图片描述

正常执行同步程序:

在这里插入图片描述

放行继续执行到batchSave方法:

在这里插入图片描述

保证ES服务正常,放行后吗,同步方法执行成功后进入Kibana查看

GET /serve_aggregation/_search
{
}

在这里插入图片描述

查询服务信息与数据库serve_sync表中1686352662791016449记录的信息一致。

下边再将服务项名称恢复。

在这里插入图片描述

再进入Kibana查看索引的内容与数据库一致

在这里插入图片描述

1.1.4 小结

编写同步程序的步骤:

  1. 根据数据库同步表的结构,创建索引结构。
  2. 同步程序监听MQ的同步队列
  3. 同步程序收到数据同步消息写入Elasticsearch,写的失败抛出异常,消息回到MQ。
1.1.4.1 如何保证Canal+MQ同步消息的顺序性?

场景:

如下图:

首先明确Canal解析binlog日志信息按顺序发到MQ的队列中,现在是要保证消费端如何按顺序消费队列中的消息。

生产中同一个jzo2o-foundations服务会启动多个jvm进程,每个进程作为canal-mq-jzo2o-foundations的消费者,如下图:

在这里插入图片描述

现在对服务名称先修改为aa再修改为bb,在MQ中的有两个消息:

修改服务名称为aa

修改服务名称为bb

预期:最终将服务名称修改为bb

此时两条消息会被分发给两个jvm进程,假设“修改服务名称为aa”的消息发给jvm进程1,“修改服务名称为bb”的消息发给jvm进程2,两个进程分别去消费,此时无法控制两个消息的先后顺序,可能导致服务名称最终并非修改为bb。

解决方法:

多个jvm进程监听同一个队列保证只有消费者活跃,即只有一个消费者接收消息。

消费队列中的数据使用单线程。

1.1.4.2 如何保证只有一个消费者接收消息?

把原来的删了,队列需要增加x-single-active-consumer参数,表示否启用单一活动消费者模式。

在这里插入图片描述

配置完成查保证队列上存在SAC标识,如下图:

在这里插入图片描述

当有多个jvm进程都去监听该队列时,只有一个为活跃状态

在这里插入图片描述

如果使用x-single-active-consumer参数需要修改为如下代码:

在Queue中添加:

arguments={@Argument(name="x-single-active-consumer", value = "true", type = "java.lang.Boolean") }

如下所示:

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "canal-mq-jzo2o-foundations",arguments={@Argument(name="x-single-active-consumer", value = "true", type = "java.lang.Boolean") }),exchange = @Exchange(name="exchange.canal-jzo2o",type = ExchangeTypes.TOPIC),key="canal-mq-jzo2o-foundations"),concurrency="1"
)
public void onMessage(Message message) throws Exception{parseMsg(message);
}

concurrency=”1“表示保证一个jvm中消费线程为1。

arguments={@Argument(name="x-single-active-consumer", value = "true", type = "java.lang.Boolean") }保证mq队列只让一个jvm干活

两个参数共同的保证了同步消息的顺序性。

1.2 管理同步表

通过测试Canal+MQ同步流程,只有当serve_sync表变化时才会触发同步,serve_sync表什么时候变化 ?

当服务信息变更时需要同时修改serve_sync表,下边先分析serve_sync的变化需求,再进行代码实现。

1.2.1 管理同步表需求

现在如何去维护serve_sync这张表呢?

根据serve_sync表的结构分析:

添加:区域服务上架向serve_sync表添加记录,同步程序新增索引记录。

删除:区域服务下架从serve_sync表删除记录,同步程序删除索引记录。

修改:

修改服务项修改serve_sync的记录。

修改服务分类修改serve_sync的记录。

修改服务价格修改serve_sync的记录。

设置热门/取消热门修改serve_sync的记录。

1.2.2 代码实现

1.2.2.1 区域服务上架向serve_sync表添加记录

在ServeServiceImpl增加私有方法,如下:

/*** 新增服务同步数据** @param serveId 服务id*/
private void addServeSync(Long serveId) {//服务信息Serve serve = baseMapper.selectById(serveId);//区域信息Region region = regionMapper.selectById(serve.getRegionId());//服务项信息ServeItem serveItem = serveItemMapper.selectById(serve.getServeItemId());//服务类型ServeType serveType = serveTypeMapper.selectById(serveItem.getServeTypeId());ServeSync serveSync = new ServeSync();serveSync.setServeTypeId(serveType.getId());serveSync.setServeTypeName(serveType.getName());serveSync.setServeTypeIcon(serveType.getServeTypeIcon());serveSync.setServeTypeImg(serveType.getImg());serveSync.setServeTypeSortNum(serveType.getSortNum());serveSync.setServeItemId(serveItem.getId());serveSync.setServeItemIcon(serveItem.getServeItemIcon());serveSync.setServeItemName(serveItem.getName());serveSync.setServeItemImg(serveItem.getImg());serveSync.setServeItemSortNum(serveItem.getSortNum());serveSync.setUnit(serveItem.getUnit());serveSync.setDetailImg(serveItem.getDetailImg());serveSync.setPrice(serve.getPrice());serveSync.setCityCode(region.getCityCode());serveSync.setId(serve.getId());serveSync.setIsHot(serve.getIsHot());serveSyncMapper.insert(serveSync);
}

修改服务上架的方法:

@Override
@Transactional
@CachePut(value = RedisConstants.CacheName.SERVE, key = "#id",  cacheManager = RedisConstants.CacheManager.ONE_DAY)
public Serve onSale(Long id){...//添加同步表addServeSync(id);return baseMapper.selectById(id);}
1.2.2.2 区域服务下架从serve_sync表删除记录

在这里插入图片描述

1.2.2.3 修改服务项修改serve_sync的记录

在com.jzo2o.foundations.service.impl.ServeItemServiceImpl#update中

@Override
@Transactional
@CachePut(value = RedisConstants.CacheName.SERVE_ITEM, key = "#id", unless = "#result.activeStatus != 2", cacheManager = RedisConstants.CacheManager.ONE_DAY)
public ServeItem update(Long id, ServeItemUpsertReqDTO serveItemUpsertReqDTO) {//1.更新服务项ServeItem serveItem = BeanUtil.toBean(serveItemUpsertReqDTO, ServeItem.class);serveItem.setId(id);baseMapper.updateById(serveItem);//2.同步数据到esServeSyncUpdateReqDTO serveSyncUpdateReqDTO = BeanUtil.toBean(serveItemUpsertReqDTO, ServeSyncUpdateReqDTO.class);serveSyncUpdateReqDTO.setServeItemName(serveItemUpsertReqDTO.getName());serveSyncUpdateReqDTO.setServeItemImg(serveItemUpsertReqDTO.getImg());serveSyncUpdateReqDTO.setServeItemIcon(serveItemUpsertReqDTO.getServeItemIcon());serveSyncUpdateReqDTO.setServeItemSortNum(serveItemUpsertReqDTO.getSortNum());serveSyncService.updateByServeItemId(id, serveSyncUpdateReqDTO);//用于更新缓存return baseMapper.selectById(id);
}
1.2.2.4 修改服务分类修改serve_sync的记录

在com.jzo2o.foundations.service.impl.ServeTypeServiceImpl#update中

@Override
public void update(Long id, ServeTypeUpsertReqDTO serveTypeUpsertReqDTO) {//1.更新服务类型ServeType serveType = BeanUtil.toBean(serveTypeUpsertReqDTO, ServeType.class);serveType.setId(id);baseMapper.updateById(serveType);//2.同步数据到esServeSyncUpdateReqDTO serveSyncUpdateReqDTO = new ServeSyncUpdateReqDTO();serveSyncUpdateReqDTO.setServeTypeName(serveTypeUpsertReqDTO.getName());serveSyncUpdateReqDTO.setServeTypeImg(serveTypeUpsertReqDTO.getImg());serveSyncUpdateReqDTO.setServeTypeIcon(serveTypeUpsertReqDTO.getServeTypeIcon());serveSyncUpdateReqDTO.setServeTypeSortNum(serveTypeUpsertReqDTO.getSortNum());serveSyncService.updateByServeTypeId(id, serveSyncUpdateReqDTO);
}

1.2.3 测试

启动gateway、public、foundations、admin前端

在服务项中添加码农洗车

在这里插入图片描述

在这里插入图片描述

启用之后,再让某个区域添加该服务后上架,就会让canal同步到es,点击启用后让北京市添加进去并且上架

在这里插入图片描述

查看es,成功查询到码农洗车

在这里插入图片描述

2 搜索接口

2.1 定义接口

参数内容:区域编码,服务类型id、关键字

区域编码:用户定位成功前端记录区域编码(city_code),搜索时根据city_code搜索该区域的服务。

服务类型id:在全部服务界面选择一个服务类型查询其它下的服务列表。

关键字:输入关键字搜索服务项名称、服务类型名称。

接口名称:服务搜索接口

接口路径:GET/foundations/customer/serve/search

在这里插入图片描述

在这里插入图片描述

编写controller方法:

在com.jzo2o.foundations.controller.consumer.FirstPageServeController中

/*** 首页服务搜索* @param cityCode* @param serveTypeId* @param keyword* @return*/
@GetMapping("/search")
@ApiOperation("首页服务搜索")
@ApiImplicitParams({@ApiImplicitParam(name = "cityCode", value = "城市编码", required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "serveTypeId", value = "服务类型id", dataTypeClass = Long.class),@ApiImplicitParam(name = "keyword", value = "关键词", dataTypeClass = String.class)
})
public List<ServeSimpleResDTO> findServeList(@RequestParam("cityCode") String cityCode,@RequestParam(value = "serveTypeId", required = false) Long serveTypeId,@RequestParam(value = "keyword", required = false) String keyword) {return null;
}

2.2 搜索方法

首先通过ES的查询语言进行查询,如下

GET /serve_aggregation/_search
{"query" : {"bool" : {"must" : [{"term" : {"city_code" : {"value" : "010"}}},{"multi_match" : {"fields" : [ "serve_item_name", "serve_type_name" ],"query" : "保洁"}}]}},"sort" : [{"serve_item_sort_num" : {"order" : "asc"}}]
}

2.3 service

下边按照ES查询语句编写service方法:

创建com.jzo2o.foundations.service.ServeAggregationService,定义service接口:

public interface ServeAggregationService {/*** 查询服务列表** @param cityCode    城市编码* @param serveTypeId 服务类型id* @param keyword     关键词* @return 服务列表*/List<ServeSimpleResDTO> findServeList(String cityCode, Long serveTypeId, String keyword);
}

service实现类

@Slf4j
@Service
public class ServeAggregationServiceImpl implements ServeAggregationService {@Resourceprivate ElasticSearchTemplate elasticSearchTemplate;/*** 查询服务列表** @param cityCode    城市编码* @param serveTypeId 服务类型id* @param keyword     关键词* @return 服务列表*/@Overridepublic List<ServeSimpleResDTO> findServeList(String cityCode, Long serveTypeId, String keyword) {// 构造查询条件SearchRequest.Builder builder = new SearchRequest.Builder();builder.query(query->query.bool(bool->{//匹配citycodebool.must(must->must.term(term->term.field("city_code").value(cityCode)));//todo 匹配服务类型//匹配关键字if(ObjectUtils.isNotEmpty(keyword)){bool.must(must->must.multiMatch(multiMatch->multiMatch.fields("serve_item_name","serve_type_name").query(keyword)));}return bool;}));// 排序 按服务项的serveItemSortNum排序(升序)List<SortOptions> sortOptions = new ArrayList<>();sortOptions.add(SortOptions.of(sortOption -> sortOption.field(field->field.field("serve_item_sort_num").order(SortOrder.Asc))));builder.sort(sortOptions);//指定索引builder.index("serve_aggregation");//请求对象SearchRequest searchRequest = builder.build();// 检索数据SearchResponse<ServeAggregation> searchResponse = elasticSearchTemplate.opsForDoc().search(searchRequest, ServeAggregation.class);//如果搜索成功返回结果集if (SearchResponseUtils.isSuccess(searchResponse)) {List<ServeAggregation> collect = searchResponse.hits().hits().stream().map(hit -> {ServeAggregation serve = hit.source();return serve;}).collect(Collectors.toList());List<ServeSimpleResDTO> serveSimpleResDTOS = BeanUtil.copyToList(collect, ServeSimpleResDTO.class);return serveSimpleResDTOS;}return  Collections.emptyList();}
}

es新版本全部采用此方法编写查询语句。

2.4 controller

完善controller方法

@GetMapping("/search")
@ApiOperation("首页服务搜索")
@ApiImplicitParams({@ApiImplicitParam(name = "cityCode", value = "城市编码", required = true, dataTypeClass = String.class),@ApiImplicitParam(name = "serveTypeId", value = "服务类型id", dataTypeClass = Long.class),@ApiImplicitParam(name = "keyword", value = "关键词", dataTypeClass = String.class)
})
public List<ServeSimpleResDTO> findServeList(@RequestParam("cityCode") String cityCode,@RequestParam(value = "serveTypeId", required = false) Long serveTypeId,@RequestParam(value = "keyword", required = false) String keyword) {List<ServeSimpleResDTO> serveList = serveAggregationService.findServeList(cityCode, serveTypeId, keyword);return serveList;
}

2.5 测试

启动public、customer、foundations、gateway、小程序

码农洗车赫然在列

在这里插入图片描述

搜索框输入保洁

在这里插入图片描述

测试成功

3 完善搜索接口-实战

3.1 完善es搜索条件

在com.jzo2o.foundations.service.impl.ServeAggregationServiceImpl#findServeList中匹配服务类型

@Override
public List<ServeSimpleResDTO> findServeList(String cityCode, Long serveTypeId, String keyword) {// 构造查询条件SearchRequest.Builder builder = new SearchRequest.Builder();builder.query(query->query.bool(bool->{//匹配citycodebool.must(must->must.term(term->term.field("city_code").value(cityCode)));//匹配服务类型if(ObjectUtils.isNotEmpty(serveTypeId)){bool.must(must->must.term(term->term.field("serve_type_id").value(serveTypeId)));}

3.2 测试

在这里插入图片描述

非常完美

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

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

相关文章

java课设

项目简介:射击生存类小游戏 项目采用技术: 游戏引擎: Unity编程语言: Java图形处理: NVIDIA PhysX (物理引擎), HDRP (High Definition Render Pipeline)音效与音乐: FMOD, Wwise版本控制: Git 功能需求分析: 角色控制&#xff1a;玩家能够使用键盘和鼠标控制角色移动、瞄准…

基于RandLA-Net深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 RandLA-Net是一种高效、轻量级的神经网络&#xff0c;其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率&#xff0c;并采用新的局部特征聚合模块有效地保留了几何细节&#xff0c;弥补了随机…

最新下载:Folx【软件附加安装教程】

​Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器&#xff0c;Folx中文版有一个支持Retina显示的现代界面&#xff0c;提供独特的系统排序、存储下载内容与预览下载文件&#xff0c;Folx中文官网提供Folx教程、激活码、下载。 Folx友好兼容浏览器&#xff1a;如果你在网…

浅谈网络通信(3)

文章目录 一、TCP[!]1.1、TCP协议报文格式1.2、TCP十大机制1.2.1、确认应答机制1.2.2、超时重传机制1.2.3、连接管理机制1.2.3.1、三次握手[其流程至关重要&#xff0c;面试必考]1.2.3.2.1、那为啥要建立连接&#xff1f;&#xff1f;建立连接的意义是啥&#xff1f;&#xff1…

Jetson Linux 上安装ZMQ

1. 安装ZMQ 框架 apt-get install libzmq3-dev 2. 或者自己build ZMQ https://github.com/zeromq/libzmq.git 参考官网教程 3. 安装CPPZMQ CPPZMQ 是ZMQ 的友好的C封装&#xff0c;只需要一个zmq.hpp 头文件即可 git clone https://github.com/zeromq/cppzmq.git cd cppz…

Ubuntu安装部署

Ubuntu安装部署 一、Ubuntu概述1、Ubuntu介绍2、Ubuntu特点 二、Ubuntu和Centos的区别1、Centos2、Ubuntu3、Centos和Ubuntu区别 三、安装Ubuntu-Server1、Ubuntu官网2、创建新的机子3、创建名称以及虚拟机在磁盘上的位置4、Ubuntu初始化和安装 四、安装Ubuntu1、开始安装2、安…

SAP RFC 输入一张表(C# 使用 SapNwRfc 二)

SapNwRfc中的配置参数&#xff0c;记录日志关闭 Trace0&#xff0c;可以得到很好的性能。 有网友在问&#xff0c;SAP RFC返回多张表&#xff08;C# 使用 SapNwRfc 一&#xff09;中如何输入一张表的数据&#xff0c;正好博主也遇到了这个场景&#xff0c;今天做了一个DEMO&…

4D毫米波雷达技术及发展

文章目录 前言一、4D毫米波雷达是什么&#xff1f;二、毫米波雷达是什么&#xff1f;毫米波雷达的基本原理多普勒效应 三、4D毫米波雷达的基本结构3D毫米波4D毫米波对比 前言 现阶段自动驾驶技术中&#xff0c;主要用到的传感器有摄像头、激光雷达和毫米波雷达。 摄像头的光谱…

系统架构师考点--计算机硬件

大家好。今天我总结一下计算机硬件的一些考点。 一、中央处理单元&#xff08;CPU&#xff09; 我们知道&#xff0c;计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。其中运算器、控制器等部件被集成在一起统称为中央处理单元(Central Proce…

jdk17详细安装步骤

本文以Windows系统&#xff0c;JDK17版本作为示例&#xff0c;其他版本的操作步骤类似。 一、下载 进入官网后往下翻&#xff0c;找到JAVA17&#xff0c;然后点击Windows 点击下载。 二、安装 安装 JDK的安装是无脑安装&#xff0c;就是一路下一步下一步。。直到完成。默认安…

编译安装qemu-devel @FreeBSD

缘起 使用cbsd创建riscv jail的时候提示&#xff1a; you have no qemu-user, please install qemu-devle with BSD_USER and STATIC ops (emulators/qemu-devel) 使用pkg安装之后&#xff0c;创建的riscv jail启动报错&#xff1a; Starting jail: fbriscv, parallel timeo…

华为数通题库HCIP-821——最新最全(带答案解析)

单选1、下面是一台路由器的输出信息&#xff0c;关于这段信息描述正确的是 A目的网段1.1.1.0/24所携带的团体属性值是no—export表明该路由条目不能通告给任何BGP邻居 B目的网段5.1.1.0/24所携带的团体属性值是no—advertise表明该路由条目不能被通告给任何其他的BGP对等体 C…

大数据概论总结

三次信息化浪潮 : 信息技术的支撑 : 存储设备容量不断增加 CPU的处理能力不断提高 网络带宽不断增加 数据产生方式的变革促成大数据时代的来临 运营式系统阶段用户原创内容感知式系统阶段 大数据发展历程 : 分为三个阶段 : 大数据的概念 : 1 . 数据量大 : 根据IDC作出…

Unity:Text-TextMeshPro 不显示中文

共计四步&#xff1a; 一、去C盘复制一份字体&#xff1a; C:\Windows\Fonts二、粘贴到你的项目里&#xff08;任意文件位置&#xff09;&#xff0c;得到“MSYH”&#xff1a; 三、右键字体文件&#xff0c;依次点击create–>TextMeshPro–>FontAsset&#xff1a; …

Mac平台上公认的最好的下载工具Folx Pro 5 for Mac激活码

Folx是什么 Folx Pro 5 for Mac是Mac平台上公认的最好的下载工具&#xff0c;功能可以与迅雷相媲美。 Folx是一款老牌下载神器&#xff0c;可通过URL链接和种子文件下载文件&#xff0c;同时提供了便捷的下载管理和灵活的应用设置&#xff0c;Folx可以对下载的资源进行分类&a…

勒索病毒搜索引擎

360勒索病毒搜索引擎 https://lesuobingdu.360.cn/ 腾讯勒索病毒搜索引擎 https://guanjia.qq.com/pr/ls/ VenusEye勒索病毒搜索引擎 https://lesuo.venuseye.com.cn/ 奇安信勒索病毒搜索引擎 https://lesuobingdu.qianxin.com/index/getFile 深信服勒索病毒搜索引擎…

韩顺平0基础学java——第22

p460-483 常用类 包装类Wrapper 针对8种几种数据类型相应的引用类型——包装类 包装类和基本数据类型的转换 jdk5之前的手动装箱和拆箱&#xff1a; jdk5之后的自动装箱和拆箱&#xff1a; 三元运算符是一个整体&#xff1a; 这个三元运算符里&#xff0c;精度最高的是doubl…

非线性规划解决工资分配问题

来源&#xff1a;河北工业职业技术大学 安彤彤 彭金杉 张家硕 题目 薪资发放问题 一般公司给职员发放薪金&#xff0c;通常按每月等额发放。某公司即将改进薪金发放方案&#xff0c;允许任职5年以上的职员向公司财务部门申请工资每月可变额度发放&#xff0c;每月工资发放额…

嵌入式系统中常用的参数存储方法

一、有哪些参数需要管理? 在智能硬件产品中,一般有三类数据需要存储并管理: 1. 系统设置数据 系统设置数据是指产品自身正常工作所依赖的一些参数。 这类数据的特点:只能在生产过程中修改,出厂后用户无权限修改。 比如:产品 SN、产品密钥/token/license、传感器校准值…