自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(184)
  • 收藏
  • 关注

原创 ScheduledExecutorService引起的线上问题(抛出异常后不继续执行)

ScheduledExecutorService引起的线上问题

2024-06-20 20:27:29 300

原创 记一次redis分布式锁引起的线上问题

业务大概是这样的,首先有一个提交流程锁,锁的超时时间只有5s(可以用于防刷),获取到提交流程锁之后,才可以去获取业务锁,然后执行业务rpc调用,并且这个逻辑下,业务锁的超时时间设置成了10000s(可以理解为作为降低调用第三方rpc幂等调用量的锁工具),一但判断该业务锁已经锁上则不再进行调用直接走后续逻辑。今天出现的问题是,业务锁由于超时等原因返回了锁定失败,然而实际在redis已经锁定成功,这样导致没有调用第三方rpc,并且业务流程往下执行,直到很后面的步骤才弹出失败。

2024-03-05 19:46:41 453

原创 记一次kafka消息积压的排查

问题定位成功,然后去看了线程的栈信息,发现是里面的逻辑卡在了socket.read,当即想到了socket的超时,去看了代码逻辑,是httpclinet,果然没有设置超时时间。对比了其他消费者,消费线程都是在runing和waiting中切换,但是当前消费者的消费状态一直处于runing,阻塞了消息拉取线程。根据手册首先排查下消息拉取是否正常,看到了消息拉取线程是waiting状态,然后看到kafka这块逻辑是消费线程阻塞了拉取线程。使用的是fluent api。

2024-03-05 17:11:50 994

原创 redis集群

业界常见的解决方案有两种,一是引入 Proxy 层来向应用端屏蔽身后的集群分布,客户端可以借助 Proxy 层来进行请求转发和 Key 值的散列从而进行进行数据分片,这种方案会损失部分性能但是迁移升级等运维操作都很方便,业界 Proxy 方案的代表有 Twitter 的 Twemproxy 和豌豆荚的 Codis;数据分片借助哈希槽,预先划分16384个slot,在对key操作时都会先散列出值来匹配hash槽,当所有hash槽都被分配时集群才可用,动态添加减少主节点时,hash槽也需要进行迁移和再分配。

2024-03-05 16:16:16 41

原创 redis过期策略介绍

一三为主动删除,二为被动删除,redis采用惰性和定期两种策略相结合的方式。因此redis采用定期与惰性相结合的方式(定时器太昂贵)

2024-03-04 19:41:47 135

原创 Redis主从复制

在分布式服务中,副本和复制的思想不必多少,可以提升系统可用性,防止单点故障发生,redis则通过salve of命令允许某个redis实例成为另外一个redis实例的从节点来进行数据同步(redis采用异步复制)。master和salve正常连接时,master会发出一连串的命令流对salve节点进行更新,内容包括操作命令、key的过期淘汰两者连接断开后,salve重连master需要尝试进行部分重同步以减小全量同步的开销(只获取断开期间丢失的命令流)。

2024-03-04 17:30:07 774

原创 redis持久化机制

如果 rdbcompression 配置为 yes,那么即代表 redis 进行 RDB 文件生成中,如果遇到字符串对象并且其中的字符串值占用超过 20 个字节,那么就会对字符串进行 LZF 算法进行压缩。在bgsave失败是拒绝客户端的写入请求,生产环境一般设置no ,一般由于内存不足会导致bgsave失败,这时候完全可以设置告警,提前干预扩容迁移等操作。redis提供了两个函数save(阻塞式)和bgsave(fork子进程生成rdb文件),rdb的载入同样是自动的,但是有aof的情况下会优先aof。

2024-02-29 20:15:21 396

原创 redis分布式锁RedLock

延时重启:为了避免上面提到的互斥性问题,redlock的作者提出了延迟重启,即延时TTL的时间再进行重启,保证上一次的锁全部过期,避免锁冲突。2.依次从每个节点获取锁,需要设置网络连接的超时时间(防止客户端阻塞,这个设置要小于TTL)3.客户端获取到了所有能获取的锁,可以计算获取锁消耗的时间(要达到半数以上的节点才算成功)1.获取当前时间,设置超时时间TTL(需要大于业务执行时间+获取锁的时间)6.失败(未达半数||超时)后进行随机时间重试,防止并发重试。4.锁的有效时间等于TTL-获取锁消耗的时间。

2024-02-26 19:25:44 470

原创 分布式锁选型+缓存db一致性

