- 博客(72)
- 资源 (2)
- 收藏
- 关注
原创 MySQL 中的 distinct 和 group by 哪个效率更高
且由于distinct关键字会对所有字段生效,在进行复合业务处理时,group by的使用灵活性更高,group by能根据分组情况,对数据进行更为复杂的处理,例如通过having对数据进行过滤,或通过聚合函数对数据进行运算。在大多数例子中,DISTINCT可以被看作是特殊的GROUP BY,它们的实现都基于分组操作,且都可以通过松散索引扫描、紧凑索引扫描(关于索引扫描的内容会在其他文章中详细介绍,就不在此细致介绍了)来实现。为什么在语义相同,有索引的情况下,group by和distinct效率相同?
2024-09-06 10:08:35 1628
原创 一致性哈希实现
一致性Hash算法引入了一个虚拟节点机制,即对每个服务器节点计算出多个hash值,它们都会映射到hash环上,映射到这些虚拟节点的对象key,最终会缓存在真实的节点上。引入虚拟节点的同时也增加了新的问题,要做虚拟节点和真实节点间的映射,对象key->虚拟节点->实际节点之间的转换。想到之前十亿数据迁移的时候用到了哈希分桶,当时有同步验证一致性哈希的性能,这里记录下一致性哈希的实现方法。实现一致性哈希算法主要是为了均衡的分桶,为了避免数据倾斜的问题,加入了虚拟节点。哈希算法用的是MurMurHash3。
2024-09-05 15:52:21 177
原创 10亿数据如何快速插入MySQL?
要首先确认约束条件,才能设计方案。确定面试官主要想问的方向,例如1T文件如何切割为小文件,虽是难点,然而可能不是面试官想考察的问题。从数据规模看,需要分库分表,大致确定分表的规模。从单库的写入瓶颈分析,判断需要进行分库。考虑到磁盘对并发写的支持力度不同,同一个库多个表写入的并发需要限制。并且支持动态调整,方便在线上环境调试出最优值。MySQL innodb、myisam 存储引擎对写入性能支持不同,也要在线上对比验证数据库批量插入的最佳阈值需要反复测试得出。
2024-08-27 19:49:29 786
原创 优化SQL的方法
使用join实现,但不适合join太多表,阿里巴巴开发者手册的规定,join表的数量不应该超过3个,join表数量太多时,会导致mysql在选错索引。一般SQL优化第一考虑的是索引优化,可使用explain命令,查看MySQL的执行计划,确认SQL是否有走索引。相对连接查询,子查询使用in关键字实现,具有结构化,相对简单,但是需要创建和删除临时表,增加资源消耗。索引可提升SQL效率,但索引需要额外的存储空间,而且还会有一定的性能消耗。left join,两个表的交集,以及左表剩余的数据,左表为驱动表。
2024-04-26 18:29:39 2001 2
原创 HIVE优化之map和reduce数量
如果表table_a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并。一般来讲,map 数量默认,不需要我们设置,一般情况下,Hive 自己就可以知道到底使用多少个map。
2024-01-16 15:39:40 1349 1
原创 left join NULL踩坑
这种原本的写法感觉不是很好,会导致误解,之后接手的人不了解这里,很容易就改出问题了。其实把字符串‘NULL’,换成别的更容易理解的字符串,也是完全不影响结果的,而且更好理解。之后写代码可以注意这里。
2024-01-16 11:34:17 653
原创 账单姓名身份证自然年去重(十亿数据中实时去重)
这个需求是今年做的最大的需求了。涉及了大数据BDP HIVE,十亿级的数据迁移;Redis新集群,容量优化;迁移脚本写入Redis速度的优化;Redis抖动的兜底和恢复机制。有一些感觉上还比较巧妙的方法,起到了四两拨千斤的效果。比如使用当前年份作为Redis Set中key的一部分,能够有效避免跨年的问题,并且不设置有效期,通过年定时任务来进行去年key的清理,也避免了年中上线有效期计算的问题。方法简洁且有效的解决了需求问题。
2024-01-15 10:15:07 977
原创 (转载保存)NotePad++针对一批数据批量添加双引号和逗号以及去除空格的处理技巧
NotePad++针对一批数据批量添加双引号和逗号以及去除空格的处理技巧
2023-11-07 10:50:15 777
原创 生产慢查询问题分析
由于mysql在真正执行语句的时候,并不能准确的知道满足这个条件的记录有多少,只能通过统计信息来估算记录,而优化器并不是非常智能的,就有可能发生索引跳变的情况,这种情况很难在测试的时候复现出来,生产也可能是突然出现,所以我们只能在使用上尽量的去降低索引发生跳变的可能性,尽量避免出现该问题。我们可以在创建索引和使用sql的时候通过以下几个点进行检视。(1) 索引的创建。
2023-07-11 16:13:13 242
原创 含生僻字中文校验方式优化
项目姓名校验原本一直是通过utf8正则进行校验,但近期出现的客户生僻字包含双码字,原有校验方式无法实现。需要修改扩大校验范围。
2023-07-10 14:38:43 1477 2
原创 Java服务凌晨自动补传文件存储系统上传失败的文件
腾讯文件存储的COS系统时而有抖动的现象,导致文件上传失败。而这些文件对客户查记录来说有很重要,所以需要一种兜底机制,在文件存储COS系统不可用的情况下,仍然能保存图片,在COS可用之后重新上传,提高系统的总体可用性
2023-05-29 17:03:09 179
原创 Java服务xml格式请求HttpServletRequest转Json
新的限流方法需要从请求中读取appid,实现appid级的限流。功能开发完在测试环境中跑没有问题,测试也没有发现问题。但上线后却直接抛异常,看了下日志,是个固定appid,从request读取的时候拿不到。仔细查看后,发现这个appid对应的客户采用的xml的格式请求,不是JSON的!解决的思路是,拿到请求后,先判断请求头里的请求格式,如果是xml格式,则先转成JSON。从网上找到两种xml转JSON的方法,详见参考文件。如果请求是xml,最后一行jackson读值的时候就会报错。
2023-05-26 11:32:20 508
原创 拦截器实现接口限流
通过以上几步,就可以简单实现拦截器限流的方式。之后如果需要在服务接口响应之前做些公共操作也可以考虑拦截器的方式。方便且容易实现,步骤很清晰,可以专注于功能本身的开发。
2023-05-18 17:53:37 295
原创 记录线上排查内存泄露问题
记录一次云上排查内存泄露的问题,最近监控告警云上有空指针异常报出,于是找到运维查日志定位到具体是哪一行代码抛出的空指针异常,
2023-05-06 10:16:24 528
原创 restTemplate未设置连接数导致服务雪崩问题
RestTemplate和Spring提供的JdbcTemplate类似,对象一旦构建(使用过程中不对其属性进行修改)就是线程安全的,多线程环境下可以安全使用。第三方库提供的各种方便的类,简化了编码复杂度,方便了开发者。使用不恰当时,细微的编码可能埋藏着大的隐患。精雕细琢,精益求精。
2023-03-17 10:59:26 1314
原创 nginx location =踩坑
部署前端网页项目到nginx时,前端html打包给我,我放到docker nginx的指定目录里(/usr/share/nginx/html),但访问一直报404,看nginx日志,error是:[error] 31#31: *1 open() "/etc/nginx/html/index.html"
2023-03-04 13:42:26 1106
原创 crmeb商城部署(踩坑及解决方法)
源码地址:原版是PHP版,我也不懂PHP,但看到功能很全,而且有docker-compose的脚本可以部署,并且教程也很完善,就拿来部署试下。所以也适用于和我一样,不懂PHP,从Java过来的同学,直接部署使用。
2023-03-02 15:01:26 2241
原创 list.size()阻塞踩坑
因为在遍历list时,会获取个锁来保证遍历的原子性,如果其他线程正在修改list,则size()方法需要等待该锁被释放才能继续执行,这可能导致阻塞。最后,组内的大佬说,可能是list.size()的问题,list.size()查看大小的时候也是阻塞的,可能别的线程还在插入,list.size()查看的时候把list阻塞了。今天导师在群里问下面这段代码,list也改了线程安全的List,循环一万次往list里塞元素,为什么看size都是小于一万的,而且每次的值都是不一样的?仔细看了代码,确实也感觉奇怪。
2023-02-22 16:43:39 558
原创 guava本地缓存CacheLoader使用
最近代码里看到有部分关于guava写本地缓存的,学习记录一下。首先guava的本地缓存可以理解成一个缓存map,以kv的形式存数据,不会持久化,没有支持分布式。比redis使用起来方便,不用引入额外的组件。如果是单机缓存的话,可以首先选择使用这种缓存方式。Guava cache的设计来源于CurrentHashMap,是线程安全的,可以按照多种策略来清理存储在其中的缓存值且保持很高的并发读写性能。常见应用场景:对性能有非常高的要求、不经常变化、占用内存不大、有访问整个集合的需求、数据允许不时时一致。多种清理
2022-12-05 17:22:37 2403
原创 MySQL查询优化实例
导语 通过几个小实例,对实际会经常用到的查询进行对比,通过MySQL的执行计划分析语句的执行性能,最后分析几个在实际中会遇到的小问题。我们知道一般应用系统的读写比列在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化是非常重要的。
2022-11-16 17:00:44 711
原创 RatSLAM配置(MATLAB版)
最近开始写毕业论文,为了跑实验,先试一下RatSLAM。RatSLAM简介RatSLAM系统使用啮齿动物海马的计算模型执行基于视觉的SLAM。RatSLAM能够在室内和室外环境中执行实时在线SLAM。源代码地址:数据集:配置方法:代码解析:...
2022-11-14 20:02:54 1354 13
原创 Mybatis的sql语句执行异常后打印到日志
最近做的一个运维提的需求。希望插入和更新的sql语句时,如果执行失败,能打印到一个专门的日志文件里。他可以用来恢复数据库里的数据。在网上调研了下可以实现这个功能的方案:1、可以通过Mybatis拦截器可以获取到执行的sql语句2、由于我们的数据库都是异步写的,所以会存在多线程的问题,如果用一个变量存,可能会出现这条sql还没读出来就被别的线程的sql语句覆盖的问题,线程不安全。所以考虑用ThreadLocal存Mybatis拦截器的sql语句。
2022-11-14 19:52:53 2301
原创 深圳保诚后端Java社招面试
一面的时候问到日常有没有加班,答曰没有,六点人都走了,有时候你想加都没人陪你,和前端联调着,一到六点对面人就没了,大家都走了,你也只好下班。一面通过后,需要完成一份大作业,会给出一个场景,我的是租车预约,写出相应的程序,设计文档。深圳数字化研发中心是独立的核心业务,具有自己的不可替代性,而且业务也是非常重点的业务,有长期的发展和规划,这点你大可放心。首先进行笔试,全英文,大概题目包括一些计算机基础的选择题,测试用例题,sql语句题,根据情景写代码的题。就现在而言,看起来确实是个好的选择,但还不是最好的。..
2022-08-16 18:20:59 1275 6
原创 珠海金山面试复盘
高级Java开发,要求3到5年经验,简历因工作经验太短被业务方拒了一次,又被HR推荐一次后捞起。一面1.15小时问题答得还行,80%都答出来了。而且聊了一个多小时,感觉还可以,结果还是被挂了。两天没怎么睡好觉,仔细回忆了下原因。首先,项目讲的太拉胯了,这么久了第一次开始面试,面试经验太少,说话都不流利。面试官开始说,讲个参与度最高的项目,我想都没想就讲了搜索旁支,因为完全是自己一个人做的,所以参与度100%。中间也有问一些问题,都有答出来。以为后面还会让讲最复杂的项目,结果并没有,直接开始问八股文了。估计开
2022-07-05 20:23:19 278
原创 链表有环,快慢指针走3步可以吗
先说结果,可以走三步,但没必要,反而会影响效率。下面是推导过程,摘自stackflow。设非环的部分走了s步,环t步,快指针速度是慢指针的k倍,快慢指针在距离环开头的 j 步处相遇。那么,相遇时,慢指针走了s+j,快指针走了s + j + m * t,(m是快指针在环中的圈数)此时,快指针走的距离时慢指针的k倍,则有等式:变换一下:根据上面的公式可知,等式左边是慢指针走的步数,是等式右边环长度的倍数,慢指针步数s + j是整数,环长度t也是整数,(m / k-1)中,k-1>0,在其他量都确定的情况
2022-06-23 16:36:43 1019 1
原创 零拷贝底层剖析
零拷贝字面上的意思包括两个,“零”和“拷贝”:“拷贝”:就是指数据从一个存储区域转移到另一个存储区域。“零” :表示次数为0,它表示拷贝数据的次数为0。合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域咯。做服务端开发的小伙伴,文件下载功能应该实现过不少了吧。如果你实现的是一个web程序,前端请求过来,服务端的任务就是:将服务端主机磁盘中的文件从已连接的socket发出去。关键实现代码如下:while((n = read(diskfd, buf, BUF_SIZE)) > 0) writ
2022-06-23 10:49:15 139
原创 Java类似引用传参的方法
由于是C++转Java,之前一直习惯了用引用传递。虽然已经转变过来了,但还是有些场景,确实用引用传参方便。比如在之前的代码上做修改,需要在循环中的处理函数传出个计数的值,在循环外定义这个值保存,但如果用Integer直接传入,处理函数逻辑里面累加的话,循环外的值不会随之改变,不能实现计数的目的。此时如果像C++一样能够引用传递,便能轻松避免这个问题。—————————————————————————————————————————关键字Reference还是同事跟我说的方法,可以用Reference包装
2022-06-01 19:48:38 317
原创 网站加载图片速度提升
发现网站加载图片速度很慢,于是尝试去找了一下经济又高效的加速方案。基本分为三种:提升服务器带宽、OSS云存储和CDN加速。OSS的基础上还能进一步用CDN加速,不过费用就要进一步提升了。1、提升服务器带宽因为现在是在服务器里自建的文件存储系统,相当于用的是服务器本身的带宽,所以加载图片的时候会收到服务器带宽瓶颈的限制。所以可以直接加钱升服务器带宽来解决,不过要综合对比考虑一下经济性。如果每月增加5Mbps带宽,每月需要额外增加400的费用。2、OSS云存储OSS云存储是直接采用云存储系统,等于
2022-05-23 17:18:32 2376
原创 SpringBoot应用刚启动时服务报大量超时的问题
刚转Java,每次项目要更新线上的时候。虽然操作非常缓慢且小心,按照摘除负载、更新容器、等待一段时间、恢复负载的严格步骤来操作,Nginx那边依然会报许多的503超时告警。搞得之后每次更新线上都胆战心惊。暂时的解决方法网上类似的情况举例研究深层次的原因解决......
2022-05-05 20:25:13 1404
原创 Java 浅拷贝和深拷贝
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。浅拷贝浅拷贝的示例代码如下,我们这里实现了 Cloneable 接口,并重写了 clone() 方法。clone() 方法的实现很简单,直接调用的是父类 Object 的 clone() 方法。public class Address impleme
2022-04-24 20:19:25 177
原创 Java ==判相等踩坑
Java 基本类型的包装类的大部分都实现了常量池技术。Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。下面的代码的输出结果是 true 还是 fals
2022-04-24 19:31:15 118
原创 Spring如何解决循环依赖问题
看到一篇文章讲Spring如何解决循环依赖问题,记录一下:PS:其实正确答案是开发人员做好设计,别让Bean循环依赖,但是没办法,面试官不想听这个。我们都知道,单例Bean初始化完成,要经历三步:注入就发生在第二步,属性赋值,结合这个过程,Spring 通过三级缓存解决了循环依赖:1、一级缓存 : Map<String,Object> singletonObjects,单例池,用于保存实例化、属性赋值(注入)、初始化完成的 bean 实例2、二级缓存 : Map<Strin
2022-04-22 16:01:00 2546
原创 Java log4j2日志配置
项目中日志的xml文件结构很复杂,这里逐步解析记录下,还有相应的参考教程。<?xml version='1.0' encoding="UTF-8" ?><Configuration> <Properties> <!-- 定义日志文件的存储地址 --> <Property name="log-dir">/export/Logs/jx-search-web</Property>
2022-04-22 11:30:51 2568
原创 部署公网访问服务器
1. 云服务器选择服务器了解和对比服务器参数2. 云服务器部署3. 域名选择直接在阿里云网站上购买域名,可以查询自己想取得域名有没有被占用。还可以选择是com/cn/top等等结尾的,价格不一样。域名备案:nginx配置域名4. 关联机器域名买好之后,在工作台域名相关页面选择解析,填入关联机器的ip地址。是否用nginx的思考。看网上都在容器中加入nginx,主要是基于多台机器部署,或者一台机器部署多个应用的考虑。我们单机针对网站和小程序端的话,刚开始应该还不需要nginx。另外还有
2022-04-17 20:00:39 2204
原创 docker-compose部署Java应用和相关依赖
上次用了docker远程部署之后,发现还是有点不方便的地方。2357上传了镜像之后,不会自动启动成容器,而且许多启动时的命令还要重新打。换台机器还要从偷装mysql和minio等等。网上看到能通过docker-compose进行一键部署。docker-compose部署分为一下几步:下载docker-compose编写build镜像相关的dockerfile编写docker-compose启动的yml文件以本Java应用为例,dockerfile已经本地通过IDEA的docker-maven-
2022-04-17 17:12:15 4762
原创 docker容器间互联
单机部署的时候考虑,能不能使docker各个容器间互通呢。比如我的web应用容器可以和db容器间互通,而不是现在这样再web应用调用本机ip去访问。网上查了一下还真有这种方法。还有两种方法:1、links在容器启动时,启动命令中加入links指定链接的容器:docker run -itd --name nginx-web02 --link nginx-web:nginx01 -p 81:81 sunmmi/nginx nginxrun容器nginx-web02时,link容器nginx-web,
2022-04-15 18:20:47 1875
wire线材检测项目(基于QT).7z
2020-07-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人