自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(211)
  • 资源 (3)
  • 收藏
  • 关注

原创 实现数据库中的数据实时同步到redis,ElasticSearch

详细请查看数据库中的数据同步到redis和数据库中的数据同步到es(es基于7.2版本)里面有详细的Readme.md说明,如果有什么问题欢迎留言和建议。该项目模块包括分布式事务的实现、分布式搜索ElasticSearch7.2、数据的实时同步、使用rabbitmq进行消息的订阅与发布,并保证生产端到消息中间件的消息不丢失,消息重发策略,消息中间件到消费端的消息不丢失,死信队列的实现等功能,全...

2019-07-29 19:55:43 4477 1

原创 揭秘完整的手机扫码登录的实现原理

(1)手机扫码登录中二维码的状态变更涉及到服务器和客户端之间的通信问题,有多种实现方案(2)手机扫码登录中核心是已在APP上登录的用户使用APP帮助PC客户端拿到服务器颁发的pc-token来实现PC端的登录。

2024-06-28 14:33:52 415

原创 防重放(接口防抖)

设置额外选项:过期时间和SET_IF_ABSENT选项”,有些同学可能不太清楚SET_IF_ABSENT是个啥,这里我解释一下:SET_IF_ABSENT是 RedisStringCommands.SetOption 枚举类中的一个选项,用于在执行 SET 命令时设置键值对的时候,如果键不存在则进行设置,如果键已经存在,则不进行设置。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。

2024-06-12 16:12:30 1123

原创 Netty+SpringBoot 打造一个 TCP 长连接通讯方案

另一个需要注意的点是EventLoopGroup是从构造函数传入的,而不是在客户端中创建的,因为当客户端数量非常多时,每个客户端都创建自己的线程组会极大的消耗服务器资源,因此我们在实际使用中是按业务去创建统一的线程组给该业务下的所有客户端共同使用的,线程组的大小需要根据业务需求灵活配置。当消费者接收到某设备发送的消息后,将判断缓存中是否存在该设备与服务端的连接,如果存在并且通道活跃则使用该通道发送消息,如果不存在则创建通道并在通道激活后立即发送消息,当客户端收到来自服务端的消息时进行响应的业务处理。

2024-05-16 10:03:48 870

原创 多线程事务怎么回滚

1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。3,下面用一个简单示例演示多线程事务。

2024-04-27 14:32:09 857

原创 怎样快速插入数据

1.2、实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml2、MyBatis实现插入30万条数据使用了 MyBatis 的批处理操作,将每 1000 条数据放在一个批次中插入,能够较为有效地提高插入速度。同时请注意在循环插入时要带有合适的等待时间和批处理大小,以防止出现内存占用过高等问题。此外,还需要在配置文件中设置合理的连接池和数据库的参数,以获得更好的性能。在上面的示例中,我们每插入10

2024-04-23 16:18:22 618

原创 CompletableFuture 处理异步异常

0L,在使用异步CompletableFuture时,无论是否有返回值都要调用get()/join()方法,避免程序执行报错了,仍然返回成功。如果在程序报错时需要对上一个异步任务结果做其他操作,可以调用whenComplete()、handle()处理,如果只是对异常做处理,不涉及对上一个异步任务结果的情况,调用exceptionally()处理。

2024-04-15 16:10:58 418

原创 Nginx配置

上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。相同类型的表达式,字符串长的会优先匹配。

2024-04-15 15:13:16 955

原创 SpringBoot 接口加密解密,新姿势!

在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用如果我们想保证数据传输的安全,对接口出参加密,入参解密。但是不想写重复代码,我们可以提供一个通用starter,提供通用加密解密功能自定义starter步骤创建工厂,编写功能代码声明自动配置类,把需要对外提供的对象创建好,通过配置类统一向外暴露。

2024-04-13 14:53:32 2930

原创 SpringCloud Alibaba技术栈实战

SpringCloud Alibaba技术栈实战

2020-12-14 17:37:52 415

原创 Java 开发提升十倍生产力:IDEA 远程一键部署 Spring Boot 到 Docker

https://mp.weixin.qq.com/s/3x0MLz7DkHZ49EnmDzNcBQ

2020-10-03 16:32:26 431

转载 Spring Boot 如何使用拦截器、过滤器、监听器?

