运费微服务和redis存热点数据

目录

运费模板微服务

接收前端发送的模板实体类

插入数据时使用的entity类对象

 BaseEntity类

查询运费模板服务

新增和修改运费模块

整体流程

代码实现

运费计算 

整体流程

总的代码 

 查找运费模板方法

计算重量方法

Redis存入热点数据

1.从nacos导入共享redis配置

2.自定义RedisTemplate,自定义序列化和反序列化方式

 3.修改代码

4.存入数据时报错


运费模板微服务

接收前端发送的模板实体类

这里对实体类的每一个成员类变量使用了javax.validation.constraints注解来限制成员变量的值

package com.sl.ms.carriage.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;/*** 运费模板对象*/
@Data
public class CarriageDTO {/*** 运费模板id*/@ApiModelProperty(value = "运费模板id")private Long id;/*** 模板类型:1-同城寄,2-省内寄,3-经济区互寄,4-跨省*/@ApiModelProperty(value = "模板类型:1-同城寄,2-省内寄,3-经济区互寄,4-跨省", required = true)@Max(value = 4, message = "类型值必须是1、2、3、4")@Min(value = 1, message = "类型值必须是1、2、3、4")@NotNull(message = "模板类型不能为空")private Integer templateType;/*** 运送类型:1-普快,2-特快*/@ApiModelProperty(value = "运送类型:1-普快,2-特快", required = true)@Max(value = 2, message = "类型值必须是1、2")@Min(value = 1, message = "类型值必须是1、2")@NotNull(message = "运送类型不能为空")private Integer transportType;/*** 关联城市:1-全国,2-京津冀,3-江浙沪,4-川渝,5-黑吉辽*/@ApiModelProperty(value = "关联城市:1-全国,2-京津冀,3-江浙沪,4-川渝,5-黑吉辽", required = true)@NotNull(message = "关联城市不能为空")private List<String> associatedCityList;/*** 首重价格*/@ApiModelProperty(value = "首重价格", required = true)@DecimalMin(value = "0.1", message = "首重价格必须大于0")@NotNull(message = "首重价格不能为空")private Double firstWeight;/*** 续重价格*/@ApiModelProperty(value = "续重价格", required = true)@DecimalMin(value = "0.1", message = "续重价格必须大于0")@NotNull(message = "续重价格不能为空")private Double continuousWeight;/*** 轻抛系数*/@ApiModelProperty(value = "轻抛系数", required = true)@Min(value = 1, message = "轻抛系数必须大于0")@NotNull(message = "轻抛系数不能为空")private Integer lightThrowingCoefficient;/*** 创建时间*/@ApiModelProperty(value = "创建时间")private LocalDateTime created;/*** 更新时间*/@ApiModelProperty(value = "更新时间")private LocalDateTime updated;@ApiModelProperty(value = "运费")private Double expense;@ApiModelProperty(value = "计费重量,单位:kg")private Double computeWeight;
}

插入数据时使用的entity类对象

@Data
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
@TableName("sl_carriage")
public class CarriageEntity extends BaseEntity {private static final long serialVersionUID = -5358753714676282742L;/*** 模板类型:1-同城寄,2-省内寄,3-经济区互寄,4-跨省*/private Integer templateType;/*** 运送类型:1-普快,2-特快*/private Integer transportType;/*** 关联城市:1-全国,2-京津冀,3-江浙沪,4-川渝,5-黑吉辽*/private String associatedCity;/*** 首重价格*/private Double firstWeight;/*** 续重价格*/private Double continuousWeight;/*** 轻抛系数*/private Integer lightThrowingCoefficient;
}

 BaseEntity类

@Data
public abstract class BaseEntity implements Serializable {@TableIdprivate Long id; //主键id@TableField(fill = FieldFill.INSERT) //MP自动填充private LocalDateTime created;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updated;
}

查询运费模板服务

/*** 获取全部运费模板,按照创建时间倒序排序** @return 运费模板对象列表*/

