第14天-ElasticSearch环境配置,构建检索服务及商品上架到ES库

news/2024/4/25 13:10:30/文章来源:https://blog.csdn.net/zenggeweiss/article/details/129259792

1.ElasticSearch概念

在这里插入图片描述

官网介绍:https://www.elastic.co/cn/what-is/elasticsearch/

官网学习文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html



1.1.ElasticSearch与MySQL的比较

  • MySQL有事务性,而ElasticSearch没有事务性,所以你删了的数据是无法恢复的。
  • ElasticSearch没有物理外键这个特性,如果你的数据强一致性要求比较高,还是建议慎用
  • ElasticSearch和MySql分工不同, MySQL负责存储数据, ElasticSearch负责搜索数据

在这里插入图片描述



1.2.为什么要使用Elasticsearch?

因为在我们商城中的数据,将来会非常多,所以采用以往的模糊查询,模糊查询前置配置,会丢弃索引,导致商品查询是全表扫描,在百万级别的数据库中,效率非常低下,而我们使用ES做一个全文索引,我们将经常查询的商品的某些字段,比如说商品名,描述、价格还有id这些字段我们放入我们索引库里,可以提高查询速度。



1.3.ES中核心概念

在这里插入图片描述



1.4.倒排索引机制

倒排索引:将各个文档中的内容,进行分词,形成词条。然后记录词条和数据的唯一标识(id)的对应关系,形成的产物 。

倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页。它是搜索引擎的核心。其主要目标是快速搜索从数百万文件中查找数据。

在这里插入图片描述



1.5.ElasticSearch数据的存储和搜索原理

在这里插入图片描述

在这里插入图片描述



2.Docker安装

Support Matrix:https://www.elastic.co/cn/support/matrix#matrix_compatibility

  • Elasticsearch 7.10.1 存储和检索数据
  • Kibana 7.10.1 可视化检索数据


2.1.下载镜像文件

docker pull elasticsearch:7.10.1 #存储和检索数据
docker pull kibana:7.10.1 #可视化检索数据



2.2.创建实例


2.2.1.ElasticSearch

# 查看虚拟机内存,建议调整到 4096m
free -mmkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/plugins# 修改文件夹权限
chmod -R 777 /mydata/elasticsearch/echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml# 9200 http请求端口,9300 集群节点之间通信端口
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
--restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \
-v 
/mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/el
asticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.10.1# 查看容器启动日志
docker logs elasticsearch # 容器名或容器id都可以


访问:http://192.168.139.10:9200

在这里插入图片描述

查看es所有节点:http://192.168.229.116:9200/_cat/nodes

在这里插入图片描述

2.2.2.Kibana

# 注意:http://192.168.139.10:9200 为es的http访问地址
docker run --name kibana \
--restart=always \
-e ELASTICSEARCH_HOSTS=http://192.168.139.10:9200 \
-p 5601:5601 \
-d kibana:7.10.1


访问:http://192.168.139.10:5601

在这里插入图片描述

点击 Explore on my own

在这里插入图片描述



2.3.安装Nginx


2.3.1.复制配置

启动一个Nginx实例,复制出配置

docker run -p 80:80 --name nginx -d nginx:1.18.0

将容器内的配置文件拷贝到当前目录

cd /mydata
mkdir nginx
docker container cp nginx:/etc/nginx .

停止并删除容器

docker stop nginx
docker rm nginx

修改文件名称

mv nginx conf

mkdir nginx

mv conf/ nginx/


2.3.2. 创建实例

docker run -p 80:80 --name nginx \
--restart=always \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.18.0

2.3.3.访问测试

cd /mydata/nginx/htmlvim index.html
<h1>com.atguigu.gmall<h1>

访问:http://192.168.139.10

在这里插入图片描述



3.文本分词

一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。

例如,whitespace tokenizer遇到空白字符时分割文本。它会将文本 Quick brown fox! 分割为
[Quick,brown,fox!] 。该tokenizer还负责记录各个 term(词条)的顺序或 position位置(用于
phrase短语和word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符偏移量),用于高亮显示搜索的内容。

ElasticSearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)。

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-tokenizer.html



3.1.安装ik分词器