过滤器过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术。如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 Session 校验,判断用户权限,如果不符合设定条件,则会被拦截到特殊的地址或者基于特殊的响应。过滤器的使用首先需要实现 Filter接口然后重写它的三个方法init 方法:在容器中创建当前过滤器的时候自动调用destory 方法:在容器中销毁当前过滤器的时候自动调用doFilter 方法:过滤的

2020-09-25 14:40:49 361

转载 简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式和工厂方法模式抽象工厂模式

2020-09-14 14:23:47 158

转载 Reactor模式

在扯到Kafka之前我们先来说说Reactor模式,基本上只要是底层的高性能网络通信就离不开Reactor模式。像Netty、Redis都是使用Reactor模式。像我们以前刚学网络编程的时候以下代码可是非常的熟悉,新来一个请求,要么在当前线程直接处理了,要么新起一个线程处理。在早期这样的编程是没问题的,但是随着互联网的快速发展,单线程处理不过来,也不能充分的利用计算机资源。而每个请求都新起一个线程去处理,资源的要求就太高了,并且创建线程也是一个重操作。说到这有人想到了,那搞个线程池不就完事了嘛,

2020-08-22 17:43:49 216

转载 抛出这8个问题,检验你是否真的会ThreadLocal

一、概述1、官方术语ThreadLocal类是用来提供线程内部的局部变量。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。2、大白话ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多个线程之间彼此并不独立,是共享变量。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。也就是说:将线程公有化变成线程私有化。二、应用场景每个

2020-08-18 20:24:42 223 1

转载 每秒上千订单场景下的分布式锁高并发优化实践!

每秒上千订单场景下的分布式锁高并发优化实践!

2020-08-13 17:18:23 188

原创 丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!

在前几天的文章《为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?》中,我曾经对几款属性拷贝的工具类进行了对比。然后在评论区有些读者反馈说MapStruct才是真的香,于是我就抽时间了解了一下MapStruct。结果我发现,这真的是一个神仙框架,炒鸡香。这一篇文章就来简单介绍下MapStruct的用法,并且再和其他几个工具类进行一下对比。为什么需要MapStruct ?首先,我们先说一下MapStruct这类框架适用于什么样的场景,为什么市面上会有这么多的类似的框架。在软件

2020-08-12 16:25:46 128

原创 如何去掉 list 集合中重复的元素

