java
文章平均质量分 83
肥肥技术宅
这个作者很懒,什么都没留下…
展开
-
ELK 处理 SpringBoot 日志,真是太妙了!
ELK 是一个开源的实时日志分析平台,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。原创 2023-09-19 13:50:38 · 696 阅读 · 0 评论 -
Redis Stream 数据结构实现原理真的很强
当插入一个键值对时,Redis 会将键按照字符拆分成一个个字符,并根据字符在 Radix tree 中的位置找到合适的节点,如果该节点不存在,则创建新节点并添加到 Radix tree 中。需要注意的是,Redis Stream 是一种超轻量级的 MQ,并没有完全实现消息队列的所有设计要点,所以它的使用场景需要考虑业务的数据量和对性能、可靠性的需求。如下图展示一个简单的前缀树,将根节点到叶子节点的路径对应字符拼接起来,就得到了两个 key(“他说碉堡了”、“他说碉炸了”)。是的话 iskey 的值为 1。原创 2023-09-19 13:44:38 · 518 阅读 · 0 评论 -
你的@Autowired被警告了吗
回到开篇的idea的警告,网上有很多人都赞同的一种说法是,@Resource是JSR规范,@Autowired是Spring提供,不推荐使用绑定了Spring的@Autowired,因为@Resource在更换了框架后,依然可以使用。我不太赞同这种说法,因为idea的错误提示很明确,,不推荐使用属性注入的方式,那换成@Resource,我理解并没有解决这个问题,虽然idea确实不警告了,可能有点掩耳盗铃的意思。原创 2023-09-19 13:40:19 · 541 阅读 · 2 评论 -
为了解决count查询慢而写的分页查询总量缓存器
项目上出现了分页查询接口慢的问题,慢的原因是表数据量大,count查询很慢。分页查询接口有两次查询:count查询需要一行行读数据,累加起来得到总量,效率很低。一行语句,没有可优化空间,pass。查询LIMIT分页数据,靠前的数据一般都不慢,多线程增加代码复杂性,而且目前的问题是count耗时长,所以该方案也pass。简单可行,缺点是数据实时性不高,新增、删除的数量短期内不会更新,不适合用在高实时性的场景下。原创 2023-09-19 13:31:27 · 558 阅读 · 0 评论 -
记录一次OSSClient使用不当导致的OOM排查过程
最近线上有个比较边缘的项目出现OOM了,还好这个项目只是做一些离线的任务处理,出现OOM对线上业务没有什么影响,这里记录一下排查的过程本文介绍了使用Jprofiler排查一次线上由于使用阿里云OSSClient不当导致的OOM过程,主要还是写代码时没有注意OSSClient需要自己手动Shutdown导致的,还好不是出现在核心业务系统中,不然后果就比较麻烦了,以后使用别人提供的工具时一定要多看看官方是如何使用,多翻翻源码,避免再出现类似的问题。原创 2023-09-19 13:29:59 · 286 阅读 · 0 评论 -
session 生命周期和经典案例-防止非法进入管理页面
如果没有调用 setMaxInactiveInterval() 来指定 Session 的生命时长,Tomcat 会以 Session默认时长为准,Session 默认的超时为 30 分钟, 可以在 tomcat 的 web.xml 设置。public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。值为正数的时候,设定 Session 的超时时长。原创 2023-09-19 13:26:47 · 195 阅读 · 0 评论 -
忽视日志吃大亏,手把手教你玩转 SpringBoot 日志!
学习完本文,你应当对现在这几个常用框架的有所了解,并能基础应用了。此次我们没有讲源码,也没有深入的讲其配置及进阶使用,这些我们会在后面慢慢学习。但现在我希望你能知道的是。一定要写好日志,一定要写好日志,一定要写好日志。重要的事情说三遍!这是区别新人和老鸟的一个重要依据,也是让自己排查问题更轻松的不二法门!另外,现在很多中间件都自己引用了日志插件,我们作为一个整体工程在使用中间件时,要及时发现并解决插件冲突,避免我们自己的日志配置失效,这也是一个程序员该注意的点。原创 2023-09-18 13:48:02 · 187 阅读 · 0 评论 -
SpringBoot 玩一玩代码混淆,防止反编译代码泄露
就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件。其余的看注释,可以配置哪些类不参与混淆,哪些枚举保留,哪些方法名不混淆等等。我给你看,但你反编译看到的不是真正的代码。那如果不想给别人反编译看自己写的代码呢?先看一下我们混淆一个项目代码,要做啥?该篇玩的代码混淆 ,是其中一种手段。build标签里面改动加入一下配置。原创 2023-09-18 13:41:56 · 356 阅读 · 0 评论 -
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
Spring框架是使用最广泛的Java框架之一,它提供了一组丰富的与缓存相关的注释,使缓存机制更加高效和简单。在上面的方法中,@Cacheable确保如果complicatedBookOperation特定的结果id已在缓存中,则返回该结果而不执行该方法。在该方法影响可能导致整个缓存过时的数据的情况下,这可能很有用。缓存的核心是一种以允许更快检索的方式存储经常访问的数据的方法。该@EnableCaching注释向 Spring 的缓存机制发出信号,以在整个应用程序中查找其他与缓存相关的注释。原创 2023-09-18 13:38:44 · 258 阅读 · 0 评论 -
面试爽文 :开局一张图,花十分钟了解 HashMap 的树化逻辑
闲来无事,对 HashMap 其中比较重要的节点做了一下深入,然后尝试用最通俗易懂的说法输出出来。看完这篇还能被问住,那不怪你,那是面试官的问题。原创 2023-09-18 13:36:07 · 269 阅读 · 0 评论 -
Java中的HashTable:快速、高效的数据存储与检索方式
本文将介绍Java中的HashTable的实现原理、常用方法和测试用例。首先,我们将介绍哈希表的实现原理和哈希函数的作用。然后,我们将介绍Java中的HashTable的实现和使用方式,包括添加、查找和删除元素等常用方法。最后,我们将介绍如何编写测试用例来验证代码的正确性,以及如何优化哈希函数以提高性能。原创 2023-09-18 13:33:09 · 256 阅读 · 0 评论 -
SpringBoot使用@Async注解8大坑点
SpringBoot中,@Async注解可以实现异步线程调用,用法简单,体验舒适。但是你一定碰到过异步调用不生效的情况,今天,我就列出90%的人都可能会遇到的8大坑点。这里面,我个人认为绝大多数人会遇到的坑点集中在没有配置自定义线程池、异步方法在同一个类中调用、事务不起作用这几个问题上。所以,万金油的写法还是专门定义一个AsyncService,将异步方法都写在里面,需要使用的时候,就在其他类将其注入即可。原创 2023-09-18 13:31:42 · 306 阅读 · 0 评论 -
聊聊Java中String,StringBuilder,StringBuffer那些事
对于这三个,我们首先能知道的就是String是不可变的,StringBuilder和StringBuffer是可变的,那么我们就先说说String,它为什么设计成不可变的以及怎么实现不可变的。原创 2023-09-18 13:29:40 · 114 阅读 · 0 评论 -
字节二面:分布式场景下,数据一致性,你要如何应对?
考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理。拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成订单服务,账户服务。原本收到充值回调后,可以将修改订单状态和增加金币放在一个mysql事务中完成的,但是呢,因为服务拆分了,就面临着需要协调2个服务才能完成这个事务图片,暂且用来定义吧。同样的问题还存在于其他的场景:在涉及支付交易等付费接口的时候,数据一致性的问题就显得尤为重要,因为都是钱啊。原创 2023-09-15 16:35:24 · 150 阅读 · 0 评论 -
Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增
在架构设计中,可以说缓存无处不在。如果你没有实际解决过类似问题,则可以说一下自己的思路,只要大体思路和方向是对的,那么在遇到类似问题的时候,可以利用网络上的资料去逐步尝试解决。jstack有3个参数,第1个参数是前面记下的 PID,之后加上 grep,紧跟着是转成十六进制数的TID,最后加上 –A和一个数字,这个数字表示输出日志的行数,至此就可以直接打印出具体的异常信息了。CPU利用率过高,说明当前服务器要处理的指令比较多,当CPU忙不过来的时候,指令的运行效率自然就会下降,用户的感受就是程序响应变慢了。原创 2023-09-15 16:33:41 · 80 阅读 · 0 评论 -
SpringBoot拦截器和动态代理有什么区别?
[email protected]("拦截器:执行 preHandle 方法。");@OverrideSystem.out.println("拦截器:执行 postHandle 方法。");@OverrideSystem.out.println("拦截器:执行 afterCompletion 方法。");原创 2023-09-15 16:21:43 · 84 阅读 · 0 评论 -
深度解析ForkJoinPool源码:Java并行计算的内部机制
通过深入分析ForkJoinPool的源代码,我们可以更好地理解其内部机制,包括任务的提交和调度、工作窃取算法、Worker线程的管理等方面的细节。这有助于开发者更好地利用ForkJoinPool来实现高效的并行计算。当然,要真正掌握ForkJoinPool,还需要不断实践和深入研究其源码,以满足特定的并发处理需求。原创 2023-09-15 16:10:40 · 156 阅读 · 0 评论 -
记一次线上间隙锁引发的死锁问题
以上就是本次线上问题死锁(通过本地复现)的排查过程,因为有些东西直接上来就说可能不太好,所以本文穿插了很多锁的知识点。由于mysql锁比较复杂,在insert 、update、 for update/lock in share model、delete下的加锁规则可能不同。在堆主键索引,唯一索引,非唯一二级索引,以及无索引的字段上 加的锁又不一致。在等值匹配和范围匹配时加的锁又有可能不一样。在不同隔离级别下加锁规则又不一致。再加上实际项目中复杂的业务逻辑。所以。原创 2023-09-15 15:07:06 · 135 阅读 · 0 评论 -
解密Java中的Map:如何高效地操作键值对?
Map是Java中非常重要的数据结构之一。它存储键值对,可以通过键快速查找对应的值,是我们在实际开发中使用最为频繁的数据结构之一。本文旨在介绍Java中常见的Map实现以及它们的优缺点,以及如何在实际应用中高效地操作键值对。本文首先介绍了Java中常见的Map实现,包括HashMap、TreeMap、LinkedHashMap和ConcurrentHashMap。然后分别介绍它们的特点、优缺点以及适用场景。接着介绍了如何在实际应用中使用Map,包括如何添加、删除、更新和查询键值对。原创 2023-09-15 14:27:58 · 239 阅读 · 0 评论 -
ELK 处理 Spring Boot 日志,不错!
ELK 是一个开源的实时日志分析平台,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。原创 2023-09-13 15:29:28 · 90 阅读 · 0 评论 -
SpringCloud 微服务迁移到 Kubernetes 容器化完整流程
之前本地部署的镜像仓库Harbor: http://192.168.0.127:8084/,如果没有可拿docker-hub注册一个账号。把我们上面手动做的这些,通过Jenkins等组件搭建成一个自动化部署的过程,就涉及到DevOps相关的知识了。推送镜像到镜像仓库需要满足镜像仓库的镜像名称,因此需要给构建好的镜像打个tag。这儿构建时间久是因为第一次构建,需要下载maven依赖,之后构建就会很快了。编写gateway服务的DockerFile,制作镜像。项目镜像:基础镜像+中间件镜像+项目代码。原创 2023-09-13 15:27:03 · 153 阅读 · 0 评论 -
Java中的compareTo方法详解
Comparable是Java中的一个接口,位于java.lang包中。它包含一个方法compareTo,用于定义类的自然排序顺序。自然排序顺序是指一种默认的对象比较方式,通常基于对象的某个属性或多个属性的值。实现Comparable接口的类可以通过compareTo方法来定义它们的自然排序规则。Comparablecsharp复制代码compareTo方法返回一个整数值,该值表示当前对象与另一个对象的比较结果。如果当前对象小于另一个对象,则返回负整数。如果当前对象等于另一个对象,则返回零。原创 2023-09-13 15:19:11 · 1005 阅读 · 0 评论 -
深入理解线程的优雅退出机制
不推荐强制销毁线程,会导致资源无法被释放,进行中请求无法正常处理完,导致业务数据处于不可知的状态。Java推荐优雅退出线程。业务层可以使用字段标记,定期检查是否需要退出任务。Thread.interrupt中断目标线程、isInterrupted查询中断位标记。使用Thread.interrupt处理中断也可以优雅退出,但需要上下层堆栈都要关注中断,不得吞掉中断。原创 2023-09-13 15:17:58 · 183 阅读 · 0 评论 -
@RestController 和 @Controller 的区别
在本文中,我们介绍了和这两个在Spring框架中常用的注解。用于传统的Web应用程序,它处理HTTP请求并返回视图,请确保您在方法中返回视图名称。用于构建RESTful API,它将数据转换为JSON或XML格式,并直接发送给客户端。根据您的需求,选择适合的注解将有助于更好地开发Spring MVC应用程序。原创 2023-09-13 15:04:27 · 201 阅读 · 0 评论 -
Redis:哪些你还不知道的热门应用场景
Redis是一个高性能的键值存储数据库,它具有许多应用场景。本篇文章将介绍一下redis的哪些热门应用场景,并介绍一下这些场景怎么实现它。redis的应用场景缓存排行榜计数器应用共享Session分布式锁社交网络消息队列位操作。原创 2023-09-13 14:54:11 · 91 阅读 · 0 评论 -
CompletableFuture使用与原理解析
在并发编程中,我们一般会使用Runnable编写任务的内容然后提交给线程池交由线程池调度线程执行。这种情况我们通常是针对不关心任务执行的结果,但如果关心任务执行的结果,并且根据执行结果执行后续的动作,这个时候就需要配合使用Callable+Future来实现了,其中Callable关注异步任务的执行,而Future则关注异步任务的执行结果,它提供了方法来检查任务是否完成,并在完成后获取结果。我们可以看下下面的代码:java复制代码package com.markus.concurrent.future;原创 2023-09-13 14:07:39 · 162 阅读 · 0 评论 -
面试官:说说BIO、NIO、AIO有什么区别
Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,「网络上的数据传输流」,字符串流,对象流等等等。比如程序从服务器上下载图片,就是通过流的方式从网络上以流的方式到程序中,在到硬盘中。原创 2023-09-12 14:16:59 · 184 阅读 · 0 评论 -
面试官:MySQL 上亿大表,如何深度优化?
表数据量太大时,除了关注访问该表的响应时间外,还要关注对该表的维护成本(如做 DDL 表更时间太长,delete 历史数据)。对大表进行 DDL 操作时,要考虑表的实际情况(如对该表的并发表,是否有外键)来选择合适的 DDL 变更方式。对大数据量表进行 delete,用小批量删除的方式,减少对主实例的压力和主从延迟。原创 2023-09-12 14:08:51 · 235 阅读 · 0 评论 -
线上的接口响应时间太长,怎么排查?
Arthas是阿里开源的一款 Java 诊断工具,可以在无需重启 JVM 的情况下,实时查看应用 load、内存、gc、线程等状态信息,还能实时查看方法调用入参、出参、方法调用耗时等。原创 2023-09-12 14:04:38 · 207 阅读 · 0 评论 -
Java中的ArrayList:Java中最常用的动态数组,你了解多少?
在Java语言中,数组的大小是在创建时就已经确定的,而且一旦确定之后也不能再次改变。为了弥补这个不足,Java提供了ArrayList类,它封装了一个动态的可增长的对象数组。ArrayList比数组具有更大的灵活性和更方便的方法。本文将对ArrayList的原理与使用进行详细介绍。ArrayList是什么,它有哪些特点;ArrayList的源码实现与详细解析;ArrayList的常用方法介绍;ArrayList的测试用例;全文小结。原创 2023-09-12 13:59:05 · 64 阅读 · 0 评论 -
【Java基础】面试官:Java 对象是值传递还是引用传递?
【代码】【Java基础】面试官:Java 对象是值传递还是引用传递?原创 2023-09-12 13:54:37 · 94 阅读 · 0 评论 -
Java中的LinkedList:为什么它是数据结构中的万能选择?
在Java中,有很多数据结构可供选择,如ArrayList、LinkedList、Stack、Queue等等。其中,LinkedList是被广泛使用的一种数据结构。在本篇文章中,我们将探讨LinkedList在Java中的广泛应用,并解释为什么它是数据结构中的万能选择。LinkedList是一种非常常见的数据结构,它在Java编程中有着广泛的应用。它由一系列的节点组成,每个节点包含一个指向前一个节点的引用和一个指向后一个节点的引用。LinkedList具有许多优点,如高效的插入和删除操作、动态内存分配等等。原创 2023-09-12 13:25:15 · 49 阅读 · 0 评论 -
如何优化面对高流量的Api请求
面对高流量的 API,我们需要综合运用多种策略和技术来确保稳定性。以上只是其中的一些常见做法,实际应用中还需要结合业务场景灵活调整。原创 2023-09-09 13:39:08 · 95 阅读 · 0 评论 -
如何优雅的实现接口统一调用
这是我之前设计的关于接口统一调用的流程,当然其实还是包括对接第三方重复调用的问题、调用结果缓存、调用超时解决、失败降级的一些策略,如果还有更好的接口统一调用方式欢迎大家评论区留言讨论;原创 2023-09-09 10:06:32 · 220 阅读 · 0 评论 -
别再把静态初始化块和实例初始化块混为一谈了
在Java中,静态初始化块(Static Initialization Block)是一个代码块,用于在类加载时执行一次特定的初始化操作。它被声明为static关键字,并且没有任何参数或返回值。静态初始化块在类被加载时执行,它是类的静态成员之一。它的主要目的是在类加载时提供一个机会来执行一些静态初始化任务,例如初始化静态变量或执行一些静态方法。静态初始化块使用静态关键字static声明,并写在类体中,没有方法名。它可以包含任意的Java代码,可以访问类的静态成员变量和静态方法。java复制代码。原创 2023-09-09 10:05:18 · 62 阅读 · 0 评论 -
JWT进行请求头校验
最后,将认证对象设置到当前的安全上下文中,这样就代表验证完成了。默认提供的过滤器链是一组预定义的过滤器,用于处理各种安全相关的任务,比如身份验证、授权、会话管理等。是登录进去,但没有权限访问一些页面的处理器,其他没有什么要注意的,也可以把这些处理器写成一个,那样就清爽多了,但我懒,代码就不贴了。这里就是先获取请求头内令牌的内容,再调用工具类的方法对令牌进行解析,方法内部校验令牌的合法与解析,将jwt令牌转化成。第二个参数是凭证,就是密码之类的,我们不需要,所以传null。配置类,我们将他引入,原创 2023-09-09 10:02:40 · 172 阅读 · 0 评论 -
【多线程系列】终于懂了 Java 中的各种锁
阻塞 & 非阻塞 了解阻塞和非阻塞前,大家需要知道唤醒和阻塞一个Java线程需要操作系统进行用户态到内核态的切换,这种切换是十分耗时处理器时间的,如果同步代码块的内容过于简单,状态转换消耗的时间可能比用户代码执行时间还长,这是十分不划算的,因此我们引入了非阻塞的概念。概念 从上面的介绍中我们其实已经可以了解到阻塞和非阻塞的概念。多线程访问互斥资源时,当互斥资源已被占用,阻塞线程,当互斥释放时,唤醒线程进行竞争称为阻塞式同步;而当互斥资源被占用时,不进行线程阻塞而通过自旋等待其它线程释放锁或原创 2023-09-09 10:01:07 · 67 阅读 · 0 评论 -
利用好异常捕获,再也不担心问题无从下手
自定义异常类十分简单,只需继承,并编写相应的构造方法即可,使用方法同上。java复制代码} }原创 2023-09-08 13:53:00 · 125 阅读 · 0 评论 -
面试官:如何设计出健壮的秒杀系统?
然后发送到队列里,队列接受消息,异步下单。其中用到了tryAcquire方法,这个方法的主要作用是设定一个超时的时间,如果在指定的时间内预估(注意是预估并不会真实的等待),如果能拿到令牌就返回true,如果拿不到就返回false.然后我们让无效的直接跳过,这里设定每秒生产1个令牌,让每个任务尝试在。假如我们的并发请求是400万瞬间的请求,将令牌产生的效率设为每秒20个,每次尝试获取令牌的时间是0.05秒,那么最终测试下来的结果是,每次只会放行4个左右的请求,大量的请求会被拒绝,这就是令牌桶算法的优秀之处。原创 2023-09-08 13:45:02 · 88 阅读 · 0 评论 -
日流量200亿,聊聊携程网关的架构设计
类似于许多企业的做法,携程 API 网关是伴随着微服务架构一同引入的基础设施,其最初版本于 2014 年发布。随着服务化在公司内的迅速推进,网关逐步成为应用程序暴露在外网的标准解决方案。后续的“ALL IN 无线”、国际化、异地多活等项目,网关都随着公司公共业务与基础架构的共同演进而不断发展。截至 2021 年 7 月,整体接入服务数量超过 3000 个,日均处理流量达到 200 亿。原创 2023-09-08 13:41:48 · 324 阅读 · 0 评论