GitHub:https://github.com/medcl/elasticsearch-analysis-ik

注意:ik分词器的版本一定要对应es版本安装


https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.10.1

# 进入 plugins 目录
cd /mydata/elasticsearch/plugins# 下载
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.1/elasticsearch-analysis-ik-7.10.1.zip# 解压
unzip elasticsearch-analysis-ik-7.10.1.zip -d ik# 删除zip文件
rm -rf *.zip# 修改ik文件夹权限
chmod -R 777 ik/# 确认是否安装好了分词器,进入容器bin目录
docker exec -it elasticsearch /bin/bash
cd bin
# 列出系统的分词器
elasticsearch-plugin list
ik# 重启容器
docker restart elasticsearch


3.2.测试分词器:

使用默认

GET _analyze
{"text":"我是中国人"
}

使用分词器 ik_smart

GET _analyze
{"analyzer":"ik_smart","text":"我是中国人"
}

另一个分词器 ik_max_word

GET _analyze
{"analyzer":"ik_max_word","text":"我是中国人"
}


3.3.自定义词库

配置远程词库,在nginx的 html 目录下新创建自定义词库

# 在html目录下创建es文件夹
mkdir es
# 创建新的分词并保存
vim participle.txt
尚硅谷
谷粒商城

修改 /mydata/elasticsearch/plugins/ik/config/ 中的 IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!-- 用户可以在这里配置自己的扩展字典 -><entry key="ext_dict"></entry><!-- 用户可以在这里配置自己的扩展停止词字典-><entry key="ext_stopwords"></entry><!-- 用户可以在这里配置远程扩展字典,这里使用的是nginx来访问 -><entry key="remote_ext_dict">http://192.168.139.10/es/participle.txt</entry><!-- 用户可以在这里配置远程扩展停止词字典-><!-- <entry key="remote_ext_stopwords">words_location</entry>->
</properties>

重启elasticsearch容器

docker restart elasticsearch



3.4.测试自定义词库

在这里插入图片描述

更新词库完成后,es只会对新增的数据用新词分词。历史数据是不会重新分词的,如果想要历史数据重新分词,需要执行:

POST my_index/_update_by_query?conflicts=proceed



4.创建检索服务模块


4.1ElasticSearch-Rest-Client

1)9300:TCP

spring-data-elasticsearch:transport-api.jar

  • Spring Boot 版本不同,transport-api.jar不同,不能适配 elasticsearch 版本
  • 官方7.x已经不建议使用,8以后就要废弃

2)9200:HTTP

  • JestClient:非官方,更新慢
  • RestTemplate:模拟发HTTP请求,ES很多操作需要自己封装,很麻烦
  • HttpClient/OkHttp:模拟发HTTP请求,ES很多操作需要自己封装,很麻烦
  • ElasticSearch-Rest-Client:官方RestClient封装了ES操作API层次分明上手简单

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html



4.2.创建检索服务模块


4.2.1.新建Module gmall-search

1)聚合模块

<modules><module>gmall-search</module>
</modules>

2)导入版本依赖
<properties><elasticsearch.version>7.10.1</elasticsearch.version>
</properties>
<dependency><groupId>com.atguigu.gmall</groupId><artifactId>gmall-common</artifactId><version>0.0.1-SNAPSHOT</version><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></exclusion><exclusion><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${elasticsearch.version}</version>
</dependency>

3)加入到Nacos注册中心和配置中心

application.yml

server:port: 20000
spring:application:name: gmall-searchcloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c

bootstrap.properties

spring.application.name=gmall-search
spring.cloud.nacos.config.server-addr=192.168.139.10:8848
spring.cloud.nacos.config.namespace=873d6587-5969-47dd-accb-a4d33a13817d
spring.cloud.nacos.config.group=dev

4)网关路由配置
spring:cloud:gateway:routes:- id: search_routeuri: lb://gmall-searchpredicates:- Path=/api/search/**filters:- RewritePath=/api/(?<segment>.*), /$\{segment}

4.2.3.配置ElasticSearch

编写ElasticSearch配置类 ElasticSearchConfig

