SpringBoot2.2.0.RELEASE整合Elasticsearch6.8.3

SpringBoot2.2.0.RELEASE整合Elasticsearch6.8.3

SpringBoot是2.2.0.RELEASE,elasticsearch是6.8.3

使用依赖spring-boot-starter-data-elasticsearch

使用ElasticSearchRepository操作

1、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.0.RELEASE</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-boot-elasticsearch5</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-elasticsearch5</name><description>spring-boot-elasticsearch5</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2、配置文件

spring:elasticsearch:rest:uris: http://192.168.94.186:9200

3、创建索引的实体类

package com.example.search.entity;import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;
import java.util.Map;/*** 1.创建索引* 2.创建类型* 3.创建文档* 4.字段的映射(是否分词,是否索引,是否存储,数据类型是什么,分词器是什么)* indexName 指定创建的索引的名称* type :指定索引中的类型*/@Getter
@Setter
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "shop_info", type = "docs")
public class ShopInfo implements Serializable {@Id@Field(type = FieldType.Text)private Long id;@Field(type = FieldType.Text, analyzer = "ik_smart")private String name;@Field(type = FieldType.Double)private Double price;@Field(type = FieldType.Keyword)private String categoryName;@Field(type = FieldType.Keyword)private String brandName;@Field(type = FieldType.Keyword)private String spec;// -ES能够自动存储未提交创建字段信息的数据// 目的:未指定时ES为了可以更好的支持聚合和查询功能,所以默认创建了两种// 对于未提前指定类型的字段,使用以下默认规则//  [字段](text)   		  #分词不聚合//  [字段].keyword(keyword) #聚合不分词private Map<String, Object> specMap;}
package com.example.search.entity;import lombok.*;import java.util.Map;/*** 查询数据的封装*/
@Getter
@Setter
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShopVO {private Long id;private String name;private Double price;private String categoryName;private String brandName;private String spec;private Map<String, Object> specMap;
}

4、ShopEsMapper

package com.example.search.dao;import com.example.search.entity.ShopInfo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;@Component
public interface ShopEsMapper extends ElasticsearchRepository<ShopInfo, Long> {
}

5、Service

package com.example.search.service;import java.util.Map;public interface ShopSearchService {/*** 1.查询符合条件的shop的数据* 2.调用spring data elasticsearch的API导入到ES中*/void importEs();/*** 进行查询** @param searchMap* @return*/Map search(Map<String, String> searchMap);/*** 创建索引*/boolean createIndex();/*** 删除索引*/boolean deleteIndex();}
package com.example.search.service.impl;import com.alibaba.fastjson.JSON;
import com.example.search.dao.ShopEsMapper;
import com.example.search.entity.ShopInfo;
import com.example.search.entity.ShopVO;
import com.example.search.service.ShopSearchService;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.util.*;@Service
public class ShopSearchServiceImpl implements ShopSearchService {@Autowiredprivate ShopEsMapper shopEsMapper;@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Overridepublic void importEs() {// 1.查询符合条件的shop的数据// 这里正常是从数据库中查询数据// 现在只是测试,只添加两条数据List<ShopVO> shopVOList = new ArrayList<>();Map<String, Object> specMap = new HashMap<>();specMap.put("颜色", "白色");specMap.put("内存", "64G");specMap.put("硬盘", "1T");specMap.put("待机", "8h");shopVOList.add(new ShopVO(1L, "华为手机", 2000.0, "手机", "华为", "{\"内存\":\"64G\",\"颜色\":\"白色\"}", specMap));shopVOList.add(new ShopVO(2L, "小米电脑", 3000.0, "电脑", "小米", "{\"硬盘\":\"1T\",\"颜色\":\"金色\"}", specMap));// 将shopVO的列表转换成es中的ShopInfo的列表List<ShopInfo> shopInfoList = JSON.parseArray(JSON.toJSONString(shopVOList), ShopInfo.class);// 2.调用spring data elasticsearch的API导入到ES中shopEsMapper.saveAll(shopInfoList);}/*** @param searchMap*/@Overridepublic Map search(Map<String, String> searchMap) {// 1.获取到关键字String keywords = searchMap.get("keywords");// 2.判断是否为空,如果为空给一个默认值:华为// 查询所有// SELECT * FROM shop WHERE name LIKE '%手机%';if (StringUtils.isEmpty(keywords)) {keywords = "华为";}// 3.创建查询构建对象NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();// 4.设置查询的条件// SELECT categoryName FROM shop WHERE name LIKE '%手机%' GROUP BY categoryName;// 4.1商品分类的列表展示: 按照商品分类的名称来分组// terms:指定分组的一个别名// field:指定要分组的字段名// size:指定查询结果的数量,默认是10个nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopCategoryGroup").field("categoryName.keyword").size(50));// 4.2商品的品牌的列表展示,按照商品品牌来进行分组// SELECT brandName FROM shop WHERE name LIKE '%手机%' GROUP BY brandName;nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopBrandGroup").field("brandName.keyword").size(100));// 4.3商品的规格的列表展示,按照商品的规格的字段spec进行分组// SELECT spec FROM shop WHERE name LIKE '%手机%' GROUP BY spec;// 规则要求字段是一个keyword类型的,spec.keywordnativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopSpecGroup").field("spec.keyword").size(500));// 4.4设置高亮的字段,设置前缀和后缀// 设置高亮的字段,针对商品的名称进行高亮nativeSearchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("name"));// 设置前缀和后缀nativeSearchQueryBuilder.withHighlightBuilder(new HighlightBuilder().preTags("<em style=\"color:red\">").postTags("</em>"));// 匹配查询:先分词,再查询,主条件查询// 参数1:指定要搜索的字段// 参数2:要搜索的值(先分词,再搜索)// 从单个字段搜索数据// nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", keywords));// 从多个字段中搜索数据,参数1为关键字,后面的参数为所有的字段nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(keywords, "name", "categoryName", "brandName"));//========================过滤查询开始=====================================BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 4.4 过滤查询的条件设置// 商品分类的条件String category = searchMap.get("category");if (!StringUtils.isEmpty(category)) {boolQueryBuilder.filter(QueryBuilders.termQuery("categoryName", category));}// 4.5 过滤查询的条件设置// 商品品牌的条件String brand = searchMap.get("brand");if (!StringUtils.isEmpty(brand)) {boolQueryBuilder.filter(QueryBuilders.termQuery("brandName", brand));}//4.6 过滤查询的条件设置// 规格条件if (searchMap != null) {//{ spec_网络:"电信4G",spec_顔色:"黑色"}for (String key : searchMap.keySet()) {if (key.startsWith("spec_")) {//截取规格的名称boolQueryBuilder.filter(QueryBuilders.termQuery("specMap." + key.substring(5) + ".keyword", searchMap.get(key)));}}}// 4.7 过滤查询的条件设置// 价格区间的过滤查询// 0-500  3000-*String price = searchMap.get("price");if (!StringUtils.isEmpty(price)) {//获取值 按照- 切割String[] split = price.split("-");//过滤范围查询//0<=price<=500if (!split[1].equals("*")) {boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").from(split[0], true).to(split[1], true));} else {boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(split[0]));}}//过滤查询nativeSearchQueryBuilder.withFilter(boolQueryBuilder);//========================过滤查询结束=====================================// 分页查询// 第一个参数:指定当前的页码  注意: 如果是第一页 数值为0// 第二个参数:指定当前的页的显示的行String pageNum1 = searchMap.get("pageNum");Integer pageNum = Integer.valueOf(pageNum1);String pageSize1 = searchMap.get("pageSize");Integer pageSize = Integer.valueOf(pageSize1);nativeSearchQueryBuilder.withPageable(PageRequest.of(pageNum - 1, pageSize));// 排序操作// 获取排序的字段 和要排序的规则// priceString sortField = searchMap.get("sortField");// DESC ASCString sortRule = searchMap.get("sortRule");if (!StringUtils.isEmpty(sortField) && !StringUtils.isEmpty(sortRule)) {// 执行排序nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField).order(sortRule.equalsIgnoreCase("ASC") ? SortOrder.ASC : SortOrder.DESC));// nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField).order(SortOrder.valueOf(sortRule)));}// 5.构建查询对象(封装了查询的语法)NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();//6.执行查询AggregatedPage<ShopInfo> shopInfos = elasticsearchRestTemplate.queryForPage(nativeSearchQuery, ShopInfo.class, new SearchResultMapperImpl());// 6.2 获取聚合分组结果  获取商品分类的列表数据Terms stringTermsCategory = (Terms) shopInfos.getAggregation("shopCategoryGroup");List<String> categoryList = getStringsCategoryList(stringTermsCategory);//6.3 获取 品牌分组结果 列表数据Terms stringTermsBrand = (Terms) shopInfos.getAggregation("shopBrandGroup");List<String> brandList = getStringsBrandList(stringTermsBrand);//6.4 获取 规格的分组结果 列表数据mapTerms stringTermsSpec = (Terms) shopInfos.getAggregation("shopSpecGroup");Map<String, Set<String>> specMap = getStringSetMap(stringTermsSpec);//7.获取结果// 返回map//当前的页的集合List<ShopInfo> content = shopInfos.getContent();//总页数int totalPages = shopInfos.getTotalPages();//总记录数long totalElements = shopInfos.getTotalElements();Map<String, Object> resultMap = new HashMap<>();//商品分类的列表数据resultMap.put("categoryList", categoryList);//商品品牌的列表数据resultMap.put("brandList", brandList);//商品规格的列表数据展示resultMap.put("specMap", specMap);resultMap.put("rows", content);resultMap.put("total", totalElements);resultMap.put("totalPages", totalPages);resultMap.put("pageNum", pageNum);resultMap.put("pageSize", pageSize);return resultMap;}@Overridepublic boolean createIndex() {// 创建索引,会根据ShopInfo类的@Document注解信息来创建Boolean aBoolean = elasticsearchRestTemplate.createIndex(ShopInfo.class);// 配置映射,会根据ShopInfo类中的id、Field等字段来自动完成映射Boolean aBoolean1 = elasticsearchRestTemplate.putMapping(ShopInfo.class);System.out.println("创建索引是否成功:" + (aBoolean && aBoolean1));return aBoolean && aBoolean1;}@Overridepublic boolean deleteIndex() {Boolean aBoolean = elasticsearchRestTemplate.deleteIndex(ShopInfo.class);System.out.println("删除索引是否成功:" + aBoolean);return aBoolean;}private Map<String, Set<String>> getStringSetMap(Terms stringTermsSpec) {// key :规格的名称// value :规格名称对应的选项的多个值集合setMap<String, Set<String>> specMap = new HashMap<String, Set<String>>();Set<String> specValues = new HashSet<String>();if (stringTermsSpec != null) {// 1. 获取分组的结果集for (Terms.Bucket bucket : stringTermsSpec.getBuckets()) {//2.去除结果集的每一行数据()// {"手机屏幕尺寸":"5.5寸","网络":"电信4G","颜色":"白","测试":"s11","机身内存":"128G","存储":"16G","像素":"300万像素"}String keyAsString = bucket.getKeyAsString();System.out.println("keyAsString:" + keyAsString);//3.转成JSON 对象  map  key :规格的名称  value:规格名对应的选项的单个值Map<String, String> map = JSON.parseObject(keyAsString, Map.class);for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {//规格名称:手机屏幕尺寸String key = stringStringEntry.getKey();//规格的名称对应的单个选项值 5.5寸String value = stringStringEntry.getValue();//先从原来的specMap中 获取 某一个规格名称 对应的规格的选项值集合specValues = specMap.get(key);if (specValues == null) {specValues = new HashSet<>();}specValues.add(value);//4.提取map中的值放入到返回的map中specMap.put(key, specValues);}}}return specMap;}private List<String> getStringsBrandList(Terms stringTermsBrand) {List<String> brandList = new ArrayList<>();if (stringTermsBrand != null) {for (Terms.Bucket bucket : stringTermsBrand.getBuckets()) {//品牌的名称 huaweiString keyAsString = bucket.getKeyAsString();brandList.add(keyAsString);}}return brandList;}/*** 获取分组结果   商品分类的分组结果** @param stringTermsCategory* @return*/private List<String> getStringsCategoryList(Terms stringTermsCategory) {List<String> categoryList = new ArrayList<>();if (stringTermsCategory != null) {for (Terms.Bucket bucket : stringTermsCategory.getBuckets()) {String keyAsString = bucket.getKeyAsString();//就是商品分类的数据categoryList.add(keyAsString);}}return categoryList;}}
package com.example.search.service.impl;import com.alibaba.fastjson.JSON;
import com.example.search.entity.ShopInfo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 自定义结果集映射 ()* 目的: 获取高亮的数据*/public class SearchResultMapperImpl implements SearchResultMapper {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {//1.创建一个当前页的记录集合对象List<T> content = new ArrayList<>();if (response.getHits() == null || response.getHits().getTotalHits() <= 0) {return new AggregatedPageImpl<T>(content);}//搜索到的结果集for (SearchHit searchHit : response.getHits()) {//每一个行的数据 json的 数据String sourceAsString = searchHit.getSourceAsString();ShopInfo skuInfo = JSON.parseObject(sourceAsString, ShopInfo.class);//key :高亮的字段名  value 就是该字段的高亮的数据集合Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();HighlightField highlightField = highlightFields.get("name");//有高亮的数据if (highlightField != null) {//有高亮的数据StringBuffer buffer = new StringBuffer();//取高亮的数据for (Text text : highlightField.getFragments()) {//高亮的数据  华为 胀奸  5寸  联通2G  白  <em style='color=red>'显示</em>  32G  16G  300万像素String string = text.string();buffer.append(string);}//有高亮的数据skuInfo.setName(buffer.toString());}content.add((T) skuInfo);}//2.创建分页的对象 已有//3.获取总个记录数long totalHits = response.getHits().getTotalHits();//4.获取所有聚合函数的结果Aggregations aggregations = response.getAggregations();//5.深度分页的IDString scrollId = response.getScrollId();return new AggregatedPageImpl<T>(content, pageable, totalHits, aggregations, scrollId);}@Overridepublic <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {return null;}
}

6、启动类

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.example.search.dao")
public class SpringBootElasticsearch5Application {public static void main(String[] args) {SpringApplication.run(SpringBootElasticsearch5Application.class, args);}}

7、测试

package com.example;import com.example.search.entity.ShopInfo;
import com.example.search.service.ShopSearchService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;import java.util.HashMap;
import java.util.Map;@Slf4j
@SpringBootTest
class SpringBootElasticsearch5ApplicationTests {@Autowiredprivate ShopSearchService shopSearchService;@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testvoid createIndex() {shopSearchService.createIndex();}@Testvoid deleteIndex() {shopSearchService.deleteIndex();}@Testvoid saveData() {// 如果没有索引在执行的时候自动会创建索引shopSearchService.importEs();}/*** 参数有:* keywords* category* brand* spec_* price* pageNum* pageSize* sortField* sortRule*/@Testvoid search() {Map<String, String> map = new HashMap<>();map.put("pageNum", "1");map.put("pageSize", "1");Map resultMap = shopSearchService.search(map);log.info(resultMap.toString());}}

7.1 插入数据测试

插入数据前不需要先建立索引,在执行插入的时候会自动建立。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.2 搜索测试

在这里插入图片描述

2022-06-24 15:06:07.992  INFO 15828 --- [           main] SpringBootElasticsearch5ApplicationTests : {total=1, categoryList=[手机], totalPages=1, specMap={颜色=[白色], 内存=[64G]}, pageSize=1, brandList=[华为], rows=[ShopInfo(id=1, name=<em style="color:red"></em><em style="color:red"></em>手机, price=2000.0, categoryName=手机, brandName=华为, spec={"内存":"64G","颜色":"白色"}, specMap={硬盘=1T, 颜色=白色, 内存=64G, 待机=8h})], pageNum=1}

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

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

相关文章

VMware Linux Centos 配置网络并设置为静态ip

在root用户下进行以下操作 1. 查看子网ip和网关 &#xff08;1&#xff09;进入虚拟网络编辑器 &#xff08;2&#xff09;进入NAT设置 &#xff08;3&#xff09;记录子网IP和子网掩码 2. 修改网络配置文件 &#xff08;1&#xff09;cd到网络配置文件路径下 [rootlo…

工欲善其事必先利其器,IT工作电脑更要维护好

目录 一&#xff1a;电脑的组成 二&#xff1a;维护措施 三&#xff1a;助力记忆 一&#xff1a;电脑的组成 当谈到电脑主机时&#xff0c;我们通常指的是电脑的中央处理器(CPU)、内存、主板、电源、硬盘、显卡、声卡、网卡等核心部件组成的整体。这些部件共同协作&#xff…

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法 一、背景二、解决方法三、实现自动发现新的分区一、背景 生产环境Kafka集群压力大,Topic读写压力大,消费的lag比较大,因此通过扩容Topic的分区,增大Topic的读写性能理论上下…

力扣 62. 不同路径

题目来源&#xff1a;https://leetcode.cn/problems/unique-paths/ C题解1&#xff1a;动态规划。声明二维数组。 确定dp数组&#xff08;dp table&#xff09;以及下标的含义。dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) …

Kafka-Broker工作流程

kafka集群在启动时&#xff0c;会将每个broker节点注册到zookeeper中&#xff0c;每个broker节点都有一个controller&#xff0c;哪个controller先在zookeeper中注册&#xff0c;哪个controller就负责监听brokers节点变化&#xff0c;当有分区的leader挂掉时&#xff0c;contro…

一行命令删除tag为<none>的镜像

sudo docker images | grep none | awk {print $3;} | xargs sudo docker rmi

DBeaver开源数据库管理工具发布23.1.3版本

导读DBeaver开源数据库管理软件近日发布了v23.1.3版本,该版本在空间数据查看器、数据传输、数据编辑器等多个模块进行了优化,提升了软件的可用性和兼容性。 具体来看,空间数据查看器新增了地图对象标记和曲线渲染支持,也实现了坐标复制等功能。数据传输模块增强了XLSX文件导入和…

【JVM】什么是双亲委派机制

文章目录 1、类加载机制2、双亲委派模型2.1、介绍2.2、为什么需要双亲委派2.3、源码解析 3、破坏双亲委派3.1、介绍3.2、破坏实现3.3、破坏双亲委派的例子 4、线程上下文类加载器 1、类加载机制 类加载阶段分为加载、连接、初始化三个阶段&#xff0c;而加载阶段需要通过类的全…

Vue2(初识vue)

目录 一&#xff0c;Vue2简介1.1&#xff0c;什么是vue1.2&#xff0c;初始vue1.3&#xff0c;搭建vue环境1.4&#xff0c;第一个hello world 二&#xff0c;基础知识2.1 指令2.2-1 指令v-text2.2-2 指令v-html2.2-3 指令v-if2.2-4 指令v-else2.2-5 指令v-show2.2-6 v-if指令与…

深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令

目录 前言 一、scan 命令 二、数据库管理命令 select dbsize flushdb / flushall 前言 之前我们所了解到的 keys * 是一次性把整个 redis 中所有的 key 都获取到&#xff0c;但是整个操作比较危险&#xff0c;可能会一下子的都太多的 key&#xff0c;阻塞 redis 服务器. …

centos系统离线安装k8s v1.23.9最后一个版本并部署服务,docker支持的最后一个版本

注意&#xff1a;我这里的离线安装包是V1.23.9. K8S v1.23.9离线安装包下载&#xff1a; 链接&#xff1a;https://download.csdn.net/download/qq_14910065/88143546 这里包括离线安装所有的镜像&#xff0c;kubeadm&#xff0c;kubelet 和kubectl&#xff0c;calico.yaml&am…

linux系统共享文件夹的创建和使用(VMware )

虚拟机设置共享文件夹 点击设置 点击选项 选择共享文件夹 随便添加一个电脑上的文件夹 虚拟机内打开共享文件夹 打开根目录 打开mnt文件夹 继续点击 最终得到共享文件夹

一文讲清多线程与多线程同步

1 多线程 1.1 线程的概念 十多年前&#xff0c;主流观点主张在可能的情况下优先选择多进程而非多线程&#xff0c;如今&#xff0c;多线程编程已经成为编程领域的事实标准。多线程技术在很大程度上改善了程序的性能和响应能力&#xff0c;使其能够更加高效地利用系统资源&…

【读书笔记】CHAPTER 1: SCALE FROM ZERO TO MILLIONS OF USERS

如果你有一定工作经验&#xff0c;或者开发项目基础&#xff0c;就看这个图就可以。 一个“从零扩展到数百万用户”系统&#xff0c;基本由上述部分组成&#xff1a; web、app&#xff1a;触达用户的设备&#xff08;页面&#xff09; DNS&#xff1a;用户看到的都是域名(ww…

count(列名) ,count(1)与count(*) 有何区别?

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 文章目录 一、Mysql之count函数简介二、count(列名) &#xff0c;count(常量)与count(*) 有何区别&#xff1f;2.1 统计字段上的区别2.2 执行效率上的区别 一、Mysql之count函数简介 &#x1f449;表达式 COUNT(…

Centos7 上安装 redis-dump 和redis-load 命令

一、安装rvm 1、安装GPG keys gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL http://rvm.io/mpapis.asc | gpg2 --import - curl -sSL http://rvm.io/pkuczynski.asc | g…

如何在项目需求与技术方案未确定的情况下掌控上线时间?

需求不明确与技术方案未确定的挑战 在任何项目管理过程中&#xff0c;需求和技术方案是两个核心环节。理想情况下&#xff0c;我们希望在项目开始阶段就有清晰明确的需求和经过深思熟虑的技术方案。然而&#xff0c;现实中的项目管理往往并不如此理想。 项目需求的重要性 需求…

谷粒商城第七天-商品服务之分类管理下的删除、新增以及修改商品分类

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 删除功能 2.2 新增功能 2.3 修改功能 三、后端部分 3.1 删除接口 3.2 新增接口 3.3 修改接口 四、总结 一、总述 1.1 前端思路 删除和新增以及修改的前端无非就是点击按钮&#xff0c;就向后端发送请求…

将网盘挂载到本地保姆级教程

视频链接&#xff1a;https://www.bilibili.com/video/BV1SA411B7qc Clouddrive2&#xff1a;是一款非常实用的国内网盘服务挂载应用。它支持多种国内知名网盘服务&#xff0c;包括阿里云盘、115云盘、天翼云盘等。通过CloudDrive 2&#xff0c;你可以将这些网盘服务挂载到你的…

夏日暴雨,6大安全应对攻略,让我们一起做好防范

夏季暴雨来袭&#xff0c;我们必须高度警惕&#xff01;短时间的强降雨可能导致积水、山区滑坡、城市内涝等问题&#xff0c;给社会和经济发展带来严重影响。今天&#xff0c;让我们一起探讨一些有效的防范措施&#xff0c;确保个人安全与减少灾害损失。关注天气预警&#xff0…