setnx就可以实现加锁,del实现解锁,但是这样不具备原子性,存在无法释放的可能。因此可以使用在加锁时增加过期时间命令,做到原子性的加锁并且可以自动释放。可重入性需要自己开发,安全性方面可能丢失锁(redis主从复制)了解一下基于多节点的高可用分布式锁的算法 RedLock。

2024-02-26 17:42:15 515

原创 redis最佳实践

SortedSet(ZSet):跳表,增删数据的复杂度都是O(logn),每个成员都有对应的分数用于排序,访问内部成员会很高效,使用场景如大型游戏积分榜,可以用zincrby增加用户分数,用zrange来获取top10,用zrange和zrank来获取用户的排名信息和附近的排名用户。Hash:同hashmap,需要注意的是其编码有几种类型,压缩编码占据空间小但获取效率低容易导致pending,所以可以在设置时指定编码,对于对象,如果只更新部分字段就显得更加灵活而不需要像字符串一样维护整个json。

2024-02-21 20:28:52 593

原创 Skywalking源码分享之ReadWriteSafeCache

可以看到读写都需要抢锁,并且都是独占式,但是明显读更快,因为读方法在加锁的范围内只进行了指向的交换,并且读是一个拿出数据并清除缓存的过程(相当于取,即只取一次);可以看到有两个指向,一个是读缓存一个是写缓存,并不是单纯的两个指针(即两者指向的对象不同),并发情况下用volatile修饰保证可见性;3 加锁 交换指针(读有内容) 释放锁 读 清除内容。1.加锁 写空集合 释放锁。2 加锁 追加写 释放锁。

2023-02-06 12:52:31 229 1

原创 Graphql递归查询树状结构(无解)

我的想法就是要么平整树,在客户端复现结构,要么借助第三方工具返回一个json。无解,刚去github上看了,2月份时候开了个会不同意开放这个无限递归。

2022-11-17 14:44:58 511

原创 skywalking本地启动调试失败(已解决~SkyWalking doesn‘t work properly without JavaScript enabled. )

We're sorry but SkyWalking doesn't work properly without JavaScript enabled. Please enable it to continue

2022-11-04 10:52:42 3389

原创 JDK监控接入(prometheus)返回结果含转义字符导致不能被识别

接入后访问localhost8080/prometheus发现可以正常吐出指标数据,但是会发现结果有\n、"这类转义字符,不要以为没有什么影响,导致公司的监控中台没法识别,数据没法可视化查阅。

2022-08-02 14:55:39 858 1

原创 maven插件爆红&&打包(package)出错

maven一直用的比较头疼,maven插件那块全都飘红,整个人都傻了。。。当然后来解决了问题,参照网络上的一个解决方案,如果有遇到同类型困境的,就参考一下~不知道大家的settings是公司还是个人的,需要指定一下plugingroup,这样确保我们本地仓库是有对应plugin的文件。然后开始解决飘红:将状态为error的进行update操作直到这块不飘红。如果你惊喜的发现pom里关于插件部分已经不爆红了,很好,尝试打包又报错了,,,,,,,,修改一下你的插件设置,这是由于单元测试没有通

2022-06-22 12:04:27 1569 1

原创 Zookeeper异常ConnectionLossException: KeeperErrorCode = ConnectionLoss

跑个新项目,也设置好了启动参数,启动的时候傻眼了:从zk拉取配置异常,导致Jedis池、kafka等等中间件都跑不起来。关键是上一个类似的项目连的zk一模一样,上一个项目毫无压力的启动。这里建议先使用telnet ip 端口测一下能不能跑通,如果不能大概是IT运维部门的事,你的vpn没有开通连接这个端口的权限~当然我的是可以跑通的。接下来就是解决方案(实测可行):上面这两个如果是自己写的连接,肯定都知道对应什么,如果不是,但愿你的打印日志里面能找到~举例:192.169.0.1 my-zk.

2022-06-17 11:53:18 797

原创 Fastjson反序列化远程代码执行漏洞

据国家网络与信息安全信息通报中心监测发现,开源Java开发组件Fastjson存在反序列化远程代码执行漏洞。攻击者可利用上述漏洞实施任意文件写入、服务端请求伪造等攻击行为,造成服务器权限被窃取、敏感信息泄漏等严重影响。先贴一个解决漏洞的方案:不过任何升级一定会伴随或大或小的bug,一定要对业务的影响做评估。下面对漏洞原理进行介绍:fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库,用于将数据在 Json 和 Java Object之间相互转换。它没有用java的序列化机制,而是自

2022-06-15 10:17:54 4575 1

原创 (小tips)谷歌浏览器主页被劫持