这里是通过工具类批量把entity类对象转换成dto对象,然后返回给前端

    @Overridepublic List<CarriageDTO> findAll() {// 构造查询条件,按创建时间倒序LambdaQueryWrapper<CarriageEntity> wrapper = Wrappers.<CarriageEntity>lambdaQuery().orderByDesc(CarriageEntity::getCreated);// 查询数据库List<CarriageEntity> carriageEntities = baseMapper.selectList(wrapper);// 将结果转换为DTO类型  使用CarriageUtils工具类return carriageEntities.stream().map(CarriageUtils::toDTO).collect(Collectors.toList());}

新增和修改运费模块

整体流程

流程说明:

  • 根据传入的CarriageDTO对象参数进行查询模板,判断模板是否存在,如果不存在直接落库
  • 如果存在,需要进一步的判断是否为经济区互寄,如果不是,说明模板重复,不能落库
  • 如果是经济区互寄,再进一步的判断是否有重复的城市,如果是,模板重复,不能落库
  • 如果不重复,落库,响应返回

模板为什么不能重复?

因为运费的计算是通过模板进行的,如果存在多个模板,该基于哪个模板计算呢?所以模板是不能重复的。

代码实现

        // 校验运费模板是否存在,如果不存在直接插入 (查询条件: 模板类型  运输类型   如果是修改排除当前id)
        LambdaQueryWrapper<CarriageEntity> wrapper = Wrappers.<CarriageEntity>lambdaQuery()
                .eq(CarriageEntity::getTemplateType, carriageDto.getTemplateType())
                .eq(CarriageEntity::getTransportType, carriageDto.getTransportType())
                //如果有id字段值,就说明是更新操作,那么就需要把与自己id值一样的模板排除掉,不然会与自己模板类型一致冲突
                .ne(ObjectUtil.isNotEmpty(carriageDto.getId()), CarriageEntity::getId, carriageDto.getId());

这段代码构建的条件查询对象,特别注意ne()方法,如果dto对象的id成员变量不为null,说明就是更新操作,就说明在数据库中,有与这个对象一模一样的模板,所以需要排除掉这个存在与数据库中的模板(根据id主键值)

 // 如果是经济区互寄类型,需进一步判断关联城市是否重复,通过集合取交集判断是否重复
        List<String> assCities = carriageEntityList.stream().map(CarriageEntity::getAssociatedCity)//获得每一个数据关联的城市字符串
                .map(s -> {
                    return s.split(",");//将每一个字符串变成一个字符串数组
                })
                .flatMap(Arrays::stream)//将每一个字符串数组重新变成流对象
                //TODO:不然直接收集的是List<String[]>类型
                .collect(Collectors.toList());
        Collection<String> intersection = CollUtil.intersection(assCities, carriageDto.getAssociatedCityList());

在数据库中,关联城市字段是 2,3,4 使用,间隔的字符串类型,2是城市id。

所以需要把这个字符串分割成字符数组。 

.flatMap(Arrays::stream)

将每一个字符串数组重新变成流对象,不然直接收集的是List<String[]>类型,

assCities是数据表中所有的关联城市集合,最后判断与dto传入的关联城市集合是否有重复

    /*** 流程说明:* ● 根据传入的CarriageDTO对象参数进行查询模板,判断模板是否存在,如果不存在直接落库* ● 如果存在,需要进一步的判断是否为经济区互寄,如果不是,说明模板重复,不能落库* ● 如果是经济区互寄,再进一步的判断是否有重复的城市,如果是,模板重复,不能落库* ● 如果不重复,落库,响应返回* 模板为什么不能重复?* 因为运费的计算是通过模板进行的,如果存在多个模板,该基于哪个模板计算呢?所以模板是不能重复的。* @param carriageDto 新增/修改运费对象* @return** 模板类型常量 {@link com.sl.ms.carriage.domain.constant.CarriageConstant}**/@Overridepublic CarriageDTO saveOrUpdate(CarriageDTO carriageDto) {// 校验运费模板是否存在,如果不存在直接插入 (查询条件: 模板类型  运输类型   如果是修改排除当前id)LambdaQueryWrapper<CarriageEntity> wrapper = Wrappers.<CarriageEntity>lambdaQuery().eq(CarriageEntity::getTemplateType, carriageDto.getTemplateType()).eq(CarriageEntity::getTransportType, carriageDto.getTransportType())//如果有id字段值,就说明是更新操作,那么就需要把与自己id值一样的模板排除掉,不然会与自己模板类型一致冲突.ne(ObjectUtil.isNotEmpty(carriageDto.getId()), CarriageEntity::getId, carriageDto.getId());List<CarriageEntity> carriageEntityList = super.list(wrapper);// 如果没有重复的模板,可以直接插入或更新操作 (DTO 转 entity 保存成功 entity 转 DTO)if (CollUtil.isEmpty(carriageEntityList)){return saveOrUpdateCarriage(carriageDto);}// 如果存在重复模板,需要判断此次插入的是否为经济区互寄,非经济区互寄是不可以重复的if(ObjectUtil.notEqual(carriageDto.getTemplateType(),CarriageConstant.ECONOMIC_ZONE)){throw new SLException(CarriageExceptionEnum.NOT_ECONOMIC_ZONE_REPEAT);}// 如果是经济区互寄类型,需进一步判断关联城市是否重复,通过集合取交集判断是否重复List<String> assCities = carriageEntityList.stream().map(CarriageEntity::getAssociatedCity)//获得每一个数据关联的城市字符串.map(s -> {return s.split(",");//将每一个字符串变成一个字符串数组}).flatMap(Arrays::stream)//将每一个字符串数组重新变成流对象//TODO:不然直接收集的是List<String[]>类型.collect(Collectors.toList());Collection<String> intersection = CollUtil.intersection(assCities, carriageDto.getAssociatedCityList());// 如果没有重复,可以新增或更新 (DTO 转 entity 保存成功 entity 转 DTO)if(CollUtil.isEmpty(intersection)){return saveOrUpdateCarriage(carriageDto);}else{throw new SLException(CarriageExceptionEnum.ECONOMIC_ZONE_CITY_REPEAT);}}public CarriageDTO saveOrUpdateCarriage(CarriageDTO carriageDTO){CarriageEntity entity = CarriageUtils.toEntity(carriageDTO);super.saveOrUpdate(entity);return CarriageUtils.toDTO(entity);}

运费计算 

整体流程

说明:

  • 运费模板优先级:同城>省内>经济区互寄>跨省
  • 将体积转化成重量,与重量比较,取大值

总的代码 

/*** ● 运费模板优先级:同城>省内>经济区互寄>跨省* ● 将体积转化成重量,与重量比较,取大值* @param waybillDTO 运费计算对象* @return**  */@Overridepublic CarriageDTO compute(WaybillDTO waybillDTO) {// 根据参数查找运费模板 调用findCarriage方法CarriageEntity carriage = findCarriage(waybillDTO);// 计算重量,最小重量为1kg 调用getComputeWeight方法double weight = getComputeWeight(waybillDTO, carriage);// 计算运费  运费 = 首重价格 + (实际重量 - 1) * 续重架构double money=carriage.getFirstWeight()+(weight-1)*carriage.getContinuousWeight();// 结果四舍五入保留一位小数money=NumberUtil.round(money,1).doubleValue();// 封装运费和计算重量到 CarriageDTO,并返回CarriageDTO carriageDTO = CarriageUtils.toDTO(carriage);carriageDTO.setComputeWeight(weight);carriageDTO.setExpense(money);return carriageDTO;}
 查找运费模板方法
/*** 根据参数查找运费模板* 运费模板优先级:同城>省内>经济区互寄>跨省* @param waybillDTO 参数* @return 运费模板*/@Resourceprivate AreaFeign areaFeign;private CarriageEntity findCarriage(WaybillDTO waybillDTO) {// 如果 发件的城市id 和 收件的城市id相同, 查询同城模板 调用findByTemplateType方法if(ObjectUtil.equal(waybillDTO.getSenderCityId(),waybillDTO.getReceiverCityId())){CarriageEntity carriageEntity = findByTemplateType(CarriageConstant.SAME_CITY);if(ObjectUtil.isNotEmpty(carriageEntity)){return carriageEntity;}}// 如果没查到或不是同城,则获取收寄件地址省份id  使用AreaFeign结构查询//根据areaFeign接口获取这个市所属的省idLong receiveProvinceId = areaFeign.get(waybillDTO.getReceiverCityId()).getParentId();Long senderProvinceId = areaFeign.get(waybillDTO.getSenderCityId()).getParentId();// 如果 收发件的省份id相同,查询同省的模板  调用findByTemplateType方法if(ObjectUtil.equal(receiveProvinceId,senderProvinceId)){CarriageEntity carriageEntity = findByTemplateType(CarriageConstant.SAME_PROVINCE);if(ObjectUtil.isNotEmpty(carriageEntity)){return carriageEntity;}}// 如果没查到或不是同省,则查询是否为经济区互寄  调用findEconomicCarriage方法查询CarriageEntity carriageEntity = findEconomicCarriage(receiveProvinceId,senderProvinceId);if(ObjectUtil.isNotEmpty(carriageEntity)){return carriageEntity;}// 如果没查到或不是经济区互寄,直接查跨省运费模板carriageEntity = findByTemplateType(CarriageConstant.TRANS_PROVINCE);if(ObjectUtil.isNotEmpty(carriageEntity)){return carriageEntity;}// 如果最后没查到,直接抛自定义异常,提示模板未找到if(ObjectUtil.isEmpty(carriageEntity)){throw new SLException(CarriageExceptionEnum.NOT_FOUND);}return null;}/*** 根据模板类型查询模板* @param templateType 模板类型:1-同城寄,2-省内寄,3-经济区互寄,4-跨省* @return 运费模板*/private CarriageEntity findByTemplateType(Integer templateType) {// 根据模板类型,及运输类型 = CarriageConstant.REGULAR_FAST 查询模板LambdaQueryWrapper<CarriageEntity> wrapper = Wrappers.<CarriageEntity>lambdaQuery().eq(CarriageEntity::getTemplateType, templateType).eq(CarriageEntity::getTransportType,CarriageConstant.REGULAR_FAST);return super.getOne(wrapper);}
计算重量方法
/*** 根据体积参数与实际重量计算计费重量** @param waybillDTO 运费计算对象* @param carriage   运费模板* @return 计费重量*/private double getComputeWeight(WaybillDTO waybillDTO, CarriageEntity carriage) {// 计算体积,如果传入体积则不需要计算Integer volume = waybillDTO.getVolume();if(ObjectUtil.isEmpty(volume)){try {volume=waybillDTO.getMeasureHigh()*waybillDTO.getMeasureLong()*waybillDTO.getMeasureWidth();} catch (Exception e) {//防止有null值throw new RuntimeException(e);}}// 计算体积重量  = 体积 / 轻抛系数  tips: 使用NumberUtil工具类计算 保留一位小数BigDecimal weightByV = NumberUtil.div(volume, carriage.getLightThrowingCoefficient(), 1);// 重量取大值 = 体积重量 和 实际重量 tips: 使用NumberUtil工具类计算   保留一位小数double weight = NumberUtil.max(weightByV.doubleValue(), NumberUtil.round(waybillDTO.getWeight(), 1).doubleValue());// 计算续重,规则:不满1kg,按1kg计费;if(weight<=1){return 1;}// 10kg以下续重以0.1kg计量保留1位小数;if(weight<=10){return weight;}// 100kg以上四舍五入取整  举例:108.4kg按照108kg收费 108.5kg按照109kg收费// tips: 使用NumberUtil工具类计算if(weight>=100){return NumberUtil.round(weight,0).doubleValue();}// 10-100kg续重以0.5kg计量保留1位小数;// 0.5为一个计算单位,举例:18.8kg按照19收费, 18.4kg按照18.5kg收费 18.1kg按照18.5kg收费int i=NumberUtil.round(weight, 0, RoundingMode.DOWN).intValue();//向下取整if(NumberUtil.sub(weight,i)==0){return weight;}else if(NumberUtil.sub(weight,i)<=0.5){return NumberUtil.add(i,0.5);}else{return NumberUtil.add(i,1);}}

Redis存入热点数据

思考:根据模板类型查询模板时需要频繁的查询数据库,性能较低,而且模板数据不会频繁变化,查询次数多,属于热点数据

所以可以使用redis存储模板entity类数据,

使用hash结构。大key->template 小key->发件城市id_收件城市

1.从nacos导入共享redis配置

spring:cloud:nacos:username: nacospassword: nacosserver-addr: 192.168.150.101:8848discovery:namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdcip: 192.168.150.1config:namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdcshared-configs: #共享配置- data-id: shared-spring-seata.ymlgroup: SHARED_GROUPrefresh: false- data-id: shared-spring-mysql.ymlgroup: SHARED_GROUPrefresh: false- data-id: shared-spring-mybatis-plus.ymlgroup: SHARED_GROUPrefresh: false
#            导入redis共享配置- data-id: shared-spring-redis.ymlgroup: SHARED_GROUPrefresh: false

这是共享redis配置文件的内容,可以发现里面的值并没有进行定义,那在哪定义了呢

其实共享配置文件是定义了文件的结构,具体的内容由微服务的配置文件自己配置 

具体的配置在sl-express-ms-carriage.properties运费微服务自己的配置文件当中定义

 

2.自定义RedisTemplate,自定义序列化和反序列化方式

存入value值时使用json序列

@Configuration//告诉Spring这是一个配置类,并让Spring加载这个类
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();//默认的key序列化器为:JdkSerializationRedisSerializer//我们改成StringRedisSerializer//键序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//值序列化// 创建一个json的序列化方式GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置value用jackjson进行处理redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//key hashMap序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());//value hashMap序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//连接工厂redisTemplate.setConnectionFactory(factory);return redisTemplate;}}

 3.修改代码

    @Resourceprivate RedisTemplate redisTemplate;@Overridepublic CarriageDTO compute(WaybillDTO waybillDTO) {//TODO day02 计算运费HashOperations operations = redisTemplate.opsForHash();// 根据参数查找运费模板 调用findCarriage方法//CarriageEntity carriage = findCarriage(waybillDTO);/** 根据模板类型查询模板时需要频繁的查询数据库,性能较低,而且模板数据不会频繁变化,查询次数多,属于热点数据* 可以存于redis中,使用hash结构。大key->template 小key->发件城市id_收件城市*///组装小keyString sKey = String.join("_", waybillDTO.getSenderCityId() + "", waybillDTO.getReceiverCityId() + "");//先从redis中查数据CarriageEntity carriage= (CarriageEntity) operations.get(RedisConstant.templateCode, sKey);if(ObjectUtil.isEmpty(carriage)){//redis没有改数据,就从数据库中查询carriage=findCarriage(waybillDTO);if(ObjectUtil.isEmpty(carriage)){return null;}//将数据存入redisoperations.put(RedisConstant.templateCode,sKey,carriage);}// 计算重量,最小重量为1kg 调用getComputeWeight方法double weight = getComputeWeight(waybillDTO, carriage);// 计算运费  运费 = 首重价格 + (实际重量 - 1) * 续重架构double money=carriage.getFirstWeight()+(weight-1)*carriage.getContinuousWeight();// 结果四舍五入保留一位小数money=NumberUtil.round(money,1).doubleValue();// 封装运费和计算重量到 CarriageDTO,并返回CarriageDTO carriageDTO = CarriageUtils.toDTO(carriage);carriageDTO.setComputeWeight(weight);carriageDTO.setExpense(money);return carriageDTO;}

4.存入数据时报错

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module 
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through 
reference chain: java.util.ArrayList[0]->com.zym.entity.Banner["gmtCreate"])

解决:

导入依赖

<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.12.3</version></dependency>

给LocalTime数据类型的成员变量规定序列化方式和反序列化方式

@Data
public abstract class BaseEntity implements Serializable {@TableIdprivate Long id; //主键id@TableField(fill = FieldFill.INSERT) //MP自动填充@JsonDeserialize(using = LocalDateTimeDeserializer.class)		// 反序列化@JsonSerialize(using = LocalDateTimeSerializer.class)		// 序列化private LocalDateTime created;@TableField(fill = FieldFill.INSERT_UPDATE)@JsonDeserialize(using = LocalDateTimeDeserializer.class)		// 反序列化@JsonSerialize(using = LocalDateTimeSerializer.class)		// 序列化private LocalDateTime updated;
}

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

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

相关文章

Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

前言 相信大家在刷算法题的过程中&#xff0c;好不容易想出来大概的思路&#xff0c;也知道去用哪个集合类&#xff0c;但各个集合类的一些命令都长得太像&#xff0c;很容易将他们弄错&#xff0c;并且在各集合之间的转化也是特别烦人&#xff0c;还有很多实用的函数都知道可…

【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART&#xff08;Classification and Regression Tree&#xff09; CART&#xff08;分类与回归树&#xff09;是一种用于分类和回归任务的决策树算法&#xff0c;提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集&#xff0c;从而构建一棵树。CART …

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《船舶物资与市场》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《船舶物资与市场》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国船舶集团有限公司 主办单…

「Mac畅玩鸿蒙与硬件41」UI互动应用篇18 - 多滑块联动控制器

本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块&#xff0c;动态控制不同参数&#xff08;如红绿蓝三色值&#xff09;&#xff0c;并实时显示最终结果。我们将以动态颜色调节为例&#xff0c;展示如何结合状态管理和交互逻辑&#xff0c;打造一个高级的…

利用红黑树封装map,和set,实现主要功能

如果不知道红黑树是什么的时候可以去看看这个红黑树 思路 首先我们可以把封装分为两个层面理解&#xff0c;上层代码就是set,和map&#xff0c;底层就是红黑树 就相当于根据红黑树上面套了两个map,set的壳子&#xff0c;像下面这张图一样 对于map和set&#xff0c;map里面存…

汽车网络安全 -- IDPS如何帮助OEM保证车辆全生命周期的信息安全

目录 1.强标的另一层解读 2.什么是IDPS 2.1 IDPS技术要点 2.2 车辆IDPS系统示例 3.车辆纵深防御架构 4.小结 1.强标的另一层解读 在最近发布的国家汽车安全强标《GB 44495》,在7.2节明确提出了12条关于通信安全的要求,分别涉及到车辆与车辆制造商云平台通信、车辆与车辆…

R语言机器学习论文(二):数据准备

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据描述二、数据预处理(一)修改元素名称(二)剔除无关变量(三)缺失值检查(四)重复值检查(五)异常值检查三、描述性统计(一)连续变量数据情…

java基础语法光速入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理Java的基础语法部分 适合有编程基础的人快点掌握语法使用 没学过一两门语言的话。。还是不建议看了 极致的浓缩没有一点解释 注释 单行注释 // 多行注释 /**/ 数据类型 布尔型:true false 整型:int,lon…

【Linux】常用命令二

声明&#xff1a;以下内容均学习自《Linux就该这么学》一书。 1、cat 用于查看内容较少的纯文本文件。 参数-n可以显示行号。 2、more 用于查看内容较多的纯文本文件。 它会在最下面使用百分比的形式来提示你已经月读了多少内容&#xff0c;你可以使用空格键或回车键向下翻…

springboot利用easypoi实现简单导出Excel

vue springboot利用easypoi实现简单导出 前言一、easypoi是什么&#xff1f;二、使用步骤 1.传送门2.前端vue3.后端springboot 3.1编写实体类&#xff08;我这里是dto,也一样&#xff09;3.2控制层结尾 前言 今天玩了一下springboot利用easypoi实现excel的导出&#xff0c;以前…

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势&#xff1f; 重要性&#xff1a;⭐⭐⭐ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练…

STM32 PWM波形详细图解

目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二&#xff1a; 3.2.2 步骤三&#xff1a; 3.2.3 步骤四五六七&#xff1a; …

洛谷 B2029:大象喝水 ← 圆柱体体积

【题目来源】https://www.luogu.com.cn/problem/B2029【题目描述】 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但现在只有一个深 h 厘米&#xff0c;底面半径为 r 厘米的小圆桶 &#xff08;h 和 r 都是整数&#xff09;。问大象至少要喝多少桶水才会解渴。 …

使用docker部署GBase8s数据库(jdk安装,docker安装,GBase部署)

jdk安装步骤 1.将压缩包上传到/opt/software 2.解压到/opt/module tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module 3.配置环境变量 3.1 在/etc/profile.d目录下创建my_env.sh sudo touch my_env.sh 3.2在文件中添加内容 sudo vim my_env…

嵌入式 C 编程:const 关键字 —— 打造稳定的常量空间

目录 一、const关键字的基本含义与用法 1.1. 修饰基本数据类型 1.2. 修饰指针 1.3. 修饰数组 1.4. 修饰结构体 二、const关键字在嵌入式编程中的优势 2.1. 提升代码可读性 2.2. 增强代码安全性 2.3. 优化内存使用 2.4. 促进模块化设计 2.5. 支持静态分析和测试 三、…

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

git查看本地库对应的远端库的地址

git查看本地库对应的远端库的地址 git remote -v 如果想要查看特定的远端库的url地址&#xff0c;可以使用如下命令&#xff0c;其中origin是默认的远端库的名称&#xff0c;可以使用其他远端库的名称 get remote get-url origin

深入解析级联操作与SQL完整性约束异常的解决方法

目录 前言1. 外键约束与级联操作概述1.1 什么是外键约束1.2 级联操作的实际应用场景 2. 错误分析&#xff1a;SQLIntegrityConstraintViolationException2.1 错误场景描述2.2 触发错误的根本原因 3. 解决方法及优化建议3.1 数据库级别的解决方案3.2 应用层的解决方案 4. 友好提…