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

news2025/3/1 15:10:58

【云岚到家】-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> {

    @Resource
    private 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> {

    @Resource
    private 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
     */
    @Override
    public 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
     */

    @Override
    public 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.同步数据到es
    ServeSyncUpdateReqDTO 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.同步数据到es
    ServeSyncUpdateReqDTO 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 {
    @Resource
    private ElasticSearchTemplate elasticSearchTemplate;


    /**
     * 查询服务列表
     *
     * @param cityCode    城市编码
     * @param serveTypeId 服务类型id
     * @param keyword     关键词
     * @return 服务列表
     */
    @Override
    public List<ServeSimpleResDTO> findServeList(String cityCode, Long serveTypeId, String keyword) {
        // 构造查询条件
        SearchRequest.Builder builder = new SearchRequest.Builder();

        builder.query(query->query.bool(bool->{
            //匹配citycode
            bool.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->{
        //匹配citycode
        bool.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.coloradmin.cn/o/1823102.html

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

相关文章

抖店一件代发设置自动发货

工具&#xff1a;逸淘 山东逸淘软件-www.1tsoft.com-一键下单&#xff01; step1 下载插件 下载对应浏览器的插件 step2 插件安装 谷歌浏览器--右上角...--设置--扩展程序 把下载的插件从文件夹拖过来 备注&#xff1a;显示 错误 不影响使用 在浏览器网址右边--把插件固定…

香港优才自测140分,带36万+申请香港优才身份被拒了

最近又有一个朋友跟我诉说&#xff0c;一家人申请优才&#xff0c;带几十万yi民香港&#xff0c;还被拒了&#xff0c;真的好气&#xff01; 费心费力等一年以上才收到拒批通知了&#xff0c;被拒的朋友有因为资料准备不足的&#xff0c;有因为错误自测分数给入境处过高期望的&…

【数据结构初阶】--- 栈和队列

栈 栈的定义 栈&#xff1a;只允许在一端进行插入或删除的操作 事实上&#xff0c;线性表和链表都可以实现栈&#xff0c;但栈的特点更符合用顺序表实现 顺序表的队尾相当于栈顶&#xff0c;对栈放入数据&#xff0c;相当于顺序表的下标arr[index] x&#xff0c;而栈弹出数…

老爷机带不动影视后期?云桌面了解一下

从黑白到彩色&#xff0c;从默片到有声&#xff0c;从2D到3D&#xff0c;影视工业经过百余年的演变&#xff0c;每一步技术的提升都试图让影视艺术更接近“真实”。电影特效技术的诞生&#xff0c;更是为影视作品的真实感实现了一次巨大的飞跃。 但有一部分影视人&#xff0c;…

毕业年薪30W起!25届最近5年浙江大学自动化考研院校分析

浙江大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目…

流程与IT双驱动:锐捷网络如何构建持续领先的服务竞争力?

AI大模型及相关应用进入“竞赛时代”&#xff0c;算力作为关键要素备受关注&#xff0c;由于算力行业对网络设备和性能有较大需求&#xff0c;其发展也在推动ICT解决方案提供商加速升级&#xff0c;提升服务响应速度和服务质量。 锐捷网络是行业领先的ICT基础设施及行业解决方…

黄河流域web

1、UNSER的 <?php highlight_file(__FILE__); class Wel {public $fast;public $star;public function __construct(){$this->fast "free_toto";echo "what?";}public function __destruct(){$content $this->star;printf ($content);}pu…

Prometheus写入influxDB:中间件remote_storage_adapter

Prometheus写入influxDB&#xff1a;中间件remote_storage_adapter prometheus默认采用的是本地磁盘做数据存储&#xff0c;本地存储的优势就是运维简单但是缺点就是无法海量的metrics持久化和数据存在丢失的风险,数据写入可能造成wal文件损坏导致采集数据无法再写入的问题。 …

5.4.Python 装饰器与语法糖

1. 装饰器 1.1 装饰器简介 装饰器的作用: 对函数进行装饰, 添加新的功能. 装饰器的原则: 开发封闭原则, 对扩展开放, 对修改封闭. 封闭: 已现实的功能代码块不应该被修改. 开放: 对现有功能的拓展开放. 在不改变被装饰对象内部代码以及调用方式的基础上为函数添加新的功能.1.…

Java课程设计:基于swing的学生信息管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这款Java swing实现的学生信息管理系统和jsp版本的功能很相似&#xff0c;简单的实现了班级信息的增删改查&#xff0c;学生信息的增删改查&#xff0c;数据库采用的是mysql&#xff0c;jdk版本不限&…

fuel无人机自主探索代码解读3——fast_exploration_fsm.cpp【状态机】

一、概述 fast_exploration_fsm.cpp订阅实时定位和目标点信息&#xff0c;每隔0.01s执行一次状态机&#xff0c;进行状态切换&#xff1b;每隔0.05s执行一次碰撞检测&#xff0c;按需进行重新规划&#xff1b;每0.5s执行一次边界回调定时器&#xff0c;对于处于WAIT_TRIGGER和…

nacos注册中心配置中心

文章目录 1.Nacos安装与简单使用1.1. Nacos安装指南Windows安装下载安装包解压端口配置启动访问 Linux安装安装JDK上传安装包解压端口配置启动 1.2.服务注册到nacos使用步骤引入依赖配置nacos地址重启 示例父工程pom.xmluser-servicepom.xmlapplication.ymlUserApplicationUser…

杨校老师项目之基于SpringBoot的理发店的预约管理系统

原系统是SSMJSP页面构成&#xff0c;先被修改为SpringBoot JSP页面 自助下载渠道: https://download.csdn.net/download/kese7952/89417001&#xff0c;或 点我下载 理发师信息&#xff1a; 理发师详细信息 公告信息 员工登录&#xff1a; 管理员登录

Python的网络请求

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在上一节中多次提到了URL地址与下载网页&#xff0c;这两项是网络爬虫必备而又关键的功能&#xff0c;说到这两个功能必然会提到HTTP。本节将介绍在P…

关于投标中的合理均价基准差径靶心法(KIMI回答)

投标中的合理靶心法到底是什么呢&#xff1f;用了KIMI来进行回答&#xff1a;

python-jenkins调用流水线设置“丢弃旧的构建”(discard old builds)

背景 Jenkins任务执行&#xff0c;随之构建次数增多&#xff0c;构建日志所占磁盘大小不断增大&#xff0c;需要配置清除策略。 而 discard old builds 就是配置丢弃旧的构建&#xff1b;若是我们使用python-jenkins 调用修改配置该如何设置&#xff1f; 调用设置 这里是按…

液晶拼接屏企业应该采取哪些措施来提升整体竞争力和市场地位呢?

步入智能科技时代以来&#xff0c;商显行业面对着各式各样的挑战&#xff0c;人工智能、AI大模型等整合中&#xff0c;液晶拼接屏企业应该采取哪些措施以提升整体竞争力和市场地位。下面小编个人观点简单说一下&#xff1b;下是一些关键的措施&#xff1a; 首先&#xff0c;加…

web端即时通信技术

web端即时通信技术 对于IM/消息推送这类即时通讯系统而言&#xff0c;系统的关键就是“实时通信”能力。所谓实时通信有以下两层含义 客户端可以主动向服务端发送信息。 当服务端内容发生变化时&#xff0c;服务端可以实时通知客户端。 HTTP局限 Http是客户端/服务器模式中…

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…

Android 13 高通设备热点低功耗模式(2)

前言 之前写过一篇文章:高通热点被IOS设备识别为低数据模式,该功能仿照小米的低数据模式写的,散发的热点可以达到被IOS和小米设备识别为低数据模式。但是发现IOS设备如果后台无任何网络请求的时候,息屏的状态下过一会,会自动断开热点的连接。 分析 抓取设备的热点相关的…