• 猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#


    空间复杂度、时间复杂度考虑进去有利于实现高质量代码

    空间复杂度、时间复杂度考虑进去有利于实现高质量代码、
    没有必要的for循环或者多余的for利用其他方法优化调。
    for循环里面不建议操作增删改查数据库,可以add好一个集合,批量插入数据库
    为了方便调用同一个方法的前提是不对速度影响,或或者极小,否则宁愿多写一个方法,而不是为了省事而调用同一个方法。
    多余的req和resp都是影响速度性能的潜在因素,所以建议减少不必要字段。
    如果数据量不大的查询性能慢,为什么不思考一下是代码空间复杂度、时间复杂度,nn,nn*n,(n+1)*n。。。呢

    该用户所在的部门树

    该用户所在的部门树
    根据用户id查询所在的部门和所有的父部门

    SELECT T2.id, T2.name 
    FROM ( 
        SELECT 
            @r AS _id, 
            (SELECT @r := parent_id FROM sys_dept WHERE id = _id) AS parent_id, 
            @l := @l + 1 AS lvl 
        FROM 
            (SELECT @r := #{deptId}, @l := 0) vars, 
            sys_dept h 
        WHERE @r <> 0) T1 
    JOIN sys_dept T2 
    ON T1._id = T2.id 
    ORDER BY T1.lvl DESC
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    组装redis key

        public final static String PARAMETER_PASSING_REDIS_KEY = "parameter:passing:{0}:{1}:{2}:{3}";
    
        @Test
        public void StringRedisKey() {
            Long merchantId = 1L;
            String dataRightsObjectCode = "REPORT_OBJECT";
            Long userId = 23L;
            String format = MessageFormat.format(PARAMETER_PASSING_REDIS_KEY,
                    merchantId.toString(),
                    dataRightsObjectCode,
                    userId.toString(),
                    UUID.randomUUID().toString().replace("-", ""));
            System.out.println(format);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    parameter:passing:1:REPORT_OBJECT:23:45f9b38b35f9490eb867ac2709355d7b
    
    
    
    • 1
    • 2
    • 3

    批量更新mybatis plus

    //条件
            UpdateWrapper updateWrapper  = new UpdateWrapper<>();
            updateWrapper.in("id", idList);
            //更新
            MchDataAuthConfigRule rule = new MchDataAuthConfigRule();
            rule.setStatus(100);
            int update = mchDataAuthConfigRuleMapper.update(rule, updateWrapper);
            log.info("update:{}", update);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    redis插入并且设置失效时间

        // 缓存条件对应的id
        redisUtil.hSet(genKey(req), req.getMonth().toString(), JSON.toJSONString(genProjectIds));
        redisUtil.hmSet(genKeyForOne(req), projectIdMap);
        // 为尽可能使2个key的失效时间一致,所以等2个都插入完毕后再设置失效时间
        redisUtil.getRedisTemplate().expire(genKey(req), EXPIRE_TIME, TimeUnit.SECONDS);
        redisUtil.getRedisTemplate().expire(genKeyForOne(req), EXPIRE_TIME, TimeUnit.SECONDS);
        return allProject ? genProjects : genProjects.stream()
            .filter(project -> ReportConstant.abnormal.equals(project.getAbnormalFlag())).collect(Collectors.toList());
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    为什么会没有内存了呢

    为什么会没有内存了呢?原因不外乎有两点:
    1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
    2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
    内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。
    内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

    1、当发生OOM时,服务已基本不可用,并且会出现以下明显报错信息。
    2.JVM启动参数设置 -XX:+HeapDumpOnOutOfMemoryError 当发生OOM时自动输出堆的内存快照
    -XX:HeapDumpPath=/tmp 输出目录将dump文件java_pid1.hprof拷到本地如果忘记设置启动参数,也可以通过命令行获取dump文件使用JDK自带的jmap命令:jmap -dump:format=b,file=heap.bin
    3、本地先安装eclipse, 再安装MAT(Memory Analyzer Tool)工具,使用mat工具打开java_pid1.hprof文件,根据mat可以快速定位问题

    预防
    1、根据业务合理设置java内存大小,以及不定时查看业务运行时内存使用情况, 及时调整内存大小。
    2、在写代码时,应该有意识避免写查询大对象sql。
    3、针对循环业务要有意识避免内存不能释放进而导致OOM。

  • 相关阅读:
    大数据项目实战(安装Hive)
    《c++程序设计》谭浩强课后习题答案 第三章
    8.1 建军 环境配置
    动物主题网页设计(学生期末作业必看)
    [谷粒商城笔记]08、环境-linux安装docker
    Java简系 - Java入门「一」
    IIC基本知识
    python装饰器(Decorator)
    【网络】HTTPS讲解(侧重于加密、秘钥、证书的讲解)
    JS导出文本为文本文件
  • 原文地址:https://blog.csdn.net/weixin_43206161/article/details/126809567