自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 接口设计的18条军规

API接口的网关服务,获取到该sign值,然后用相同的请求参数 + 时间戳 + 密钥拼接成一个字符串,用相同的m5算法生成另外一个sign,对比两个sign值是否相等。有些时候,我们的API接口直接传递的非常重要的数据,比如:用户的登录密码、银行卡号、转账金额、用户身份证等,如果将这些参数,直接明文,暴露到公网上是非常危险的事情。也就是说要支持在极短的时间内,第三方平台用相同的参数请求API接口多次,第一次请求数据库会新增数据,但第二次请求以后就不会新增数据,但也会返回成功。

2024-06-03 15:26:37 876

原创 java如何获取视频第一帧封面图片?

视频第一帧就是在视频中提取第一帧的图片画面,在视频处理中,截帧可以用于视频预览、封面生成、缩略图制作等多种应用场景。以下是一个简化的步骤,描述如何使用。中添加以下依赖【本来就一个依赖的,但是那个依赖太大,所以就从中过滤了一些无效依赖】将第一帧的图片以流的形式,上传到OBS,最后返回OBS的图片url给到前端。和相关的依赖项添加到你的项目中。如果你使用Maven,可以在。来获取视频的第一帧。

2024-05-25 16:00:00 452

原创 java如何获取IP和IP的归属地?

而要获取IP的归属地(地理位置信息),则通常需要使用第三方IP地址查询服务,我这里使用的是 ip2region开源IP库。在Java中,获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式(如HTTP请求)获取的远程IP地址。2.在pom文件中包含该目录下的对应资源。3.根据IP获取归属地。

2024-05-24 15:15:00 353

原创 如何优雅的实现在线人数统计功能?

在线人数统计这个功能相信大家一眼就明白是啥,这个功能不难做,实现的方式也很多,这里说一下我常使用的方式:使用Redis的有序集合(zset)实现。zaddzrem。

2024-05-16 16:34:23 906

原创 如何优雅的实现接口统一调用?

这是我之前设计的关于接口统一调用的流程,当然其实还是包括对接第三方重复调用的问题、调用结果缓存、调用超时解决、失败降级的一些策略,作为抛砖引玉。

2024-05-07 14:23:17 624

原创 在java中使用@Transactional会有哪些坑?

在使用时,需要特别注意传播行为、异常处理、方法调用以及事务管理器的配置。此外,对于复杂的业务逻辑,可能需要结合AOP日志来确认事务的执行情况,以便及时发现和解决问题。

2024-04-28 15:43:01 295

原创 在java中使用logger打印日志会有哪些坑?

如果设置得太低(如DEBUG),则可能会产生过多的日志,导致性能问题。在使用多线程环境时,确保Logger实例是线程安全的。大多数现代日志框架(如Log4j、SLF4J等)的Logger实现都是线程安全的,但如果你自己实现日志记录器,则需要特别注意线程安全问题。打印的日志信息应该具有足够的上下文,以便于后续的分析和排查问题。在捕获异常并打印日志时,仅仅打印异常信息是不够的,还需要打印异常的堆栈跟踪信息,以便于定位问题。在打印日志时,不小心打印出敏感信息(如密码、密钥、用户个人信息等)会导致严重的安全风险。

2024-04-23 10:09:36 362

原创 使用Redis分布式锁时会有哪些坑?

