![](https://img-blog.csdnimg.cn/f0e21f7d17a24539be2e4eb30989a937.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java中级系列
文章平均质量分 87
spring家族,中间件等介绍
智能编程设计工作室
这个作者很懒,什么都没留下…
展开
-
基于JAVA+Uniapp的微信小程序接入微信小程序支付案例(基于APIV3)
小程序接入(基于APIv3进行支付)原创 2024-01-22 14:49:26 · 1156 阅读 · 0 评论 -
那些年你啃过的ConcurrentHashMap
前言我是fancy,一个年纪轻轻bug量就累计到3200个的程序员,同事们都夸我一个人养活了整个测试组。最近迷上了并发编程。并发这玩意怎么说呢,就是你平时工作用不到,一用就用在面试上。这不,又卷起了并发容器。那说起并发容器,你一定也知道那几个,CopyOnWriteArrayList、并发队列BlockingQueue,等等。但是作为面试的典中典,聊到并发容器就无法绕开ConcurrentHashMap。由于篇幅原因,这篇文章不会具体解释那些较为基础的问题,比如为什么散列表数组的长度一定要是原创 2022-05-25 09:15:04 · 96 阅读 · 0 评论 -
基于SpringBoot实现人脸识别功能
前言去年在公司参与了一个某某机场建设智能机场的一个项目,人脸登机是其中的一个功能模块,当时只是写了后台的接口,调用人脸识别设备的api,给闸机回传数据信号,以保障该功能的正常使用。当时因为项目进度紧张,手里还有其他项目赶进度,也就没时间去分享这个功能的实现。前几天刷脸进公司大楼的时候,突然想起来应该写一个功能类似的demo分享个人的一些小小的经验。在当时项目中刷脸的设备终端是采购某某AI公司,当然咱们在demo里面也不可能买一台那东西来瞎搞,于是乎就拿系统刷脸登录来练练手,人脸识别解决方案就用百度云原创 2022-05-23 12:27:09 · 501 阅读 · 0 评论 -
如何优雅地处理重复请求(并发请求)
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。重复的场景有可能是: 黑客拦截了请求,重放 前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了。 网关重发 …. 本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。利用唯一请求编号去重你可能会想到的是,只要请原创 2022-05-23 12:22:50 · 547 阅读 · 0 评论 -
java高并发系列之JMM相关的一些概念
JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,根本就是小菜一碟,如果你读取一个变量,这个变量的值是1,那么你读取到的一定是1,就是这么简单的问题在并行程序中居然变得复杂起来。事实上,如果不加控制地任由线程胡乱并行,即使原本是1的数值,你也可能读到2。因此我们需要在深入了解并行机制的前提下,再定义一种规则,保证多个线程间可以有小弟,正确地协同工作。而原创 2022-05-19 23:13:20 · 125 阅读 · 0 评论 -
java高并发系列之有关并行的两个重要定律
有关为什么要使用并行程序的问题前面已经进行了简单的探讨。总的来说,最重要的应该是处于两个目的。第一,为了获得更好的性能;第二,由于业务模型的需要,确实需要多个执行实体。在这里,我将更加关注第一种情况,也就是有关性能的问题。将串行程序改造为并发程序,一般来说可以提高程序的整体性能,但是究竟能提高多少,甚至说究竟是否真的可以提高,还是一个需要研究的问题。目前,主要有两个定律对这个问题进行解答,一个是Amdahl定律,另外一个是Gustafson定律。Amdahl(阿姆达尔)定律Amda.原创 2022-05-19 23:10:57 · 186 阅读 · 0 评论 -
SpringBoot 如何进行限流?老鸟们还可以这样玩
在之前一篇文章中我们详细介绍了为什么需要对接口进行限流,也介绍了常见的限流算法,最后还基于Guava工具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis + Lua 来实现分布式限流。Lua 脚本和 MySQL 数据库的存储过程比较相似,他们执行一组命令,所有命令的执行要么全部成功或者失败,以此达到原子性。也可以把 Lua 脚本理解为,一段具有业务逻辑的代码块。实现过程第一步:引入Redis依赖包<dependency>&...原创 2022-05-18 09:35:25 · 1065 阅读 · 0 评论 -
SpringBoot 如何进行限流?老鸟们都这么玩的
首先就让我们来看看为什么需要对接口进行限流?为什么要进行限流?因为互联网系统通常都要面对大并发大流量的请求,在突发情况下(最常见的场景就是秒杀、抢购),瞬时大流量会直接将系统打垮,无法对外提供服务。那为了防止出现这种情况最常见的解决方案之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。例如,12306购票系统,在面对高并发的情况下,就是采用了限流。在流量高峰期间经常会出现提示语;"当前排队人数较多,请稍后再试!"什么是限流?有哪些限流算法?限流是对某一时间窗原创 2022-05-18 09:32:59 · 1952 阅读 · 0 评论 -
java高并发系列之并发级别
由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为阻塞、无饥饿、无障碍、无锁、无等待几种。阻塞一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized关键字或者重入锁时,我们得到的就是阻塞的线程。synchronize关键字和重入锁都试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。无饥饿(Starvation-Free)如果线程之间是有优先级的,那么线程调原创 2022-05-17 23:23:51 · 175 阅读 · 0 评论 -
java高并发系列之初始概念
同步(Synchronous)和异步(Asynchronous)同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。如图:上图中显示了同步方法调用和异步方法调用的区别。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则原创 2022-05-17 23:23:05 · 151 阅读 · 0 评论 -
设计模式二三事
设计模式是众多软件开发人员经过长时间的试错和应用总结出来的,解决特定问题的一系列方案。现行的部分教材在介绍设计模式时,有些会因为案例脱离实际应用场景而令人费解,有些又会因为场景简单而显得有些小题大做。本文会结合在美团金融服务平台设计开发时的经验,结合实际的案例,并采用“师生对话”这种相对诙谐的形式去讲解三类常用设计模式的应用。希望能对想提升系统设计能力的同学有所帮助或启发。引言话说这是在程序员世界里一对师徒的对话:“老师,我最近在写代码时总感觉自己的代码很不优雅,有什么办法能优化吗?”“嗯,原创 2022-05-16 09:57:09 · 153 阅读 · 0 评论 -
你真的了解 Synchronized 吗?
前言大家好,我是fancy~Synchronized想必大家在工作中一定有接触过,它算是Java并发场景下实现多线程安全一种比较直接的操作。有人会说它慢,确实。在JDK1.6之前,它有另一个名称叫做:重量级锁。但是从1.6版本起,它就在不断被优化。现如今已经是很成熟的并发安全技术;所以关于Synchronized的考察也常常成为面试官青睐的话题。本文我们会使用图解的方式解析Synchronized的使用和原理,让我们开始吧~对象锁和类锁什么是Synchronized?Synchron原创 2022-05-08 10:35:23 · 247 阅读 · 0 评论 -
程序员想进大厂,不会RocketMQ怎么行
RocketMQ简介RocketMQ主要由Producer、Broker、Consumer三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。RocketMQ架构图核心概念NameServer主要包括两个功能: Broker管理:N..原创 2022-04-28 09:14:12 · 163 阅读 · 0 评论 -
基于Redis实现分布式锁的7种方案
日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。什么是分布式锁?分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。一把靠谱的分布式锁应该有以下几种特征: 「互斥性」: 任意时刻,只有一个客户端能.原创 2022-04-21 20:37:06 · 3986 阅读 · 0 评论 -
Java 线程池常见误区
由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解。我们经常在一些技术书籍或博客上看到,向线程池提交任务时,线程池的执行逻辑如下: 当一个任务被提交后,线程池首先检查正在运行的线程数是否达到核心线程数,如果未达到则创建一个线程。 如果线程池内正在运行的线程数已经达到了核心原创 2022-04-18 09:11:30 · 336 阅读 · 0 评论 -
Tomcat参数调优
tomcat的配置参数奇多,但想要达到优化效果,我们并不需要全部关注。本文将详细介绍一些主要的配置参数,保证让你这只老猫跑的更快!一般最常做的更改,就是修改服务器的端口,也就是server.xml里的Connector部分。典型如下图所示:其实,大部分优化,也是在Connector标签之内,从端口、并发到线程,都可以在这里配置。一. 3个参数搞定并发配置作为一个能承接高并发互联网请求的Web容器,首当其冲的当然是海量请求的冲击。幸运的是Tomcat支持NIO,我们可以通过调整线程数.原创 2022-04-12 13:41:47 · 675 阅读 · 1 评论 -
Nginx 的五大应用场景
一、HTTP服务器Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。1、 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;2、 配置nginx.conf中的serverusermengday staff;http{server{listen...原创 2022-04-11 21:32:00 · 223 阅读 · 1 评论 -
MyBatis 的执行流程
前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1、Mapper接口和映射文件是如何进行绑定的 2、MyBatis中SQL语句的执行流程 3、自定义MyBatis中的参数设置处理器typeHandler 4、自定义MyBatis中结果集处理器typeHandler PS:本文基于MyBatis3.5.5版本源码。概要在MyBatis中,利用编程式进行数据查询,主要就原创 2022-04-11 13:29:53 · 2936 阅读 · 0 评论 -
体系化认识 Nginx
Nginx 特点 高并发、高性能; 模块化架构使得它的扩展性非常好; 异步非阻塞的事件驱动模型这点和Node.js相似; 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性; 热部署、平滑升级; 完全开源,生态繁荣; Nginx 作用Nginx 的最重要的几个使用场景: 静态资源服务,通过本地文件系统提供服务; 反向代理服务,延伸出包括缓存、负载均衡等; API服务,OpenR...原创 2022-04-09 21:37:04 · 922 阅读 · 1 评论 -
分布式锁用 Redis 还是 Zookeeper
为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。此时系统架构如下:但是这样一来会产生一个问题:假如某个时刻,redis里面的某个商品库存为1,此时两个请求同时到来,其中一个请求执行到上图的第3步,更新数据库的库存为0,但是第4步还原创 2022-04-09 11:22:23 · 216 阅读 · 0 评论 -
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
前言在使用spring框架的日常开发中,bean之间的循环依赖太频繁了,spring已经帮我们去解决循环依赖问题,对我们开发者来说是无感知的,下面具体分析一下spring是如何解决bean之间循环依赖,为什么要使用到三级缓存,而不是二级缓存bean生命周期首先大家需要了解一下bean在spring中的生命周期,bean在spring的加载流程,才能够更加清晰知道spring是如何解决循环依赖的正在上传…重新上传取消 图片我们在spring的BeanFactory工厂列举了很多接口,代表着转载 2022-04-08 22:10:57 · 2777 阅读 · 3 评论 -
Spring中经典的9种设计模式
Spring中涉及的设计模式总结1.简单工厂(非23种设计模式中的一种)实现方式:BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。实现原理:bean容器的启动阶段: 读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。原创 2022-04-07 20:59:12 · 323 阅读 · 1 评论 -
Java中的18 把锁
乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|轻量级锁|重量级锁) 锁优化技术(锁粗化、锁消除) 乐观锁和悲观锁悲观锁悲观锁对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他人上厕所只能在门外等候,这种状态就是「阻塞」了。回到代码世界中,一个共享数..原创 2022-04-06 18:09:51 · 251 阅读 · 3 评论