jdk8

2023-10-26

最近呢,看到应该系统应用中有一个一二级缓存模块的设计(基于google guava和redis的一二级缓存设计实现),早期设计虽然鉴于当时实践考虑已经自我感觉涉及还不错,但是最近再看到这块代码,有一种想要继续提炼升华的冲动。鉴于此,有了本篇中在设计中基于Supplier的实践场景应用。

1.场景再现

类图

如上图,抽象类AbstractCacheManager<K,HK,V>的若干个子类实现了相关方法,但是部分方法依然存在冗余特征。

我们来看一下子类的实现示例

/**
 * @description: 行政编码-缓存管理器
 * @Date : 2019/5/5 下午5:32
 * @Author : 石冬冬-Seig Heil
 */
@Component
@Slf4j
public class SimpleDistrictCacheManager extends AbstractCacheManager<String,String,Result<List<SimpleDistrictRe>>> {

    @Autowired
    DiamondConfig diamondConfig;

    @Autowired
    DictionaryRegFacade dictionaryRegFacade;
    /**
     * short name
     */
    final String SHORT_NAME = CacheShortName.simpleDistrictCache.name();
    /**
     * 省份列表缓存key
     */
    final String PROVINCE_CACHE_KEY = "provinceCache";
    /**
     * 二级行政缓存key
     */
    final String SECONDARY_DISTRICT_CACHE_KEY = "secondaryDistrictCache";
    /**
     * 行政缓存key
     */
    final String DISTRICT_CACHE_KEY = "districtCache";
    /**
     * 联动缓存 Key 前缀
     */
    final String GANGED_CACHE_KEY = "gangedCache";
    /**
     * 默认失效时间-2小时(单位秒)
     */
    final long DEFAULT_EXPIRE_SECONDS = 7200;
    /**
     * 根据父级行政查询下级
     * @param parentCode
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode){
        if(!useCache()){
            return dictionaryRegFacade.queryCitiesByParentCode(parentCode);
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(parentCode).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryCitiesByParentCode(parentCode))).build();
            queryResult = primaryCache().get(parentCode,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB,parentCode={}",SHORT_NAME,parentCode,e);
            queryResult = dictionaryRegFacade.queryCitiesByParentCode(parentCode);
            log.info("{} focus on an exception,then execute queryDB,parentCode={},value={}",SHORT_NAME,parentCode, JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询省份列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryProvinces(){
        if(!useCache()){
            return dictionaryRegFacade.queryProvinces();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(PROVINCE_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryProvinces())).build();
            queryResult = primaryCache().get(PROVINCE_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryProvinces();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询二级城市
     * @return
     */
    public Result<List<SimpleDistrictRe>> querySecondaryDistricts(){
        if(!useCache()){
            return dictionaryRegFacade.querySecondaryDistricts();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(SECONDARY_DISTRICT_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.querySecondaryDistricts())).build();
            queryResult = primaryCache().get(SECONDARY_DISTRICT_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryProvinces();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询所有行政列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryAll(){
        if(!useCache()){
            return dictionaryRegFacade.queryAll();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(DISTRICT_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryAll())).build();
            queryResult = primaryCache().get(DISTRICT_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryAll();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 联动查询行政列表
     * @param dto
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryWithGanged(DistrictGangedDTO dto) {
        if(!useCache()){
            return dictionaryRegFacade.queryWithGanged(dto);
        }
        Result<List<SimpleDistrictRe>> queryResult;
        StringBuilder keyBuilder = new StringBuilder(GANGED_CACHE_KEY).append(":").append(dto.getRegLevel());
        if(StringTools.isNotEmpty(dto.getGbCode())) {
            keyBuilder.append(":").append(dto.getGbCode());
        }
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(keyBuilder.toString()).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryWithGanged(dto))).build();
            queryResult = primaryCache().get(keyBuilder.toString(),() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryWithGanged(dto);
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    @Override
    public Cache<String, Result<List<SimpleDistrictRe>>> primaryCache() {
        return SimpleDistrictCacheFactory.get();
    }

    @Override
    public boolean useCache() {
        boolean useCache = false;
        try {
            useCache = cacheSwitch().simpleDistrictEnable;
            log.info("{} useCache={}",SHORT_NAME,useCache);
        } catch (Exception e) {
            log.error("{} useCache={}",SHORT_NAME,useCache,e);
        }
        return useCache;
    }

    @Override
    public String shortName() {
        return SHORT_NAME;
    }

}

如上述子类SimpleDistrictCacheManager,在实现抽象类相关方法时,并对外部提供的相关方法,譬如Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode) Result<List<SimpleDistrictRe>> queryProvinces()
我们仔细发现都存在相同的业务动作。

  • 判断是否开启缓存,关闭时从数据库加载。
  • 构建上下文对象CacheContext,然后调用primaryCache().get(x,() -> super.getFromSecondary(context))方法。
  • 而且都通过try…catch…包裹。

分析上述业务动作,这就是明显的模板方法,鉴于此,我们把每个子类共同冗余的模板动作提取到抽象类AbstractCacheManager中。

提取一个公共方法V fromCache(K key,CacheContext<V> context,Supplier<V> dataSourceCaller)如下:

/**
 * 从缓存中获取数据
 * 执行逻辑:
 * (1)、缓存开关关闭时,从 dataSourceCaller 获取。
 * (2)、缓存开关开启时,从一级缓存获取,一级缓存没有则从二级缓存获取。
 * @param key 缓存Key
 * @param context 构建缓存上下文对象
 * @param dataSourceCaller 数据库查找回调器
 * @return
 */
V fromCache(K key,CacheContext<V> context,Supplier<V> dataSourceCaller){
    final String SHORT_NAME = shortName();
    if(!useCache()){
        return dataSourceCaller.get();
    }
    V queryResult;
    try {
        queryResult = primaryCache().get(key,() -> getFromSecondary(context));
    } catch (ExecutionException e) {
        log.info("[{}]ExecutionException,degraded queryDB",SHORT_NAME,e);
        queryResult = dataSourceCaller.get();
        log.info("[{}]ExecutionException,degraded queryDB={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
    }
    return queryResult;
}

上述,既然抽象类AbstractCacheManager<K,HK,V>定义为泛型,其中K为缓存key,HK为缓存小Key,V作为缓存加载的返回值。所以我们根据规约,封装
如上方法,我们使用了一个jdk8中的一个函数,Supplier<T>,该函数通过获取可以拿到我们指定类型的返回值<V>

修改SimpleDistrictCacheManager的方法实现

@Component
@Slf4j
public class SimpleDistrictCacheManager extends AbstractCacheManager<String,String,Result<List<SimpleDistrictRe>>> {

    @Autowired
    DictionaryRegFacade dictionaryRegFacade;
    /**
     * short name
     */
    static final String SHORT_NAME = CacheShortName.simpleDistrictCache.name();
    /**
     * 省份列表缓存key
     */
    static final String PROVINCE_CACHE_KEY = "provinceCache";
    /**
     * 二级行政缓存key
     */
    static final String SECONDARY_DISTRICT_CACHE_KEY = "secondaryDistrictCache";
    /**
     * 行政缓存key
     */
    static final String DISTRICT_CACHE_KEY = "districtCache";
    /**
     * 联动缓存 Key 前缀
     * {0} 行政级别
     * {1} 国标码
     */
    static final String GANGED_CACHE_KEY_PATTERN = "gangedCache:{0}:{1}";
    /**
     * 默认失效时间-2小时(单位秒)
     */
    static final long DEFAULT_EXPIRE_SECONDS = 7200;
    /**
     * 根据父级行政查询下级
     * @param parentCode
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode){
        return fromCache(parentCode,
                buildContext(parentCode,() -> Optional.ofNullable(dictionaryRegFacade.queryCitiesByParentCode(parentCode))),
                () -> dictionaryRegFacade.queryCitiesByParentCode(parentCode));
    }

    /**
     * 查询省份列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryProvinces(){
        return fromCache(PROVINCE_CACHE_KEY,
                buildContext(PROVINCE_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.queryProvinces())),
                () -> dictionaryRegFacade.queryProvinces());
    }

    /**
     * 查询二级城市
     * @return
     */
    public Result<List<SimpleDistrictRe>> querySecondaryDistricts(){
        return fromCache(SECONDARY_DISTRICT_CACHE_KEY,
                buildContext(SECONDARY_DISTRICT_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.querySecondaryDistricts())),
                () -> dictionaryRegFacade.querySecondaryDistricts());
    }

    /**
     * 查询所有行政列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryAll(){
        return fromCache(DISTRICT_CACHE_KEY,
                buildContext(DISTRICT_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.queryAll())),
                () -> dictionaryRegFacade.queryAll());
    }

    /**
     * 联动查询行政列表
     * @param dto
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryWithGanged(DistrictGangedDTO dto) {
        String cacheKey = MessageFormat.format(GANGED_CACHE_KEY_PATTERN,dto.getRegLevel(),dto.getGbCode());
        return fromCache(cacheKey,
                buildContext(cacheKey,() -> Optional.ofNullable(dictionaryRegFacade.queryWithGanged(dto))),
                () -> dictionaryRegFacade.queryWithGanged(dto));
    }

    /**
     * 构建缓存上下文对象
     * @param cacheKey 缓存key
     * @param supplier 数据库接口查询回调
     * @return
     */
    CacheContext<Result<List<SimpleDistrictRe>>> buildContext(String cacheKey,Supplier<Optional<Result<List<SimpleDistrictRe>>>> supplier){
        return  CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                .key(cacheKey).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                .callback(supplier).build();
    }

    @Override
    public Cache<String, Result<List<SimpleDistrictRe>>> primaryCache() {
        return SimpleDistrictCacheFactory.get();
    }

    @Override
    public boolean useCache() {
        boolean useCache = false;
        try {
            useCache = cacheSwitch().simpleDistrictEnable;
            log.debug("{} useCache={}",SHORT_NAME,useCache);
        } catch (Exception e) {
            log.error("{} useCache={}",SHORT_NAME,useCache,e);
        }
        return useCache;
    }

    @Override
    public String shortName() {
        return SHORT_NAME;
    }

}

只需要调用抽象类的 fromCache方法即可,同时在类,进而把CacheContext的对象实例构建提取了一个方法。就是如下:
但是总体上发现这些对外提供的方法清爽简洁了许多(try…catch不见了诶等等)。

/**
 * 构建缓存上下文对象
 * @param cacheKey 缓存key
 * @param supplier 数据库接口查询回调
 * @return
 */
CacheContext<Result<List<SimpleDistrictRe>>> buildContext(String cacheKey,Supplier<Optional<Result<List<SimpleDistrictRe>>>> supplier){
    return  CacheContext.<Result<List<SimpleDistrictRe>>>builder()
            .key(cacheKey).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
            .callback(supplier).build();
}

2.Supplier

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

该函数可以返回指定类型,通过标注@FunctionalInterface,声明该方法支持lambda表达式。
在JDK8之前,我们通过需要new Supplier并实现get()方法,这也就是所谓内部匿名类的实现方式。
而JDK8 lambda就是简化这一冗余的代码,只需要 () -> xx一个代码语义表达即可。

3.总结

其实,JDK,stream api大量通过BiFunctionBiConsumerFunctionPredicateConsummerSupplier函数实现函数式编程,而仔细
查看他们源码,发现都通过@FunctionalInterface标注一个注解,以支持lambda表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk8 的相关文章

  • Linux安装JDK8详细图文教程

    第一步 获取JDK文件 JDK下载包 xff1a 直接进入 如果跳转登录页面 xff0c 注册一个账号登录即可 登录过后文件就下载完成 第二步 上传JDK到服务器 1 创建JDK目录 span class token function mk
  • yum java8_CentOS8 安装 jdk8 / java8的教程(推荐)

    前言 最开始我是想在CentOS8上使用 wget 下载 xff0c 然后对它进行解压 xff0c 配置环境变量 xff0c 奈何搞了很长时间都没有搞好 xff0c 于是放弃 xff0c 使用yum直接安装 1 安装方法 CentOS8上使
  • Centos7 yum安装jdk8

    执行命令 yum span class token function install span java 1 8 0 openjdk y 安装完成后查看版本号 java version 如果发现安装慢的 xff0c 请参照我之前的博文 xf
  • Centos7安装jdk8

    Centos7安装jdk8 第一种方式 一 使用yum命令本地下载openjdk 1 查看当前是否安装了JDK 查看当前是否安装了JDK xff0c rpm qa grep i jdk 2 如果安装了就直接卸载 rpm ev 参数说明 q在
  • JDK8新特性:接口的静态方法和默认方法

    https blog csdn net aitangyong article details 54134385 在jdk8之前 xff0c interface之中可以定义变量和方法 xff0c 变量必须是public static fina
  • jdk16正式发布,你还在用jdk8吗?jdk16有啥新特性?下载地址

    新特性 下载地址 官方 xff1a https www oracle com java technologies javase jdk16 downloads html csdn资源windows xff1a https download
  • ubuntu1804源码编译jdk8

    这里纯粹自己弄着玩 xff0c 因为以前没有成功过 xff0c 这里记录一下 xff0c 就是让遇到问题的人可以规避问题 xff0c 快速编译自己的jdk 相信很多学java的人都看过或者了解过一本书 深入理解java虚拟机 xff0c 里
  • Centos7 安装jdk8

    使用rpm方式安装 1 jdk下载地址 xff1a https www oracle com java technologies downloads java8 2 安装 检测当前系统是否存在java环境 xff01 java versio
  • JDK8新特性(Lambda、Stream、Optional)

    文章目录 1 为什么使用Lambda表达式 xff1f 2 Lambda表达式的使用3 函数式 xff08 functional xff09 接口4 方法引用与构造器引用方法引用的使用构造器引用的使用 5 Stream APIStream
  • centos7+jdk8+安装Elasticsearch6.0

    一 xff1a 为Elasticsearch准备用户 1 添加用户 Elasticsearch6 0需要使用非root用户启动 root 64 66 adduser ela root 64 66 passwd ela 2 授权用户 查看文件
  • JDK1.8(jdk8.0)新特性

    Java is still not dead and people are starting to figure that out 本教程将用带注释的简单代码来描述新特性 xff0c 你将看不到大片吓人的文字 一 接口的默认方法 Java
  • jdk8

    文章目录 1 场景再现 2 Supplier
  • JDK8新特性-Function接口与BiFunction接口

    Function 接口 JDK8新增的函数式接口 接口只有一个抽象方法apply 接受一个T类型参数 返回一个R类型参数 T R表示泛型 可以相同 除了一个抽象的apply方法之外 Function存在两个默认的default方法 comp
  • JDK8新特性详解Lambda、StreamAPI、Optional等

    JDK8学习笔记 学习视频地址 https www bilibili com video BV1k64y1R7sA 操作代码 https gitee com rederic study jdk8 git 一 JDK8新特性 1 Lambda
  • java8之Stream-Collect操作

    文章目录 collect Collector in Action 收集器 Collectors 常用规约操作 规约到一个单独的值 把数据装进一个list中 将数据收集到一个Set中 把数据收集到一个Map中 Using other coll
  • JDK8安装及系统变量配置(包含错误处理)

    jdk安装 一 下载JDK 二 安装 三 配置系统变量 四 可能遇到的问题 1 显示已经安装的问题 或者 读取注册表项值失败 2 原因 3 解决 五 验证安装成功 一 下载JDK JDK下载官网 二 安装 双击之后 一直下一步就ok 三 配
  • Jdk8 foreach语法需要break怎么办?

    forEach里的return只相当于continue 没有break语法 在这里我总结了3种解决方案供你选择 exception filter anyMatch forEach里的return只相当于continue 没有break语法
  • jdk13快来了,jdk8的这几点应该看看!

    说明 jdk8虽然出现很久了 但是可能我们还是有很多人并不太熟悉 本文主要就是介绍说明一些jdk8相关的内容 主要会讲解 lambda表达式 方法引用 默认方法 Stream 用Optional取代null 新的日志和时间 Completa
  • Lambda表达式使用详细讲解

    目录 1 新思想 1 1函数式编程思想 1 2 函数式接口 2 通往lambda之路 2 1 什么是lambda表示式 2 2 lambda表示式有哪些特点 2 3 lambda表示式使用场景 2 4 lambda表示式语法 2 5 Lam
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt

随机推荐

  • 一次暴露面全开的红帽渗透测试【getshell】

    声明 本文仅限于技术讨论与分享 严禁用于非法途径 若读者因此作出任何危害网络安全行为后果自负 与本号及原作者无关 0x01 信息收集阶段 注 本次信息收集过程主要使用FOFA网络探测平台 https fofa info 一开始进行收集的时候
  • COCOAPI评价指标解析及改进

    程序入口 python eval coco py 特别说明 results test json格式如下 image id 19 category id 1 bbox 121 4 116 02 560 56 303 83 score 0 97
  • windows下安装redis和redis扩展

    windows下安装redis 下载地址 https github com MSOpenTech redis releases Redis 支持 32 位和 64 位 这个需要根据你系统平台的实际情况选择 这里我们下载 Redis x64
  • 链路mtu

    常常见到交换机和网卡说明中提到支持Jumbo Frame 但我一直对以太网的Jumbo Frame 巨帧 如何使用不太理解 今日在网上找到2则现摘录下来 相信看了以后大家会有收获 这是一种厂商标准的超长帧格式 专门为千兆以太网而设计 目前还
  • 移动硬盘需要格式化才能打开如何解决?

    当我们把移动硬盘接入 就提示需要格式化 这是对我们有多大的仇怨啊 其实不是这样的 当频繁使用可移动硬盘很容易造成损坏 有时甚至会提示格式化 而提示要格式化是硬盘出现了问题导致的 那么什么原因才会出现的情况呢 遇到移动硬盘需要格式化才能打开如
  • 【算法训练 (day2)】积木画(dp问题)

    目录 一 问题 题目描述 输入格式 输出格式 输出样例 二 解题思路 合法性判定 状态压缩 推导dp式 代码实现 一 问题 题目描述 小明最近迷上了积木画 有这么两种类型的积木 分别为 I 型 大小为 2 个单位面积 和 L 型 大小为 3
  • Spdlog库编译/交叉编译

    1 只包含头文件 速度很快 无需依赖第三方库 支持跨平台 Linux Windows on 32 64 bits 支持多线程 可对日志文件进行循环输出 可每日生成日志文件 可支持控制台日志输出 可选的异步日志 可定义日志格式 2 获取spd
  • centos7下opencv3.4.1 的安装和编译全解

    centos7下opencv3 4 1 的安装和编译全解 一 下载和安装 1 下载网址 https opencv org 注意系统版本 2 linux下依赖库安装 正式安装opencv之前 需要安装好opencv编译的依赖包 列举如下 1
  • 【Pandas】修改Pandas的行或列的名字(重命名)

    pandas DataFrame rename 使用函数 DataFrame rename mapper None index None columns None axis None copy True inplace False leve
  • 编译Android 2.3源码错误总结

    虽然版本2 3很老了 但是这是在完全新的Ubuntu上面编译的 可以使我们更加熟练 1 host C acp lt build tools acp acp c
  • BP神经网络在数据预测上的应用

    用BP神经网络做数据预测有两种形式 1 根据自身已有的数据预测未来的数据 比如 根据2000 2012年已知GDP的值预测2013年GDP的值 求解 用2000 2001 2002的值作为输入 2003作为输出 然后以此类推 2001 20
  • DEDE后台添加新变量出现:Request var not allow!的解决办法

    论坛上很多人都反馈说在后台添加新变量的时候会出现 Request var not allow 的BUG错误 本文主要就是介绍如何去解决这个问题 下面看具体操纵 在DEDE根目录打开 include common inc php 文件 查找到
  • pycharm 2019.2 安装包失败

    简介 最近使用学生账号注册了pycharm 貌似全家桶都可以免费用了 就升级了pycharm到最新版 但是在使用包管理 安装包的时候出错了 提示没有匹配的版本 下面还提示一个 trusted host pypi douban com 右下角
  • es搜索 核心指标_ElasticSearch核心知识总结(一)es的六种搜索方式和数据分析

    es的六种搜索方式 query string search GET ecommerce product search 查询所有数据 took 4 耗费几毫秒 timed out false 是否超时 shards 数据拆分成5个分片 对所有
  • Qt编写软件注册功能

    一 软件目的 应项目需求 需要为编写的软件添加一层保护 防止滥用 二 软件环境 Qt5 9 Windows 主要加密算法 MD5 MD5简单介绍 MD5是一种不可逆的加密算法 类似计算hash值 不同的数据字符无论长短 经过MD5计算后都会
  • Pip快速离线安装pytorch-gpu

    Pip快速离线安装pytorch gpu 1小节讲解涉及的基本概念 读者也可直接从2小节开始 1 安装pythorch涉及的基本组件概念 1 1 显卡驱动Driver 常识概念 此处略过 1 2 CUDA CUDA Compute Unif
  • 二维邮局选址问题-带权中位数

    算法设计练习作业 邮局选址问题 将自己写的分享 有问题请指正 希望共同学习 关于邮局选址问题的理论知识就不赘述了 网上有讲解的 include
  • Python 入门基础

    第一个Python程序之打印 Hello World print Hello World 字符串定义的三种方式 type 用了检测数据类型 单引号定义法 使用单引号进行包围 name 测试 print type name 双引号定义法 na
  • Mysql审核查询平台Archery部署

    目录 1 Archery产品介绍 2 基于docker搭建Archery 2 1 系统环境 2 2 安装 Docker 2 2 1 安装 Docker Compose 2 2 2 下载Archery 2 2 3 安装并启动 2 2 4 表结
  • jdk8

    文章目录 1 场景再现 2 Supplier