方法之前开启事务,之后再加锁,当锁住的代码执行完成后,再提交事务,因此锁住的代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,锁已经被释放,此时其他线程拿到锁之后进行锁住的代码块,读取的库存数据不是最新的。,就是当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,会阻塞,不可以再次获得锁。(假设锁自动失效时间为。代码块,即在宕机前,锁并没有被删除掉,这样的话,就没办法保证解锁,所以这里需要给。释放锁的时候,锁已经过期,所以这把锁已经可能已经不属于当前客户端,会。

2024-04-22 10:54:55 964

原创 在java中使用线程池会有哪些坑?

在Java中使用线程池时,确实存在一些常见的陷阱和坑。

2024-04-20 14:50:38 551

原创 在开发中哪些场景容易导致NPE?

为了避免这些场景中的空指针异常,开发者需要谨慎地处理null值,通过适当的空值检查、使用Optional类、确保对象在使用前已被正确初始化,以及合理设计代码结构等方式来预防异常的发生。

2024-04-19 13:35:04 864

原创 在使用BigDecimal时需要注意哪些坑?

在使用BigDecimal避免使用无参构造器创建BigDecimal对象。避免使用double或float创建BigDecimal对象,应使用字符串。在进行数学运算时,注意处理标度和舍入模式。根据业务逻辑选择合适的舍入模式。

2024-04-18 13:58:25 341

原创 Array数组转List集合会有哪些坑?

为了避免这些问题,你应该根据具体需求选择合适的集合类型,并在转换之前对数组进行必要的检查和处理。同时,了解Java集合框架和类型系统的特性也是非常重要的。如果需要动态地添加或删除元素,或者需要处理基本数据类型数组,那么使用。或其他类型的集合可能是一个更好的选择。

2024-04-18 09:25:27 284

原创 List集合中使用for循环指定删除相同的元素会出现什么问题?

这是因为当你使用for-each循环(也称为增强的for循环)遍历列表时,实际上是通过迭代器来访问元素的。如果你在循环体内直接调用。是Java 8及以上版本中推荐的方式,因为它简洁且易于理解。如果你使用的是旧版本的Java,那么使用迭代器或索引遍历可能是更好的选择。选择哪种方法取决于你的具体需求和使用的Java版本。集合中,如果你尝试在for循环中直接删除元素,可能会遇到。方法,就会修改列表的结构,这会导致迭代器失效,从而抛出。上面的代码在尝试删除列表中所有值为。

2024-04-17 16:26:49 396

原创 线上CPU飙高如何处理?

3)考虑到折扣策略数据量没那么大,针对redis 大key,优化缓存读写策略,引入本地+redis的二级缓存,优先读取本地缓存,减少对redis的冲击。某一天下午业务高峰期,突然收到线上服务CPU冲高,线程池被打满,几分钟之内,服务很快进入假死状态,系统频繁重启,客户反馈小程序或APP各种系统异常。4) 本地缓存失效,在应用中打印告警日志,配合监控系统告警研发同学,人工介入,触发job,重刷缓存,保存本地缓存能快速恢复。2)收到线上CPU和线程池打满的告警后,从线上dump线程运行情况,开始定位问题。

2024-04-16 15:37:16 302

原创 遇到P0级别事故如何项目复盘!

1)优化redis大key:事发当晚,针对redis大key场景,引入本地缓存作为一级缓存,接口优先从本地缓存读取数据,减少对redis中间件的压力,优化后redis运行比较平稳。2)增加系统异常预案处理:在配置中心增加动态关闭接口的开关,一旦出现系统即将不可用的情况,立即打开开关,进行人工降级,并返回兜底数据,等待系统资源正常后,4)性能压测必须输出一套统一的标准,压测的测试场景与线上高度还原,接口如果达不到业务要求上线的标准,测试同学通过邮件报备,与PM商量后是否延期需求,

2024-04-15 10:20:14 833

原创 项目上线的过程需要注意哪些事项?

A/Btest是指用户打开软件后,一部分用户看到的老业务A的业务流程,另一部分看的是新功能B的业务流程。一、对于项目中出现的问题,要找原因。比如说项目延期,可能每次都会出现,但每次出现的原因并不一样。二、对于项目中做的好的,也要讲,该表扬表扬,能推广的推广。我们经常说要打造组织文化,对工程师群体来说,组织文化就是在项目过程中生长起来的。上线之前,先在测试环境预上线一次,把所有的相关环节的资料和流程用清单的形式记录好。清单的要素包括:什么人,在什么时间,需要准备哪些资料、SQL脚本等等,做什么事。

2024-04-09 15:25:19 396

原创 使用并行流造成丢失数据问题!

elementData[size++] = e,添加元素到elementData数组中, 在并发情况下, 如果多个线程同时执行add方法,在第一步ensureCapacityInternal校验数组容量时,都发现当前容量还可以添加元素,就都在size++的位置添加各自的新元素,会出现同一位置的值被覆盖情况,所以可能会出现数据丢失问题;不给过CopyOnWriteArrayList,每次add操作都是把原数组中的元素拷贝一份到新数组中,然后在新数组中添加新元素,最后再把引用指向新数组。

2024-04-05 11:22:26 517

原创 线上突然遇到一个接口很慢怎么办?

首先我们要快速定位接口的哪一个环节比较比较慢,性能瓶颈在哪里?某一天早上,正在上班路上,突然间手机滴滴不断收到大量告警提醒,赶紧查看了下告警信息,结果显示某个接口出现大量超时,平均响应时间超过3s,这个时候怎么办,是不是有点慌?我这里给大家分享以下。. 调用第三方设置合理的超时时间,比如你的接口是高并发接口,从自身对方接口的要求和对方线上P95接口的平均rt,综合设置超时时间。. 循环调用,改为单次批量调用,减少IO损耗(比如调用AB接口,根据用户ID、分组ID多个,for调用改为一次传多个分组ID)

2024-03-27 15:55:11 422