劫持页面:http://003eddeekeedld.jumpkj.chuairan.com/index.html只要点击谷歌浏览器图标就会跳转到这个页面,并且经过反复确认,浏览器主页的相关设置没有被篡改。真相就是,右键快捷方式属性,发现指向变了,也就是说有软件替换了原本的快捷方式,解决方案是删除后重新生成快捷方式。...

2022-06-15 08:47:28 312

原创 关于;号绕过认证的安全漏洞问题

1、HttpServletRequest中URL解析函数url=host+uri(工程名+servlet路径)漏洞出在,当后台程序使用getRequestURI()或getRequestURL()函数来解析用户请求的URL时,若URL中包含了一些特殊符号,则可能会造成访问限制绕过的安全风险,其中分号;就是其一。问题出在tomcat对URL特殊字符的处理上1.分号;在URL中遇到;号会将;xxx/中的分号与斜杠之间的字符串以及分号本身都去掉:2.斜杆/判断是否有连续的/,存在的话则循环删除掉多余的

2022-06-07 14:58:48 2078

原创 494. 目标和

给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。public int findTargetSumWays(int[] nums, int target) { /

2022-03-27 11:57:28 79 1

原创 分布式数据库ID获取方案(考虑高并发)

1.数据库自增优点是明显可控,但是缺点是数据库压力大,慢,并且依赖单表;2.UUID可以保证全局唯一,长度32的字符串,存储压力大缺点是无序,排序时不可用;3.雪花算法时间+机器号+计数顺序高性能低延迟独立应用时间上有序缺点是需要单独部署系统,引入额外的复杂性4.Redis生成id使用字符串的原子操作incr和incrby实现可以通过设置不同步长或者初始号,集群提高吞吐量比如前几位设置日期,后几位进行自增,性能优可排序,防止单点故障;...

2022-03-26 11:00:04 1121

原创 62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?典型dp问题;dp数组是网格里到达此位的路径数;递推公式是dp[i][j]=dp[i-1][j]+dp[i][j-1]//从上面或左面来初始化则是第一行和第一列全部为1(只有一条路径)从上到下,从左到右依次遍历即可;最后返回右下角的路径值; public int unique

2022-03-21 11:18:39 121

原创 746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20] 输出:15 解释:你将从下标为 1 的台阶开始。支付 15 ,向上爬两个台阶,到达楼梯顶部。 总花费为 15 。这题是个dp问题,类似普通爬楼梯,不过加了一个体力,就需要比较最值;dp数组含义:达到

2022-03-21 11:00:19 289

原创 435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。示例 1:输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3]后,剩下的区间没有重叠。 public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals,(a,b)-

2022-03-20 10:43:04 76

原创 968. 监控二叉树(hard)

给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。示例 1:输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。本题使用贪心算法(遇事不决用贪心),从下往上进行搜索(从上往下后期要解决的节点数量过多),叶子节点的父节点作为摄像头所覆盖的区域是最多的,因此使用后序遍历,使用类似回溯的方式遍历整棵树并及时记录状态;0表示未覆盖,1表示有摄像头,2表示已覆盖;

2022-03-18 09:27:31 232 1

原创 进程与线程的区别详解

昨天笔试问到了进程线程的简答题,感觉答得太笼统了,之前面试也被提问过,因此这里单独总结一篇;进程进程是程序的一次执行过程,是临时的,动态的,有生命周期的;任何进程都可以和其他线程一起并发执行;进程是系统资源分配和调度的独立单位进程由程序、数据集合、进程控制块组成,程序用于描述进程要完成的功能,数据集合是程序执行期间所需的数据和工作区,程序控制块包含进程的描述信息和控制信息。线程进程间进行切换的成本开销太高,又发明了线程;线程是处理器调度和分派的基本单位;一个进程可以有多个线程,各线程

2022-03-17 11:06:06 581

原创 3.15面试整理

hashmaphashmap的put流程,指定容量初始化会按照容量吗,扩容后下标是否重新计算put流程,先通过hashcode与(当前容量-1)进行异或运算,定位到数组下标,然后判断此位置是否为空,为空则放入此位置,不为空,遍历链表,使用equals方法比较,若存在一致key则直接修改value值,否则拉链,1.7采用头插法,多线程下容易引起死链,1.8采用尾插法;1.7在插入前扩容,1.8在插入后扩容,(是否达到容量*扩容因子),1.7需要对每个元素rehash计算下标,1.8扩容后hashcode

2022-03-16 11:19:36 1478

原创 56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,

2022-03-16 09:35:36 143

