- 博客(92)
- 收藏
- 关注
原创 基于Java-SpringBoot-VUE的前后端分离的养老驿站管理系统-毕业设计-源代码
该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。毕业设计、开题报告、论文、论文写作、论文答辩、简历项目、接单统统搞定!清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。
2024-03-25 21:01:23 887
原创 深入探究Spring中Bean的生命周期
在Spring源码中,AutowiredAnnotationBeanPostProcessor就是一个MergedBeanDefinitionPostProcessor,它的postProcessMergedBeanDefinition()中会去查找注入点,并缓存在AutowiredAnnotationBeanPostProcessor对象的一个Map中(injectionMetadataCache)。本文将深入探讨Bean的生命周期,从Bean的生成到销毁,逐步解析Spring框架中的关键步骤。
2024-03-22 20:57:38 960
原创 到底什么时候该使用MongoDB
MySql是关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,底层索引组织数据使用B+树,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。在复制集架构中,主节点与备节点之间是通过 oplog 来同步数据的,这里的 oplog 是一个特殊的固定集合,当主节点上的一个写操作完成后,会向 oplog 集合写入一条对应的日志,而备节点则通过这个 oplog 不断拉取到新的日志,在本地进行回放以达到数据同步的目的。其结果是,垂直扩展有一个实际的最大值。
2024-03-18 20:44:22 1353
原创 Spring的简单使用及内部实现原理
在这个示例中,我们使用了AnnotationConfigApplicationContext来加载应用程序的配置类AppConfig,并通过context.getBean()方法获取了一个名为userService的Bean,最后调用了其test()方法。它通过注解的方式告诉Spring在哪里扫描需要管理的Bean,并通过@Bean注解来声明Bean。Spring使用cglib进行AOP时,会生成一个代理类,并在代理类中重写被代理类的方法,在执行代理方法时,会先执行切面逻辑,然后再调用被代理方法。
2024-02-29 21:33:11 965 1
原创 9个接口性能优化方案,RT从9000ms到180ms
总的来说,接口性能优化是一个不断迭代的过程,我将继续努力,不断提升系统的性能,为用户提供更加流畅、高效的使用体验。我用的阿里的 Arthas,下载地址:https://arthas.aliyun.com/doc/download.html。不要在循环中查库,可以把符合条件的数据查出来放 map 中,以空间换时间。经过不断的优化,将接口从 9000ms 优化到 180ms,先看结果。减少不必要的 RPC 调用,如果必须查,通过一组条件查,加缓存。使用连接池,重用连接,避免重复创建的性能损耗。
2024-02-28 21:38:32 803
原创 你遇到过缓存雪崩、缓存穿透、缓存击穿么
缓存雪崩对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,重启数据库,但是数据库立马又被新的流量给打死了。缓存雪崩的事前事中事后的解决方案如下:事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。事中:本地 ehcache 缓存 + hystri
2021-07-14 21:17:44 194 1
原创 如何设置线程池大小
如何设置线程池大小线程池的线程数量设置过多会导致线程竞争激烈,如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源。那么如何设置才不会影响系统性能呢?线程池原理在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程。Java 在使用线程执行程序时,需要创建一个内核线程;当该 Java 线程被终止时,这个内核线程也会被回收。因此 Java 线程的创建与销毁将会消耗一定的计算机资源,从而增加系统的性能开销。除此之外,大量创建线程同样会给系统带来性能问题,因为内存和 CPU
2021-07-02 09:08:55 817
原创 为什么要用缓存
用缓存,主要有两个用途:高性能、高并发。高性能一个请求过来,操作 mysql,查出一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了,或者变了也可以不用立即反馈给用户。600ms 查出来的结果,放缓存里,一个 key 对应一个 value,下次再查,直接从缓存里,通过一个 key 查出来一个 value,2ms。性能提升 300 倍。就是说对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。高并发
2021-07-01 20:56:07 459
原创 并发容器的使用:识别不同场景下最优容器
并发容器的使用:识别不同场景下最优容器并发场景下的 Map 容器假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下,我们是用一个哈希表来存储商品和销量键值对,然后使用排序获得销量前十的商品。在这里,哈希表是实现该功能的关键。那么请思考一下,如果要你设计这个功能,你会使用哪个容器呢?切忌在并发场景下使用 HashMap。因为在 JDK1.7 之前,在并发场景下使用 HashMap 会出现死循环,从而导致 CPU 使用率居高不下,而扩容是导致死循环的主要原因。虽然 J
2021-06-22 23:50:44 117
原创 如何优化多线程上下文切换?
如果是单个线程,在CPU 调用之后,那么它基本上是不会被调度出去的。如果可运行的线程数远大于 CPU 数量,那么操作系统最终会将某个正在运行的线程调度出来,从而使其它线程能够使用 CPU,这就会导致上下文切换。在多线程中如果使用了竞争锁,当线程由于等待竞争锁而被阻塞时,JVM 通常会将这个锁挂起,并允许它被交换出去。如果频繁地发生阻塞,CPU 密集型的程序就会发生更多的上下文切换。在某些场景下使用多线程是非常必要的,但多线程编程给系统带来了上下文切换,从而增加的性能开销也是实打实存在的。那么我们该如何
2021-06-07 09:08:32 352
原创 ES在数据量很大的情况下(数十亿级别)如何提高查询效率
ES 性能优化没有什么银弹,不要期待调一个参数,可以应对所有的性能慢的场景。ES性能优化的杀手锏——filesystem cache向 es 里写的数据,写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到filesystem cache里面。ES的搜索引擎依赖于底层的filesystem cache,如果给filesystem cache更多的内存,尽量让内存可以容纳所有的idx segment file索引数据文件,那么搜索的时候是走内存的,性...
2021-06-02 09:21:48 1505
原创 哪些操作导致了上下文切换
在并发程序中,并不是启动更多的线程就能让程序最大限度地并发执行。线程数量设置太 小,会导致程序不能充分地利用系统资源;线程数量设置太大,又可能带来资源的过度竞争,导致上下文切换带来额外的系统开销。初识上下文切换其实在单个处理器的时期,操作系统就能处理多线程并发任务。处理器给每个线程分配 CPU 时间片(Time Slice),线程在分配获得的时间片内执行任务。CPU 时间片是 CPU 分配给每个线程执行的时间段,一般为几十毫秒。在这么短的时间内线程互相切换,根本感觉不到,所以看上去就好像是同时进
2021-06-01 09:13:46 710
原创 使用乐观锁优化并行操作
Synchronized 和 Lock 实现的同步锁机制,这两种同步锁都属于悲观锁,是保护线程安全最直观的方式。悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。乐观锁的优化方法,看看怎么使用才能发挥它最大的价值。什么是乐观锁乐观锁,就是说在操作共享资源时,它总是抱着乐观的态度进行,它认为自己可以成功地完成操作。但实际上,当多个线程同时操作一个共享资源时,只有一个线程会成功,那么失败的线程呢?它们不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并
2021-05-10 09:06:11 88
原创 ES 的分布式架构原理
ElasticSearch 设计的理念是分布式搜索引擎,底层其实是基于 lucene 的。核心思想是在多台机器上启动多个 ES 进程实例,组成了一个 ES 集群。ES 中存储数据的基本单位是索引,例如在 ES 中存储一些订单数据,在 ES 中创建一个索引 order_idx ,所有的订单数据写到这个索引里面,一个索引相当于 mysql 里的一张表。index -> type -> mapping -> document -> field。在这里做个类比。但是切记,不要划等号,
2021-05-08 09:30:31 237 2
原创 深入了解Lock同步锁的优化方法
在 JDK1.5 之后,Java 还提供了 Lock 同步锁。那么它有什么优势呢?相对于需要 JVM 隐式获取和释放锁的 Synchronized 同步锁,Lock 同步锁(以下简称 Lock 锁)需要的是显示获取和释放锁,这就为获取和释放锁提供了更多的灵活性。Lock锁的基本操作是通过乐观锁来实现的,但由于 Lock 锁也会在阻塞时被挂起,因此它依然属于悲观锁。从性能方面上来说,在并发量不高、竞争不激烈的情况下, Synchronized 同步锁由于具有分级锁的优势,性能上与 Lock ...
2021-05-07 09:07:12 116
原创 ElasticSearch核心概念
“对内容不感兴趣拉到最后领取今天的外卖红包。”Lucene 和 ES 的前世今生Lucene 是最先进、功能最强大的搜索库。如果直接基于 Lucene 开发,非常复杂,即便写一些简单的功能,也要写大量的 Java 代码,需要深入理解原理。ElasticSearch 基于 Lucene,隐藏了 lucene 的复杂性,提供了简单易用的 RESTful api / Java api 接口(另外还有其他语言的 api 接口)。 分布式的文档存储引擎 分布式的搜索引擎和分析引擎..
2021-05-06 09:10:06 72
原创 深入了解Synchronized同步锁的优化方法
“对内容不感兴趣拉到最后领取今天的外卖红包。”在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。在JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。到了 JDK1.5 版本,并发包中新增了 Lock 接口来实现锁功能,它提供了与 Synchronized 关键字类似的同步功能,只是在使用时需要显示获取和释放锁。Lock ..
2021-05-04 22:16:52 727 6
原创 消息队列该如何进行架构设计
“对内容不感兴趣拉到最后领取今天的外卖红包。”- 首先这个 mq 支持可伸缩性,需要的时候快速扩容,就可以增加吞吐量和容量,设计个分布式的系统,参照一下 kafka 的设计理念,broker -> topic -> partition,每个 partition 放一个机器,存一部分数据。如果现在资源不够了,给 topic 增加 partition,然后做数据迁移,增加机器。- 其次考虑一下 mq 的数据落地,落磁盘才能保证进程挂了数据不丢。落磁盘的时候顺序写,没有磁盘随机读写的寻..
2021-04-29 08:58:11 176 3
原创 推荐几款常用的性能测试工具
“对内容不感兴趣拉到最后领取今天的外卖红包。”常用的性能测试工具对于开发人员来说,首选是一些开源免费的性能(压力)测试软件,例如 ab(ApacheBench)、JMeter 等;对于专业的测试团队来说,付费版的 LoadRunner 是首选。当然,也有很多公司是自行开发了一套量身定做的性能测试软件,优点是定制化强,缺点则是通用性差。重点介绍 ab 和 JMeter 两款测试工具的特点以及常规的使用方法。1.abab 测试工具是 Apache 提供的一款测试工具,具有简单易...
2021-04-27 08:57:40 9293
原创 深入了解NIO的优化实现原理
对内容不感兴趣拉到最后领取今天的外卖红包。Tomcat 中经常被提到的一个调优就是修改线程的 I/O 模型。Tomcat 8.5 版本之前,默认情况下使用的是 BIO 线程模型,如果在高负载、高并发的场景下,可以通过设置 NIO 线程模型,来提高系统的网络通信性能。Tomcat 在 I/O 读写操作比较多的情况下,使用 NIO 线程模型有明显的优势。Tomcat 中看似一个简单的配置,其中却包含了大量的优化升级知识点。下面我们就从底层的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型.
2021-04-25 09:17:11 266
原创 网络通信优化之通信协议:如何优化RPC网络通信?
RPC 通信是大型服务框架的核心我们经常讨论微服务,首要应该了解的就是微服务的核心到底是什么,这样我们在做技术选型时,才能更准确地把握需求。就我个人理解,我认为微服务的核心是远程通信和服务治理。远程通信提供了服务之间通信的桥梁,服务治理则提供了服务的后勤保障。所以,我们在做技术选型时,更多要考虑的是这两个核心的需求。服务的拆分增加了通信的成本,特别是在一些抢购或者促销的业务场景中,如果服务之间存在方法调用,比如,抢购成功之后需要调用订单系统、支付系统、券包系统等,这种远程通信就很容易成为系统的瓶颈。所
2021-04-23 08:40:27 449
原创 网络通信优化之序列化:避免使用Java序列化
网络通信优化之序列化:避免使用Java序列化两个服务之间要共享一个数据对象,就需要从对象转换成二进制流,通过网络传输,传送到对方服务,再转换回对象,供服务方法调用。这个编码和解码过程我们称之为序列化与反序列化。在大量并发请求的情况下,如果序列化的速度慢,会导致请求响应时间增加;而序列化后的传输数据体积大,会导致网络吞吐量下降。所以一个优秀的序列化框架可以提高系统的整体性能。Java 提供了 RMI 框架可以实现服务与服务之间的接口暴露和调用,RMI 中对数据对象的序列化采用的是 Java 序列化。而目
2021-04-22 08:45:37 265
原创 如何解决消息队列的延时以及过期失效问题
大量消息在 mq 里积压了几个小时没解决几千万条数据在 MQ 里积压了几个个小时。一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条,一分钟就是 18 万条。所以如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概 1 小时的时间才能恢复过来。临时紧急扩容具体操作步骤和思路如下:先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉。新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数
2021-04-21 09:16:43 1433 1
原创 网络通信优化之I/O模型:如何解决高并发下I/O瓶颈?
什么是 I/OI/O 是机器获取和交换信息的主要渠道,而流是完成 I/O 操作的主要方式。在计算机中,流是一种信息的转换。流是有序的,因此相对于某一机器或者应用程序而言, 通常把机器或者应用程序接收外界的信息称为输入流(InputStream),从机器或者应 用程序向外输出的信息称为输出流(OutputStream),合称为输入 / 输出流(I/O Streams)。机器间或程序间在进行信息交换或者数据交换时,总是先将对象或数据转换为某种形式的流,再通过流的传输,到达指定机器或程序后,再将流转换为对象
2021-04-20 08:53:43 322
原创 深入浅出HashMap的设计与优化
深入浅出HashMap的设计与优化HashMap 的实现结构了解完数据结构后,我们再来看下 HashMap 的实现结构。作为最常用的 Map 类,它是基 于哈希表实现的,继承了 AbstractMap 并且实现了 Map 接口。哈希表将键的 Hash 值映射到内存地址,即根据键获取对应的值,并将其存储到内存地址。 也就是说 HashMap 是根据键的 Hash 值来决定对应值的存储位置。通过这种索引方式, HashMap 获取数据的速度会非常快。例如,存储键值对(x,“aa”)时,哈希表会通过哈希函
2021-04-12 23:12:53 106
原创 如何保证消息队列的高可用?
如何保证消息队列的高可用?RabbitMQ 的高可用性RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的。RabbitMQ 有2种模式:普通集群模式、镜像集群模式。普通集群模式普通集群模式,意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。消费的时候,实际上如
2021-04-08 22:29:15 75
原创 为什么使用消息队列
为什么使用消息队列消息队列的使用场景比较核心的有 3 个:解耦、异步、削峰。解耦A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统跟其它的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把消息存起来?如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费
2021-04-07 22:29:23 79
原创 一个 Split() 方法为什么会影响到 TPS
一个 Split() 方法为什么会影响到 TPS正则表达式是计算机科学的一个概念,很多语言都实现了它。正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。构造正则表达式语法的元字符,由普通字符、标准字符、限定字符(量词)、定位字符(边界字符)组成。正则表达式引擎正则表达式是一个用正则符号写出的公式,程序对这个公式进行语法分析,建立一个语法分析树,再根据这个分析树结合正则表达式的引擎生成执行程序(这个执行程序我们把它称作状态机,也叫状态自动机),用于字符匹配。而这里的正则表达式
2021-04-06 22:09:07 196
原创 Stream如何提高遍历集合效率?
什么是 Stream?现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。但在后台管理员审核订单时,他们需要将各个数据源的数据查询到应用层之后进行合并操作。例如,当我们需要查询出过滤条件下的所有订单,并按照订单的某个条件进行排序,单个数据源查询出来的数据是可以按照某个条件进行排序的,但多个数据源查询出来已经排序好的数据,并不代表合并后是正确的排序,所以我们需要在应用层.
2021-04-04 23:36:46 499
原创 Arthas 线上环境调试 打印方法输入输出
Arthas 线上环境调试 打印方法输入输出Arthascurl -L https://arthas.aliyun.com/install.sh | shvi as.sh 设置JAVA_HOME查看进程:jps启动:./as.sh 进程号watch -b com.tianan.v2x.axtagent.web.controller.api.MessagePushController rss ‘“params[0]=”+params[0]’watch -b com.tianan.v2x.a
2021-03-30 16:10:08 1722
原创 ArrayList 和 LinkedList测试
ArrayList 和 LinkedList测试1.ArrayList 和 LinkedList 新增元素操作测试测试结果 (花费时间):通过这组测试,我们可以知道 LinkedList 添加元素的效率未必要高于 ArrayList。从集合头部位置新增元素从集合中间位置新增元素从集合尾部位置新增元素ArrayList>LinkedListArrayList<LinkedListArrayList<LinkedList由于 ArrayList 是数组实现的,而数组是一块连
2021-03-25 17:50:49 292
原创 不能纵向发展就横向发展
“好长时间没有更新了,最近付费学习了两个课程,一个是微淼商学院的课程,课程里面需要大量的分析财报,所以没有时间更新,后面会一一分享出来。学完了又加入了帅张的星球,里面的内容给我很大的震撼,下面的内容来自帅张的星球。”01—如果是让你回家卖卤菜,你会怎么做呢?02—给快递小哥的三个建议03—趋势的力量最后的话回到标题的问题怎么找到能飞的风口,无非两个,一是平常努力积累,这个在哪里都可以;另外一...
2021-01-28 13:58:06 248
转载 Android(Java):Android 事件分发机制
Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315),请尊重他人的辛勤劳动成果,谢谢!今天这篇文章主要分析的是Android的事件分发机制,采用例子加源码的方式让
2014-06-20 15:24:58 966
转载 Android(Java):AsyncTask
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17596225前言什么是AsyncTask,相信搞过android开发的朋友们都不陌生。AsyncTask内部封装了Thread和Handler,可以让我们在后台进行计算并且把计算的结果及时更新到UI上,而这些正是Thread+Handler所做的事情,没错,A
2014-06-11 15:10:16 1090
原创 Android(Java):视频播放升级版——播放m3u8
直接上代码 http://schemas.android.com/apk/res/android" android:background="#FFFFFF" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_p
2014-01-06 18:00:30 4525
原创 Android(Java):得到新打开Activity 关闭后返回的数据
如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int
2014-01-03 15:11:00 1153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人