原创 开发中如何做好功能设计?

接口的时间复杂度,部分逻辑在设计的时候尽可能保证是O(1),例如调用第三方接口,for循环调用的,是否可以提到循环外,传多个id批量调用一次,时间复杂度从。1)对于C端高并发接口,hash结构要慎重用,key不能用固定的key,防止key倾斜,可以采用string结构,value尽可能压缩下,比如。. 对于定时执行的job,设计执行时间的时候,要慎重考虑线上整个job执行的时间,根据这个时间配置cron表达式,不要拍脑袋随意设置,

2024-03-25 14:25:41 857 1

原创 java百万级数据深度分页如何优化?

当以上的场景翻页很深,offset越来越大,回表的记录越来越多,sql查询性能会急剧下降,会出现大量的慢SQL(超过1s的)3、访问某小程序的积分商城查看商品,一直滑动翻页,不用跳转到指定页数。1、查询文章列表,一直滑动翻页,不用跳转到指定页数。2、从数据库查询百万客户数据写入到redis。优化的解法1(inner join优化)优化的解法3(最优解-游标查询)优化的解法2(子查询优化). 深度分页造成的结果。一般的解法(深度分页)

2024-03-23 21:16:00 356 1

原创 java性能优化之批量处理数据!

2、基于guava eventbus实现异步事件(实现简单,性能比较好,重启服务有丢失的风险)场景三、大批量消费消息队列消息的时候,如何提升数据处理效率,提高消费效率减少消息挤压?场景二:高并发下写数据,如何快速响应,如何提升数据处理效率,尽可能减轻数据库的压力?3、基于线程池实现异步处理(实现简单,并发量不大,可以用,重启服务有丢失的风险)1、发送数据到消息队列(比较推荐,基本不丢失,实现稍微麻烦)三、异步处理(这里简单聊下,后面有时间再详细讲解)三、批量处理数据的几种方案对比。controller层。

2024-03-21 11:24:29 1711

原创 分布式Id解决方案?

场景:在互联网公司,对于高并发业务,一般的表主键都是采用数据库自增,即使采用分库分表,也是设置主键自增,原因是:一般表的主键不参与业务处理,比较常见的设计方式是业务表加一个业务唯一健,而且唯一健不能改变,其他业务表关联这个表的唯一键参与各种逻辑处理。在我们的业务需求中通常有需要一些唯一的ID,来标识某条数据,比如: 用户Id、订单号、活动编号,通常我们会调研各种各样的生成策略,根据不同的业务,采取最合适的策略,那分布式项目中生成分布式id的方法究竟有哪些吗?

2024-03-19 17:52:31 810

原创 如何优雅实现统一参数的校验?

可以集合上一篇文章《如何优雅实现统一的响应对象?》一起学习

2024-03-10 17:28:26 693

原创 如何优雅实现统一的响应对象?

目前主流开发方式都是前后端分离的,定义一种统一的返回格式,在前后端进行沟通时是非常有必要的,减少大家的沟通成本,大家基于这个约定去理解,出现问题能够快速定位。code: 返回结果的状态码,通常都是6位,比如A业务:100000-199999,B业务:200000-299999,C业务:300000-399999,不同的数字开头代表不同的业务。3、定义一个处理返回结果的工具类RespResult.java,定义一些通用的返回结果的方法,例如返回成功结果的success方法、返回失败结果的error方法。

2024-03-06 15:00:21 1060 3

原创 如何优雅的设计后台操作日志?

查询活动详情接口/*** 活动业务处理*/@Api(tags = "活动相关api")@Slf4j@ApiOperation(value = "根据Id查询活动信息", notes = "根据Id查询活动信息")@SysOpLogAnnotation(menuName="活动管理", menuBtn = "查看详情", opContent = "查询活动详情",@ApiOperation(value = "修改活动", notes = "修改活动")

2024-03-04 16:45:41 1098

原创 SpringBoot接口防抖的一些实现方案?

*** @description 加上这个注解可以将参数设置为key*/@Inherited/*** @description 获取LockKey* @param joinPoint 切入点*///获取连接点的方法签名对象//Method对象//获取Method对象上的注解对象//获取方法参数//获取Method对象上所有的注解i++) {//如果属性不是RequestKeyParam注解,则不处理continue;

2024-03-01 16:45:56 827 1

原创 调用第三方接口需要考虑哪些点?

/todo 调用第三方});

2024-02-27 17:00:24 281

原创 java百万级别数据导入导出如何优化?【篇章一】

【代码】java百万级别数据导入导出如何优化?

2024-02-25 16:15:16 1579 1

空空如也

空空如也

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

TA关注的人

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