原创 763. 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。示例:输入:S = “ababcbacadefegdehijhklij” 输出:[9,7,8] 解释: 划分结果为 “ababcbaca”,“defegde”, “hijhklij”。 每个字母最多出现在一个片段中。 像 “ababcbacadefegde”,“hijhklij” 的划分是错误的,因为划分的片段数较少。本题与其说是贪心,更像是一道模拟题,我们

2022-03-16 09:16:21 137

原创 452. 用最少数量的箭引爆气球

在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭

2022-03-16 08:53:06 80

原创 135. 分发糖果(hard)

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。示例 1:输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。感觉算是hard里面比较简单的一道题;贪心的思路,从前到后,满足一定条件下(相邻两个孩子评分更高的孩子会获得

2022-03-13 15:50:46 159

原创 1005. K 次取反后最大化的数组和

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。以这种方式修改数组后,返回数组 可能的最大和 。示例 1:输入:nums = [4,2,3], k = 1 输出:5 解释:选择下标 1 ,nums 变为 [4,-2,3] 。两次贪心,第一波,选择负值修改为正值(优先选绝对值大的),第二波,选择正值修改为负值(优先选绝对值小的)代码还是有点难度的:

2022-03-13 11:19:37 116

原创 面试总结(3.10)

你为啥用mybatis-plus,用到了哪些,链式调用对mybatis的增强,只增强不改变,简化开发,可以注册分页拦截器代替pagehelper,链式调用;修改配置文件即可打印sql日志(之前用的是一个插件);可以对实体类的字段进行映射,TableId定义主键(可以设置分配策略),TableField定义非主键字段鉴权和登录(忘说鉴权了)鉴权方面是在方法上加注解,权限字符串,在用户登录的时候,通过rbac校验获取他的权限字符串,判断是否包含此权限方可完成调用java对象的寻址方式直接指针,指针

2022-03-13 09:49:46 1210

原创 122. 买卖股票的最佳时机 II

给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例 1:输入: prices = [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格= 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买

2022-03-13 09:30:48 97

原创 53. 最大子数组和(贪心)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6贪心在于发现当前和小于0的时候直接置为0,因为一个小于0的count不管怎么样都会拖累总结果; public int maxSubArray(int[] nums) { if(nums.length==1){

2022-03-12 17:02:18 465

原创 455. 分发饼干

回溯的题做完了,感觉非常通透,来做贪心~假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。输入: g = [1,2,3], s = [1,1]输出: 1解释:你有三个孩子和两块小饼

2022-03-12 16:10:41 58

原创 redis淘汰机制

来讲讲redis的淘汰机制吧~redis他是基于内存的,因此需要淘汰数据否则也会溢出崩溃;redis的两种过期策略定期删除:每隔100ms抽取设置了过期时间的数据进行检查惰性删除:获取key的时候才判断是否已经过期,过期则从内存中删除并不返回数据;redis的内存淘汰机制可在redis.conf中配置:maxmemory-policy:~默认采用禁止驱逐数据,不接受新的内存分配lru:从设置了过期时间的数据集中挑选最近最少使用的数据淘汰。ttl:从已设置了过期时间的数据集中挑选即将要过期的

2022-03-09 21:09:00 448

原创 启动虚拟机时可选的参数(调优)

-verbose:class输出类加载信息-verbose:gc输出gc信息-verbose:jni输出本地方法调用信息-Xms默认堆大小-Xmx最大堆大小-Xss默认栈大小-Xmn新生代大小-XX:NewRatio=n新生代与老年代比例设置-XX:SurvivorRatio新生代eden suivivor比例-XX:+HeapDumpOnOutOfMemoryError:表示当JVM发生OOM时,自动生成DUMP文件。-XX:+PrintGCDetails打印GC日志...

2022-03-09 20:57:32 296

原创 面试小总结

http请求报文请求行 请求方法 url 协议版本请求头 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔空行请求体 请求数据不在GET方法中使用,而是在POST方法中使用线程状态初始 就绪 运行 阻塞 死亡就绪后分配到时间片运行,run方法结束死亡;运行态时间片到了或者yield让出执行权了回到就绪态;调用sleep(可能超时等待)或者join就进入阻塞,直到完毕后进入就绪态;调用wait进入等待队列,唤醒后进入锁池队列,抢到锁后进入就绪态;limit分页优化尽

2022-02-23 17:28:30 55

原创 nginx和dubbo的负载均衡策略

nginx:1.轮询2.基于权重的轮询3.响应时间4.ip hash5.请求hashdubbo:1.基于权重的随机2.基于权重的轮询3.最少活跃数(响应时间)4.一致性hash(相同参数)

2022-02-23 10:07:50 882

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除