package com.atguigu.gmall.search.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** ElasticSearch 配置类 {@link ElasticSearchConfig}*  * @author zhangwen* @email: 1466787185@qq.com*/
@Configuration
public class ElasticSearchConfig {public static final RequestOptions COMMON_OPTIONS;/*** https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-low-usage-requests.html#java-rest-low-usage-request-options*/static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient restHighLevelClient () {RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(// es集群模式下,可以指定多个 HttpHostnew HttpHost("192.168.139.10", 9200, "http")));return restHighLevelClient;}
}


# 5.商品上架到ES
  • 上架的商品才可以在网站展示

  • 上架的商品可以被检索



5.1.API

POST /product/spuinfo/{spuId}/up



5.2.后台接口实现

SpuInfoController

/*** 商品上架* @param spuId* @return*/@PostMapping("/{spuId}/up")public R spuUp(@PathVariable("spuId") Long spuId) {spuInfoService.up(spuId);return R.ok();}

SpuInfoServiceImpl

/*** 商品上架* @param spuId*/
@Override
public void up(Long spuId) {// 组装数据// 查询当前sku的所有可以被用来检索规格属性List<ProductAttrValueEntity> baseAttrs = productAttrValueService.listBaseAttrForSpu(spuId);List<Long> attrIds = baseAttrs.stream().map(ProductAttrValueEntity::getAttrId).collect(Collectors.toList());// 在指定的属性集合里面,查找出能够被检索的属性List<Long> searchAttrIds = attrService.selectSearchAttrIds(attrIds);Set<Long> idSet = new HashSet<>(searchAttrIds);List<SkuEsModel.Attrs> attrsList = baseAttrs.stream().filter(attr -> {return idSet.contains(attr.getAttrId());}).map(attr -> {SkuEsModel.Attrs attrs = new SkuEsModel.Attrs();BeanUtils.copyProperties(attr, attrs);return attrs;}).collect(Collectors.toList());// 查询出当前spuId对应的所有sku信息List<SkuInfoEntity> skus = skuInfoService.getSkusBySpuId(spuId);// 发送远程调用,库存系统查询是否有库存List<Long> skuIds =skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());Map<Long, Boolean> stockMap = null;try {List<SkuHasStockTO> tos = wareFeignService.getSkuHasStock(skuIds);stockMap = tos.stream().collect(Collectors.toMap(SkuHasStockTO::getSkuId, value ->value.getHasStock()));} catch (Exception e) {log.error("调用远程库存服务 gmall-ware 查询异常:{}", e);}// 封装每个sku的信息Map<Long, Boolean> finalStockMap = stockMap;List<SkuEsModel> skuEsModelList = skus.stream().map(skuInfoEntity -> {SkuEsModel skuEsModel = new SkuEsModel();BeanUtils.copyProperties(skuInfoEntity, skuEsModel);skuEsModel.setSkuPrice(skuInfoEntity.getPrice());skuEsModel.setSkuImg(skuInfoEntity.getSkuDefaultImg());// 远程调用异常,默认设置有库存if (finalStockMap == null) {skuEsModel.setHasStock(true);} else {skuEsModel.setHasStock(finalStockMap.get(skuInfoEntity.getSkuId()));}// TODO 热度评分(应该设计为后台可控的复杂操作)skuEsModel.setHotScore(0L);BrandEntity brandEntity = brandService.getById(skuEsModel.getBrandId());skuEsModel.setBrandName(brandEntity.getName());skuEsModel.setBrandImg(brandEntity.getLogo());CategoryEntity categoryEntity = categoryService.getById(skuEsModel.getCatalogId());skuEsModel.setCatalogName(categoryEntity.getName());// 设置检索属性skuEsModel.setAttrs(attrsList);return skuEsModel;}).collect(Collectors.toList());// 将数据发送给 ES保存R r = searchFeignService.productUp(skuEsModelList);if (r.getCode() == 0) {// 远程调用成功// 更新spu状态为已上架状态baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode());} else {// 远程调用失败// TODO 重试机制?接口幂等性?}}


5.3.远程接口



5.3.1.查询sku是否有库存

WareFeignService

package com.atguigu.gmall.product.feign;import com.atguigu.common.to.SkuHasStockTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;import java.util.List;/*** Ware 仓储服务远程接口 {@link WareFeignService}** @author zhangwen* @email: 1466787185@qq.com*/
@FeignClient("gmall-ware")
public interface WareFeignService {/*** 查询sku是否有库存* @param skuIds* @return*/@PostMapping("/ware/waresku/hasstock")List<SkuHasStockTO> getSkuHasStock(@RequestBody List<Long> skuIds);
}

远程接口实现

WareSkuController

 /*** 查询sku是否有库存* @param skuIds* @return*/@PostMapping("/hasstock")public List<SkuHasStockTO> getSkuHasStock(@RequestBody List<Long> skuIds) {List<SkuHasStockTO> tos = wareSkuService.getSkuHasStock(skuIds);return tos;}

WareSkuServiceImpl

/*** 查询sku是否有库存* @param skuIds* @return*/
@Override
public List<SkuHasStockTO> getSkuHasStock(List<Long> skuIds) {List<SkuHasStockTO> tos = skuIds.stream().map(skuId -> {SkuHasStockTO to = new SkuHasStockTO();to.setSkuId(skuId);// 查询当前sku的库存量long count = baseMapper.getSkuStock(skuId);to.setHasStock(count > 0);return to;}).collect(Collectors.toList());return tos;
}

5.3.2.商品上架到ES库

SearchFeignService

package com.atguigu.gmall.product.feign;import com.atguigu.common.to.es.SkuEsModel;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;import java.util.List;/*** Search 检索远程服务接口 {@link SearchFeignService}** @author zhangwen* @email: 1466787185@qq.com*/
@FeignClient("gmall-search")
public interface SearchFeignService {/*** 商品上架* @param skuEsModelList* @return*/@PostMapping("/search/save/product")R productUp(@RequestBody List<SkuEsModel> skuEsModelList);
}

远程接口实现

ElasticSaveController

package com.atguigu.gmall.search.controller;import com.atguigu.common.exception.BizCode;
import com.atguigu.common.to.es.SkuEsModel;
import com.atguigu.common.utils.R;
import com.atguigu.gmall.search.service.ProductServcie;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;/*** ElasticSearch 存储 {@link ElasticSaveController}** @author zhangwen* @email: 1466787185@qq.com*/
@Slf4j
@RequestMapping("/search/save")
@RestController
public class ElasticSaveController {@Autowiredprivate ProductServcie productServcie;/*** 商品上架* @param skuEsModelList* @return*/@PostMapping("/product")public R productUp(@RequestBody List<SkuEsModel> skuEsModelList) {boolean flag = false;try {// 返回 false,说明商品上架没有异常flag = productServcie.productUp(skuEsModelList);} catch (IOException e) {log.error("ElasticSaveController商品上架错误:{}", e);return R.error(BizCode.PRODUCT_UP_EXCEPTION.getCode(), BizCode.PRODUCT_UP_EXCEPTION.getMessage());}if (!flag) {return R.ok();} else {return R.error(BizCode.PRODUCT_UP_EXCEPTION.getCode(), BizCode.PRODUCT_UP_EXCEPTION.getMessage());}}
}

ProductServiceImpl

package com.atguigu.gmall.search.service.impl;import com.atguigu.common.to.es.SkuEsModel;
import com.atguigu.gmall.search.config.ElasticSearchConfig;
import com.atguigu.gmall.search.service.ProductServcie;
import io.micrometer.core.instrument.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;/*** 商品服务 {@link ProductServiceImpl}** @author zhangwen* @email: 1466787185@qq.com*/
@Slf4j
@Service
public class ProductServiceImpl implements ProductServcie {@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 商品上架* @param skuEsModelList*/@Overridepublic boolean productUp(List<SkuEsModel> skuEsModelList) throws IOException {// 给 es 中建立索引,并建立好映射关系// ES批量保存BulkRequest bulkRequest = new BulkRequest();skuEsModelList.forEach(skuEsModel -> {// 指定索引IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);// 指定索引idindexRequest.id(skuEsModel.getSkuId().toString());// 转换为jsonString jsonString = JsonUtils.objectToJson(skuEsModel);// 设置数据indexRequest.source(jsonString, XContentType.JSON);bulkRequest.add(indexRequest);});BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, ElasticSearchConfig.COMMON_OPTIONS);// TODO 处理批量保存错误// true 有错误,false 没有错误boolean b = bulk.hasFailures();// 记录日志List<String> collect = Arrays.stream(bulk.getItems()).map(BulkItemResponse::getId).collect(Collectors.toList());log.info("商品上架:{}", collect);return b;}
}


5.4.ES库查询

在Kibana中查询商品是否成功入库

在这里插入图片描述

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

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

相关文章

论文笔记:A Time Series is Worth 64 Words: Long-term Forecasting with Transformers

ICLR 2023 比较简单&#xff0c;就不分intro、model这些了 1 核心思想1&#xff1a;patching 给定每个时间段的长度、划分的stride&#xff0c;将时间序列分成若干个时间段 时间段之间可以有重叠&#xff0c;也可以没有每一个时间段视为一个token 1.1 使用patching的好处 降…

糖化学试剂55520-67-7,5-vinyl-2-deoxyuridine,5-乙烯基-2-脱氧尿苷特点分析说明

5-vinyl-2-deoxyuridine(5-VdU)&#xff0c;5-vinyl-2-deoxyuridine&#xff0c;5-Vinyldeoxyuridine5-乙烯基-2-脱氧尿苷 | CAS&#xff1a;55520-67-7 | 纯度&#xff1a;95%试剂信息&#xff1a;CAS&#xff1a;55520-67-7所属类别&#xff1a;糖化学分子量&#xff1a;C11H…

MySQL索引类型(type)分析

type索引类型 system > const > eq_ref > ref > range > index > all 优化级别从左往右递减&#xff0c;没有索引的⼀般为’all’。推荐优化目标&#xff1a;至少要达到 range 级别&#xff0c; 要求是 ref 级别&#xff0c; 如果可以是 const 最好&#xff…

单通道说话人语音分离——DPRNN(Dual-Path Recurrent Neural Network)

参考文献&#xff1a;《DUAL-PATH RNN: EFFICIENT LONG SEQUENCE MODELING FOR TIME-DOMAIN SINGLE-CHANNEL SPEECH SEPARATION》 DPRNN网络是Con-Tasnet的改进网络 Con-Tasnet介绍详情请看上一篇文章 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio…

UWB到底是什么技术?

什么是空间感知能力 所谓的空间感知能力&#xff0c;就是感知方位的能力。更直接一点&#xff0c;就是定位能力。说白了&#xff0c;利用UWB技术&#xff0c;手机和智能设备可以更精准地实现室内定位&#xff0c;不仅可以感知自己的位置&#xff0c;还可以感知周边其它手机或设…

多任务学习概述

文章目录前言1 文章信息2 背景、目的、结论2.1 背景2.1.1 多任务的类型分类2.1.1.1 相关任务的分类2.1.1.2 将输入变输出的逆多任务学习2.1.1.3 对抗性多任务学习2.1.1.4 辅助任务提供注意力特征的多任务学习2.1.1.5 附加预测性辅助任务的多任务学习3 内容与讨论3.1 多任务学习…

大数据技术之Hadoop

第1章 Hadoop概述1.1 Hadoop是什么1.2 Hadoop发展历史&#xff08;了解&#xff09;1.3 Hadoop三大发行版本&#xff08;了解&#xff09;Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。Apache版本最原始&#xff08;最基础&#xff09;的版本&#xff0c;对于…

【unity】开发rts 3 出生点,创建建筑物

一 出生点、阵营类型、阵营 实例栏-GameManage&#xff0c;默认有一个插槽 size 插槽数量 role 权限&#xff0c;host是主人&#xff0c;权限高 type 阵营类型&#xff0c;不选不限制&#xff0c;选的效果没看懂&#xff0c;文档原文&#xff1a; The Type field in Data al…

Cookie、Session、JWT 那些事

文章目录前言一、概念1、Cookie&#xff1a;2、Session&#xff1a;3、JWT二、应用1. 基本使用2. 实现 “退出” 功能总结前言 目前 C/S 模式盛行&#xff0c;HTTP 是其中最常见的通信协议&#xff0c;我们知道 HTTP 协议是无状态的&#xff0c;但是这场景完全不够用。 比如&…

Python|每日一练|算法初阶|字符串|树|深度优先搜索|单选记录:循环随机取数组直到得出指定数字|有效数字|平衡二叉树

1、循环随机取数组直到得出指定数字&#xff1f;&#xff08;算法初阶&#xff09; 贡献者&#xff1a;weixin_30937093 举个例子&#xff1a; 随机数字范围&#xff1a;0~100 每组数字量&#xff1a;6&#xff08;s1,s2,s3,s4,s5,s6&#xff09; 第二轮开始随机数字范围&…

Linux 基础介绍-基础命令

文章目录01 学习目标02 Linux/Unix 操作系统简介2.1 Linux 操作系统的目标2.2 Linux 操作系统的作用2.3 Unix 家族历史2.4 Linux 家族历史2.5 Linux 和Unix 的联系2.6 Linux 内核介绍2.7 Linux 发行版本2.8 Unix/Linux 开发应用领域介绍03 Linux 目录结构3.1 Win 和Linux 文件系…

Mac iTerm2 rz sz

1、安装brew&#xff08;找了很多&#x1f517;&#xff0c;就这个博主的好用&#xff09; Mac如何安装brew&#xff1f;_行走的码农00的博客-CSDN博客_mac brew 2、安装lrzsz brew install lrzsz 检查是否安装成功 brew list 定位lrzsz的安装目录 brew list lrzsz 执…

git学习记录/菜鸟教程(基于Gitcode)

首先说明下为何使用Gitcode而不是hub或lab&#xff1a;只是因为国外的网站访问太慢了&#xff0c;而且还要翻译从初次使用开始说&#xff1a;首先安装Git&#xff0c;一路next就可以&#xff0c;安装好后打开&#xff0c;输入git version如果有显示版本号&#xff0c;说明安装成…

2020蓝桥杯真题跑步锻炼(填空题) C语言/C++

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝每天都锻炼身体。 正常情况下&#xff0c;小蓝每天跑 1 千米。如果某天是周一或者月初&#xff08;1 日&#xff09;&#xff0c;为了激励自己&#xff0c;小蓝…

Docker在Windows环境的搭建和使用

文章目录安装WSL安装Docker安装Docker镜像下载Docker镜像启动gpu启动传送文件训练yolov5安装WSL Windows10和11支持Docker的安装&#xff0c;安装需要用到WSL。所以&#xff0c;我们先安装WSL。 参考文章&#xff1a;旧版 WSL 的手动安装步骤 以管理员身份打开powershell, 执行…

软考信息系统监理师备考建议

用好备考方法&#xff0c;两三个月就可以过的。信息系统监理师备考最好以教材和历年真题为主&#xff0c;教学视频模拟题为辅。考试介绍与复习建议&#xff1a;考试设置的科目包括&#xff1a;&#xff08;1&#xff09;信息系统工程监理基础知识&#xff0c;考试时间150分钟&a…

Three.js初试——基础概念

一、Three.js 是什么 先附上文档&#xff1a; 官网&#xff1a;JavaScript 3D Library 中文文档&#xff1a;中文文档 Three.js 是一个让用户通过 javascript 入手进入搭建 WebGL 项目的类库。众所周知学习 WebGL 需要图形学知识&#xff0c;而 webgl 需要通过 js 和 glsl …

第八届蓝桥杯省赛——4承压计算(二维数组,嵌套循环)

题目&#xff1a;X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致&#xff0c;但重量不同。金属材料被严格地堆放成金字塔形。7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4…

车辆热管理测试方案

车辆热管理是在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生的。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统&#xff1b;控制和优化车辆的热量传递过程&#xff0c;保证各关键部件和系统安全高效运行&…

社交媒体营销的5个好处

有些人认为&#xff0c;社交媒体营销不能直接与销售挂钩。这就是为什么在制定营销策略时&#xff0c;社交媒体营销会被部分人忽视的原因。然而&#xff0c;与其他广告渠道不同&#xff0c;社交媒体是双向渠道。忽视社交媒体营销将影响与客户的关系。最重要的是&#xff0c;它将…