在实际开发的时候,我们经常会碰到这么一个困难:一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,实际上我们需要根据条件筛选出没有重复的对象。比较暴力的方法,就是根据业务需求,通过两层循环来进行判断,没有重复的元素就加入到新集合中,新集合中已经有的元素就跳过。操作例子如下,创建一个实体对象PenBean,代码如下:/** * 笔实体 */public class PenBean { /**类型*/ private String type; /**

2020-08-12 15:01:15 1555

原创 外观模式—门面模式

上面是外观模式的基本调用逻辑图,外观模式就是怎么把多个子系统的接口合并成一个接口供客户端调用,就是所谓的“套餐”,就是底层细粒度接口的不同组合。在保留底层接口不变的前提下,中间层为调用方提供了便利。这正是外观模式(Facade Pattern)的设计思想:为了使复杂的子系统更容易被使用,应当为子系统的众多接口提供一个简洁的高层接口。上图中,几个SubSystem类对应着我们刚才所说的底层基础功能,而Facade类对应着中间层,为调用方提供“套餐”服务。代码实现:public class Sub.

2020-08-10 09:58:21 126

转载 分布式 Session 解决方案

分布式Session一致性?说白了就是服务器集群Session共享的问题Session的作用?Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionid没有找到对应的数据那么服务器会创建一个新的sessionid并且响应给客户端。分布式Session存在的问题

2020-07-25 18:16:48 134

原创 Ubuntu18.04下安装MySQL

提示:以下操作均在root用户下进行,如在普通用户,请自行加上sudo!查看有没有安装MySQL:dpkg -l | grep mysql安装MySQL:apt install mysql-server安装完成之后可以使用如下命令来检查是否安装成功:netstat -tap | grep mysql通过上述命令检查之后,如果看到有 mysql 的socket处于 LISTEN 状态则表示安装成功。登录mysql数据库可以通过如下命令:mysql -u root -p-u 表示选择登陆

2020-07-17 13:49:43 1008

原创 太逗了,面试官让我讲线程 WAITING 状态!

太逗了,面试官让我讲线程 WAITING 状态!

2020-07-11 17:02:56 147

转载 分布式事务TCC结合业务说明

一、业务场景介绍咱们先来看看业务场景,假设你现在有一个电商系统,里面有一个支付订单的场景。那对一个订单支付之后,我们需要做下面的步骤:更改订单的状态为“已支付”扣减商品库存给会员增加积分创建销售出库单通知仓库发货这是一系列比较真实的步骤,无论大家有没有做过电商系统,应该都能理解。二、进一步思考好,业务场景有了,现在我们要更进一步,实现一个TCC分布式事务的效果。什么意思呢?也就是说,订单服务-修改订单状态,库存服务-扣减库存,积分服务-增加积分,仓储服务-创建销售出库单。上述这几个步

2020-07-11 16:57:14 349

转载 观察者模式

设计模式中的 “观察者模式”

2020-07-07 14:11:46 130

转载 直接干掉 RESTful:GraphQL 是真的香!

GraphQL 是真的香

2020-07-07 10:40:36 348

转载 java执行反射代码导致频繁创建奇怪的类从而发生元数据区被占满FUllGc案例

查看 JVM GC 日志没有一丝耽搁,老王立刻调出了线上GC日志,在日志里,看到了一个“Metadata GC Threshold”的字样,类似于如下日志:【Full GC(Metadata GC Threshold)xxxxx, xxxxx】通过GC日志,老王立即定位到这次频繁的Full GC,实际上是JDK 1.8以后的Metadata元数据区导致的。奇怪了,Metadata区域一般是放一些加载到JVM里去的类,为什么会被频繁的塞满,进而触发Full GC呢?老王陷入了沉思,一旁的小猛和彪

2020-07-03 13:49:07 3547 2

转载 Centos7安装docker

一、安装docker1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本 $ uname -r2、使用 root 权限登录 Centos。确保 yum 包更新到最新。$ sudo yum update3、卸载旧版本(如果安装过旧版本的话)$ sudo yum remove docker docker-common docker-selinux doc

2020-06-30 10:44:51 144

转载 HTTPS 的工作原理

当你打开浏览器,访问某个网站,如果网址旁有个小锁,代表访问的网址是安全的,反之不安全。当我们没有看到那个小锁的小图标的时候,需要提高警惕,不要随意输入个人重要的资料。所有的银行和支付相关的网站都是100%使用HTTPS的。我们为什么需要HTTPS?主要有三个原因:保护隐私(Privacy):所有信息都是加密传播,第三方无法窃听数据。如果使用HTTP明文传输数据的话,很可能被第三方劫持数据,那么所输入的密码或者其他个人资料都被暴露在他人面前,后果可想而知。数据完整性(Integraty):一旦第三方

2020-06-18 10:36:52 553

转载 如果项目今后需要扩展,那么可以考虑不要使用lombok

我承认,Lombok是一个很不错的Java库,它可以让你在少写代码的同时耍耍酷,简单的几个注解,就可以干掉一大片模板代码。但是,所有的源代码很多时候是用来阅读的,只有很少的时间是用来执行的(你可以细品这句话)。一年以前,我和大多数人都认为Lombok的出现会让Java的编码体验会更好,并极力的在我的团队中推荐使用Lombok。一年以后,我开始对此产生顾虑,尤其是在我准备为开源的博客系统Una-Boot升级Java版本时,我才意识到Lombok自己掉入了一个戏法陷阱。在我进一步分析其源代码并理解相关注

2020-06-18 09:42:35 657 3

转载 想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做

想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做

2020-06-15 15:39:21 355

转载 高并发下,你都怎么选择最优的线程数

为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 。但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。那么在高并发的情况下,我们怎么选择最优的线程数量呢?选

2020-06-15 15:00:32 1965 1

转载 HashMap 这一篇就够了

二狗:先来点简单的,介绍下 HashMap 的底层数据结构吧。囧辉:我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。二狗:为什么要改成“数组+链表+红黑树”?囧辉:主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。二狗:那在什么时候用链表?什么时候用红黑树?囧辉:对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值

2020-06-12 17:57:07 374

转载 Java GC:干掉 cms,zgc 才是未来

JAVA程序最爽的地方是它的GC机制,开发人员不需要关注内存申请和回收问题。同时,JAVA程序最头疼的地方也是它的GC机制,因为掌握JVM和GC调优是一件非常困难的事情。在ParallelOldGC、CMS、G1之后,JDK11带来的全新的「ZGC」为我们解决了什么问题?Oracle官方介绍它是一个Scalable、Low Latency的垃圾回收器。所以它的目的是「降低停顿时间」,由此会导致吞吐量会有所降低。吞吐量降低问题不大,横向扩展几台服务器就能解决问题了啦。ZGC目标如下图所示,ZGC的目标主

2020-06-09 10:56:36 223

转载 《Spring 设计思想》AOP 设计思想与原理

Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Spring AOP。1. Java程序运行在JVM中的特征当我们在某个类Foo中写好了一个main()方法,然后执行java Foo,你的Java程序之旅就开启了,如下:那么在这个执行的过程中,JVM都为你干了什么呢?当你执行java Foo 的时候,JVM会创建一个主线程main,这个主线程以上述的main()

2020-06-08 20:14:25 277

转载 9种分布式ID生成方式

一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID?拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯

2020-06-04 20:17:38 242

原创 虚拟机扩容磁盘创建分区

虽然已经扩大了磁盘,但是由于还没有经过分区,指定文件系统,所以linux操作系统无法识别(其实就相当于你的硬盘虽然大了,但是你并没有对其进行分区是一个道理)。下面我们进行分区处理。分区:fdisk命令: fdisk -l :打印当前的磁盘分区表,这时我们可以看到磁盘的总量但是分区只有以前的那几个原有的分区。键入命令:fdisk /dev/sda “sda就是经过扩容的硬盘,为SCSI硬盘,IDE类型硬盘对应为hda,是对该硬盘进行操作”键入 : m “ 列出fdisk的帮助”我

2020-06-04 11:11:09 1327

转载 JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof 使用详解

现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高…这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。一、 jps(Java Virtual Machine

2020-05-25 10:36:04 272

转载 Spring 异步调用,一行代码实现!舒服,不接受任何反驳~

1. 概述在日常开发中,我们的逻辑都是同步调用,顺序执行。在一些场景下,我们会希望异步调用,将和主线程关联度低的逻辑异步调用,以实现让主线程更快的执行完成,提升性能。例如说:记录用户访问日志到数据库,记录管理员操作日志到数据库中。异步调用,对应的是同步调用。同步调用:指程序按照 定义顺序 依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用:指程序在顺序执行时,不等待异步调用的语句返回结果,就执行后面的程序。考虑到异步调用的可靠性,我们一般会考虑引入分布式消息队列,例如说 R

2020-05-22 18:48:04 563

转载 Spring Boot 监听 Redis Key 失效事件实现定时任务

业务场景我们以订单功能为例说明下:生成订单后一段时间不支付订单会自动关闭。最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率。还有一种想法,在用户进入订单界面的时候,判断时间执行相关操作。方式可能有很多,在这里介绍一种监听 Redis 键值对过期时间来实现订单自动关闭。实现思路在生成订单时,向 Redis 中增加一个 KV 键值对,K 为订单号,保证通过 K 能定位到数据库中的某个订单即可,V 可为任意值。假设,生

2020-05-21 16:27:39 231

原创 Nginx配置请求转发到spring-boot-admin

我的spring-boot-admin的实际地址是47.56.190.83:8888,由于47.56.190.83的8888端口没有放开,所有想使用nginx的8080端口转发请求,由于通过这种方式相关的Spring-Boot-Admin的css、js、png等静态资源无法加载,所有通过以下配置即可: server { listen 8080; server_name localhost; #charset koi8-r;

2020-05-20 12:26:00 3527 4

机房管理系统

机房管理系统主要实现学校对机房的合理管理,对机房的课程进行详细调整

2015-03-20

基于jsp的个人理财管理系统

主要实现基于jsp的个人理财管理系统,实现对自己的财物进行规划。

2015-03-20

基于SSH的Web理财管理系统

界面丰富、基于jsp的开发,更使用了SSH的技术开发,数据库文件和代码齐全。

2015-03-15

空空如也

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

TA关注的人

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