- 博客(94)
- 问答 (1)
- 收藏
- 关注
原创 CountDownLatch与CyclicBarrier的比较&应用
在数据分析的流程中,分为数据清洗和数据分析,数据因为量比较大,清洗和分析都分为了多个任务执行,但在执行任务分析之前,必须保证所有的数据都完成清洗
2024-10-30 21:59:18 284
原创 RocketMq集成Sleuth
通过Aop的形式在使RocketMq能在生产端的时候携带tracId和spanId,在消费端获取前面二者并且基于tracId创建新的span,达到一个业务请求经过Mq传递后tracId仍然保持一致的目的ps:Sleuth基于2.2.8版本。
2024-10-24 22:27:15 288
原创 Chrome Cookie最大有效期
代码设置了cookie有效期是10年,但在浏览器上实际上发现只有一年多一点,查证后发现chrome对cookie的最大有效期做了限制(400)天,实际上99.9999%的场景也是可以满足的。
2024-09-25 22:39:39 495
原创 基于Spring JDBC AbstractRoutingDataSource 实现动态数据源
AbstractRoutingDataSource 即抽象的路由数据源,提供了动态数据源切换的机制。你可以通过实现它的 determineCurrentLookupKey() 方法,根据不同的条件返回对应的数据源 key,基于这点可以根据外部输入完成数据源的动态选择。
2024-09-21 12:48:00 453
原创 Spring Cloud Config 动态刷新原理分析
底层工作原理依赖于Sping Actuator组件,在数据源发生变化的时候调用 /actuator/refresh 来应用实例完成config配置的的刷新。
2024-09-16 12:29:15 572
原创 Hkari连接的管理
某天发现一个流量不大的系统启动时启动时居然产生大量获取数据库连接慢的告警(>50ms),分析系统代码发现系统启动会有将一堆任务提交到线程池中执行,每个任务都会查询数据库,任务总数不到100个,核心线程30,最大200,相当于100个并发查询SQL。系统系统使用的连接池为Hikari,初始连接配置为15,按理100个并发查询并不算很大的流量,为什么会告警呢?于是有了本文。
2024-07-16 22:31:33 284
原创 ThreadPoolTaskExecutor 优雅关闭
ThreadPoolTaskExecutor 是Spring封装过的线程池,使用其可以在应用下线时,实现一定程度上的优雅关闭。
2024-07-13 01:04:38 838
原创 Spring 外部jar包Bean自动装配
公共代码模块被作为jar包引入业务项目,前者定义的bean即使添加了@Component注解由于不会被扫描到也就无法被Spring管理。此处通过Spring SPI机制来完成。
2024-07-08 21:59:59 348 1
原创 mysql修改字段的长度锁表问题
MySQL(这里指5.6及其后续版本=)修改字段的长度锁表会锁表吗?答案是可能会但不一定会。这是使用异常包含两万数据数据的表,字段初始长度为50(使用字符集为utf8)
2024-02-28 22:42:15 1481
原创 页面嵌入iframe Cookie丢失问题解决
自身页面以iframe的形式嵌入三方页面中,双方域名不一致导致自身页面的cookie被某些浏览器拦截无法正常被保存到客户端。
2024-01-17 23:07:27 3458
原创 TLS加密远程连接Docker
TLS加密远程连接Docker官方文档操作流程1、创建证书保存目录2、创建CA证书私钥:过程中需要输入并确认密码3、以此秘钥创建CA证书,自己给自己签发证书,自己就是CA机构,也可以交给第三方机构去签发4、创建服务端私钥5、创建服务端证书签名请求文件(csr即certificate signing request,里面包含公钥与服务端信息)6、配置白名单7、将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证。
2023-03-28 21:23:43 935 1
原创 解决多版本jar包冲突问题
在和三方对接的过程中,我们可能会不断引入一些三方jar包,但这个时候就有可能出现一个项目需要依赖两个版本不同且功能不兼容的jar包,本文记录一种方法解决方法。我们知道jvm加载类是通过判断类的全限定名来判断当前类是否被加载,这个导致多版本jar包不兼容的原因,那么我们就从里下手。...
2022-08-01 23:54:41 3797 2
原创 ConsurrentHashMap InitTable 疑问与思考
第二个问题说到需要循环等待所有自然不可能提前return,那为什么不用sleep,因为我们并不知道另一个线程什么时候完成初始化,也就不知道sleep多少秒,多了、少了都不合适,所以干脆就让出cpu时间片,等下一次再看看,如果其他线程完成了初始化就返回,否则重复以上。ConsurrentHashMap作为单机下经常使用的一个线程安全Map值得我们学习一下,以下其初始化的过程的代码,以及学习过程中遇到的疑惑与自己的思考。通常意义下的加锁,都是去检查一个东西是否被“其他”持有,如果被持有则本次加锁尝试失败。...
2022-07-27 23:21:01 276
原创 十大排序之快速排序
1、因为我们选择的标兵是在左侧,所以我们要从右侧开始遍历那为什么因为我们选择的标兵是在左侧,就要从右边开始?进一步的分析,我们最终需要将标兵把i==j停下来的位置的值做交换,所以停下来的位置,一定要是比标兵更小的值,否则就不满足,标兵左边的值小于标兵的前提。假定如果我们从左开始,那么就有最终在比标兵大的地方停下来,导致最终发生交换的时候违背了前面说的原则。而从右边开始我们能够保证一定是遇到比标兵小的值或者回到标兵的位置才停下来。2、如果你希望从左边开始,那么标兵选择最右边即可。......
2022-07-23 23:22:40 189
原创 关于RSA加密与加签之一个小故事
RSA加密与加签首先强调加密与加签不同,加密是为了保证请求中的敏感数据不泄露,加签是为了保证请求不被伪造。举个栗子🌰故事背景女神小红和他的前男友小军分手了,另寻新欢找了小明做新男友。敏感数据泄露小明写了一封情书给小红,为了表达自己的忠诚,小明直接在信中写出了微信账号、密码,让小红可以随便查看,可信中途被小军拦截了,小军打开信看到了微信账号密码于是把小明号给盗了。加密小明又写了一封情书给小红,为了情书里面的内容不被篡改,所以让小红生成了一对密钥,并且把公钥给了小明,小明使用公钥对情书加了密
2022-05-13 23:34:09 302
原创 四种常见的限流算法
常见的限流算法计数器大致原理就好像他的名字一样,我们去维护一个计数器,每有一个请求过来我们就加1,一但达到我们设置的上限我们就拒绝掉。优点实现简单,单机使用AtomicInteger ,分布式场景使用redis的incr都能简单的实现,也十分容易理解。缺点1、存在“毛刺现象”,如我们一分钟内限流100次,在持续性大流量下,很有可能出现这种情况,第一秒钟解收了100个请求,后面59秒都是拒绝状态,61秒又接收了100个请求,后面59持续拒绝。。。也就是他无法均匀的限制流量,容易造成应用服务器处理
2022-05-10 23:37:04 630
原创 限流算法-漏桶算法和令牌桶的区别
限流算法-漏桶算法和令牌桶的区别这里通过两个例子来说明1、漏桶高速路上有一个收费的公共厕所,突然有一堆人都想进行上厕所,能直接进去吗?不行啊,收费的,得先交钱啊,于是乎一堆人在厕所门口排起了队,一个个给老板扫码付了钱才能进去上厕所。2、令牌桶老板说,我给你们发一张纸片,拿着纸片直接就能进去,能自动扣费并作废,老板只要看有一个空着的地就写一个纸片,没地方了就不写了,存着等人过来直接就能发出去。前者与后者关键的区别就在于前者无论是无流量高低,吞吐的速率都始终相同,后者则可以在从低流量突发遇到高流量时
2022-05-07 13:03:02 239
原创 Vue prop 传递对象到子组件刷新页面数据消失
Vue prop 传递对象到子组件刷新页面数据消失父组件向子组件传递了一个对象,当页面我们直接刷新页面时发现子组件接收到的这个对象总的属性不见了。父组件<ArticlePublishForm :content="content" :article-id="editorArticleId" // 这个就是被传递的对象 :article-message="articleMessage" :title="title"
2022-04-29 20:16:21 3153
原创 Axios 传递数组问题
Axios 传递数组问题后端框架Spring,前端Vue,使用的请求方式是axios,当后端接收的形式为数组(如String[]),始终无法很好的解决,后改为 List 才解决了这个问题后端接收方式 public void test(@RequestParam List<String> tags){ }前端请求方式 let tags: ['java','后端'], let {data: result} = await pushOrUpdat
2022-04-29 14:41:18 2985 1
原创 Redission 分布式锁原理
Redission 分布式锁原理Redission 是一redis客户端和jedis、lettuce 一样,但他提供诸多如分布式锁这些方便的工具加锁过程lua脚本"if (redis.call('exists', KEYS[1]) == 0) then redis.call('hset', KEYS[1], ARGV[2], 1); redis.call('pexpire', KEYS[1], ARGV[1]); return nil; end; if
2022-03-31 22:53:14 3587
原创 MySQL的默认排序
MySQL的默认排序默认排序就是没有排序,如果你希望有序请使用order by问题的引出在一个排行榜表中,前端展示要求根据score进行排序,尝试了几次,当积分相同时我发现时以主键ID(或者说根据创建时间)的大小进行了升序排序正当以为一切万事大吉时,测试反馈score相同时,并没有根据创建时间进行顺序排列,我一查数据如下果然这三行score相同的数据可以说是毫无顺序结论mysql在你不指定排序方式的时候无法保证根某种方式排序(主键ID)问题与思考既然mysql能将数据以某种顺序返回
2022-02-25 13:44:00 2328
原创 浅析线程池
浅析线程池前言在很多时候我们需要使用多个线程来并行的执行任务以提高处理能力,但随时随地的创建/销毁线程既浪费系统资源,又不利于线程的管理,于是线程池应运而生Java线程池的基本参数看起来有七个参数:但平时我们比较关注其实只有:corePoolSize 、maximumPoolSize、workQueuecorePoolSize 核心线程数maximumPoolSize 最大线程数量(核心线程数+ 救济线程数 = 最大线程)KeepAliveTime 救急线程最大存活时间(指的
2022-02-23 22:55:51 222
原创 MYSQL 索引下推
MYSQL 索引下推(Index Condition)背景介绍官方文档链接官方定义Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a table using an index. Without ICP, the storage engine traverses the index to locate rows in the base table and re
2022-02-19 22:53:01 465
原创 Redis 实现分布式锁
Redis 实现分布式锁锁的本质就是独占获取锁setex key value这个key就是你需要锁住的东西,如果你想要保证单用户并发:那么它就可以是用户的userId,当key不存在的时候才能成功,否则失败。以此为基础我们就能保证一个线程获得锁的时候,知道它释放,都不会被其他县城抢占。但这里就产生了第一个问题。如果一个线程获得锁后,在释放锁之前就挂了,这个锁永远无法得到释放要解决这个问题也很简单,我们对这个key 设置一个超时时间。setex key valueexpire key
2022-01-23 09:34:55 265
原创 MySql死锁问题
MySql死锁问题插入死锁产生背景比如在商品秒杀的场景中,我们需要进入商品的流水情况,此时并发压力较大,不进行处理容易出现死锁核心条件:n(n>2)个线程并发插入流程示意图Client AClient BClient CbeginbeginbeginINSERT INTO user(id,name) VALUES(1,‘a’) 成功获取到X锁INSERT INTO user(id,name) VALUES(1,‘a’) 获取到S锁INSER
2022-01-17 20:36:40 779
原创 Mac 安装oh-my-zsh
一个简单的安装教程,记录基本步骤和踩坑记录,方便以后自己查看,也希望能帮到别人常规的安装流程# 1、下载安装shell脚本$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"# 或者$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"# 2、运行sh -.
2022-01-08 15:29:01 4196
原创 Illegal character in scheme name at index 0
Java 里面HTTP请求里面常见的错误,问题本身很简单,但正是因为简单,有时有却让人抓耳挠腮。罪魁祸手 public static URI create(String str) { try { return new URI(str); } catch (URISyntaxException x) { throw new IllegalArgumentException(x.getMessage(), x); .
2022-01-03 01:04:26 16271
原创 apache Tuple 工具类
apache Tuple 工具类maven依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency>gra
2021-12-01 13:41:26 459
原创 MySQL索引失效场景
索引失效发生场景隐式类型转换隐式类型转换拿常见的 varchar 和 int 来举例子int 隐式转换为 varchar 将导致索引失效varchar 隐式转换为 int 不会导致索引失效解释究其原因,是因为一个数字可能是多个varchar被转化的结果,而一个varchar只会被转化为一个数字打个比方,一个拼音对应着多个汉字,要要让你根据拼音找找出汉字本身就是不实际的按图索骥的索引不允许中间有模糊不清的说法,所以最终导致的无法利用索引。验证name 是 varchar类型
2021-11-05 09:36:02 354
原创 Bean生命周期浅析
Bean生命周期浅析大致的回答Bean的生命周期,以及代码演示一下,更多东西,留待以后补充总体概述实例化->Instantiation属性赋值->Populate初始化->Initialization使用销毁->Destruction首先了解全貌,了解中间有很多扩展点就行总的来说就是大方向上可以分为5个点首先是实例化,在这之前会有BeanFactoryPostProcessor的扩展点,比如可以在这里修改Bean的作用域然后是属性注入,然后会有一系列
2021-08-18 23:26:01 179 2
原创 百万数据量下,使用延迟关联优化超大分页
百万数据量下,使用延迟关联优化超大分页MySQL 并不是跳过 offset 行,而是取 offset + N 行,然后返回放弃前 offset 行,返回 N 行,那当offset 特别大的时候,效率就非常的低下延迟关联根本原理在于利用索引覆盖,避免二次回表,提高性能,延迟关联则是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。模拟百万条数据表结构DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` in
2021-08-10 15:58:12 315
空空如也
centos8 执行各种yum命令的时候都有相同的一个警告 求大神解答
2020-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人