Java
走进Java
汇来客智慧收银
这个作者很懒,什么都没留下…
展开
-
[Vue动态路由] vue实现动态路由 (专为后端同学而生)
动态路由 根据每个人不同的权限 显示不同的菜单原创 2023-03-21 15:21:55 · 2540 阅读 · 2 评论 -
mysql 不同库之间的表结构对比
五步轻松搞定再也不用担心正式库缺失字段了。原创 2022-09-15 10:04:46 · 574 阅读 · 0 评论 -
DeferredResult 提高系统吞吐量的一把利器
当一个接口处理耗时时,为了接口做出快速相应,释放tomcat资源,提高系统的吞吐量,sping3.0 以后引入DeferredResult。代码演示。原创 2022-08-18 14:18:45 · 412 阅读 · 0 评论 -
「Java」CopyOnWriteArrayList与Vector
我们都知道ArrayList是线程非安全的。如果我们想要得到一个线程安全的集合。有如下方式new Vector<String>(); Collections.synchronizedList(new ArrayList<>()); newCopyOnWriteArrayList();他们实现线程安全的方式Vector :简单粗暴 // addpublic synchronized boolean add(E e) { ...原创 2022-04-22 16:12:07 · 719 阅读 · 0 评论 -
「分布式专题」一致性Hash算法的实现Java
上文主要介绍了一致性hash算法的由来以及概念知识。本文主要对其进行实现及演示。「分布式专题」分布式系统中一致性hash算法_国涛i的博客-CSDN博客_分布式一致性hash算法近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多技术的支持。例如系统访问层的负载均衡,缓存层的多实例主从复制备份,数据层的分库分表等我们以负载均衡为例,常见的负载均衡方法有很多,但是它们...原创 2022-04-22 09:28:03 · 868 阅读 · 0 评论 -
「Spring」开发项目中常用的接口
InitializingBean当我们阅读一些优秀的开源代码时,会经常见到InitializingBean的身影,Spring启动后,初始化Bean时,若该Bean实现InitialzingBean接口,会自动调用afterPropertiesSet()方法,完成一些用户自定义的初始化操作ApplicationContext是spring继BeanFactory之外的另一个核心接口或容器,允许容器通过应用程序上下文环境创建、获取、管理bean。为应用程序提供...原创 2022-04-20 11:28:28 · 934 阅读 · 0 评论 -
「RocketMQ」如何保证消息不丢失
当我们实际项目开发中,引入一个中间件都要考虑为什么要引进他,引进它会遇到哪些问题。首先为什么要引入消息队列解耦:分布式系统中涉及到的数据交互 削峰:高并发场景下,为了更快的作出相应,会考虑引入消息队列 异步:减少响应时间会遇到哪些问题呢系统的可用性降低:如果消息队列挂掉了,服务之间通讯就会受限 复杂性提高 数据丢失本文主要对「数据丢失」做一些分享 ...原创 2022-04-13 09:26:03 · 3738 阅读 · 0 评论 -
「某大厂二面」聊聊Java中的SPI机制
SPI service provider interface的简写SPI是什么SPI主要解决的还是耦合问题。我们知道面向接口编程是很好的编程方式。举一个简单的例子假设有一天你一不小心成为了你们组的组长,这时候经理要求你开发一个对象存储服务,统一一下公司内部的云存储服务,首先市面上的云存储有好多家,例如阿里的OSS,t...原创 2022-03-22 10:24:19 · 768 阅读 · 0 评论 -
「淘宝二面」什么是守护线程 应用场景有哪些
什么是守护线程jdk官方介绍The Java Virtual Machine exits when the only threads running are all daemon threads.当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出先看一下这段代码public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -&原创 2022-03-16 13:35:19 · 773 阅读 · 0 评论 -
「淘宝一面」HashMap 在使用时需要注意什么地方 至少说出四点
前言彻底弄懂HashMap__Louie的博客-CSDN博客_hashmap我们在面试中, 也会经常被问到HashMap相关的底层实现, 阿巴阿巴....HashMap的底层实现首先它是基于数组(存储对象的引用)加链表(存储对象)实现的当我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对...原创 2022-03-16 09:38:44 · 695 阅读 · 0 评论 -
「网易一面」线程池参数以及提交任务后怎么执行的
核心参数private static int corePoolSize = 20;private static int maxPoolSize = 100;private static int keepAliveTime = 0;private static TimeUnit timeUnit = TimeUnit.MINUTES;private static BlockingQueue blockingQueue = new ArrayBlockingQueue<>(999...原创 2022-03-16 09:07:34 · 199 阅读 · 0 评论 -
「京东一面」子线程如何获取父线程ThreadLocal的值
开门见山想要子线程获取父线程中ThreadLocal中的值,需要其子类InheritableThreadLocal实现测试代码public static void main(String[] args) throws InterruptedException { Thread parentParent = new Thread(() -> { ThreadLocal<Integer> threadLocal = new ThreadLo原创 2022-03-14 14:14:27 · 658 阅读 · 0 评论 -
「Java」自定义注解 校验数据库表中的数据不可重复
一个很常见的需求,某表中的数据不能重复,我闲每次都要多加几行代码去查数据库,所以自定义了个注解代码@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = TableDataUnique.TableDataUniqueConstraintValidator.class)public @interface TableDataUnique { // 表明 St.原创 2022-01-27 16:40:47 · 3252 阅读 · 6 评论 -
「Netty」Netty入门 认识NIO
现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能 Netty 底层实现就是基于我们的NIO,因为网络编程使用NIO非常复杂,容易写出Bub,netty封装了nio,大大的简化了学习成本与提高了编码效率。概述NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流...原创 2022-01-24 11:33:37 · 341 阅读 · 0 评论 -
「性能优化专题」缓存的那些事儿
利用缓存做性能优化的案例非常多,从基础的操作系统到数据库、分布式缓存、本地缓存等。它们表现形式各异,却有着共同的朴素的本质:弥补CPU的高算力和IO的慢读写之间巨大的鸿沟。和架构选型类似,每引入一个组件,都会导致复杂度的上升。以缓存为例,它带来性能提升的同时,也带来一些问题,需要开发者设计和权衡。本文的思维脉络如下:一 缓存和多级缓存1 缓存的引入在初期业务量小的时候,数据库能承担读写压力,应用可以直接和DB交互,架构简单且强壮。经过一...原创 2022-01-14 13:31:20 · 225 阅读 · 0 评论 -
Slf4j的使用与配置,Lombok Slf4j
引入Lombok的依赖 <dependency> <groupId>cn.itlym.shoulder</groupId> <artifactId>lombok</artifactId> <version>0.1</version> </dependency>要记录日志的类上添加注解 @Slf4j原创 2020-11-11 12:41:40 · 2120 阅读 · 0 评论 -
JWT,springboot整合JWT完成token的验证,token的使用,token做接口拦截
昨天公司新开发的一个项目,后台用的jwt完成token的验证。首先,介绍一下什么是JWTJson web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).**定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。**因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名JWT请求流程1. 用户使用账号和面发出post请求;2. 服务器使用私钥...原创 2020-11-07 13:35:05 · 2358 阅读 · 5 评论 -
什么是redis,springboot整合redis,redis的基本使用
什么是RedisRedis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:RemoteDictionaryServer(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。Redis特点Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256...原创 2020-11-10 09:56:56 · 369 阅读 · 2 评论 -
springboot整合redis,redis存储数据乱码
首先我们写一个测试类,简单模拟一下项目当中的乱码情况@SpringBootTest@RunWith(SpringRunner.class)public class RedisTest { @Resource private RedisTemplate redisTemplate; @Test public void test() { redisTemplate.opsForValue().set("test:1", "1233");原创 2020-11-10 20:08:32 · 807 阅读 · 0 评论 -
Springboot开启定时任务,cron表达式的写法
1、启动类上添加注解@EnableScheduling2、要开启定时任务的方法上添加注解@Scheduled3、制定定时任务的策略cron表达式是一个字符串,该字符串由6个空格分为7个域,每一个域代表一个时间含义。 格式如下[秒] [分] [时] [日] [月] [周] [年]// 通常定义 “年” 的部分可以省略,实际常用的由 前六部分组成关于cron的各个域的定义如下表格所示:上面列表中值范围还是比较好理解的,但是比较令开发者难以理解的就是通配...原创 2020-11-10 11:20:19 · 1235 阅读 · 0 评论 -
windows、win10下docker打包springboot项目并发布运行
首先新建一个springboot项目,新建一个测试接口用maven打包的方式把项目打成jar包[INFO] BUILD SUCCESS把打包的jar包放到单独的目录下,新建txt文件,并把.txt后缀删除,编辑该文件,文件内容如下FROM java:8VOLUME /tmpADD demo-0.0.1-SNAPSHOT.jar /hello.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar",原创 2020-11-13 13:41:29 · 1121 阅读 · 0 评论 -
java向指定地址url发post请求,并携带json格式参数
先定义我们的工具类 public static String sendPost(String url, String jsonData) { PrintWriter out = null; BufferedReader in = null; StringBuilder result = new StringBuilder(); try { URL realUrl = new URL(url);原创 2020-11-12 20:33:21 · 3474 阅读 · 1 评论 -
Java 上传图片至阿里OSS文件存储系统
首先先要去购买阿里的oss云文件存储获得你的相对应属性String endpoint = "oss-cn-qingdao.aliyuncs.com";String accessKeyId = "LTAI4G8NN4YHiY3ELaML4ZSU";String accessKeySecret = "EG1Srd5z1sAytml942zSNAtXJsLkaK";String bucketName = "snstore";我们就先用以下简单的方式测试一下public static vo原创 2020-11-21 09:36:51 · 822 阅读 · 1 评论 -
@Scheduled定时任务,启动项目先执行一次
@Scheduled(cron = "0 */30 * * * ?") //每30分钟执行一次@PostConstruct //启动项目先执行public void scheduled() { ....}推荐阅读开启定时任务,cron表达式的写法原创 2020-12-11 16:56:30 · 13880 阅读 · 0 评论 -
自动填充 addTime,updateTime等字段
之前我们项目经理对我说过一段话,大概的意思:每个表都应该包括add_time,update_time,deleted字段,会有极大的用处!我们用到最多的就是mybatis-plus,下面我就拿它来接单介绍一下使用新建一个user表创建它的实体类@Data@TableName("user")public class User implements Serializable { private static final long serialVersionUID = 90..原创 2020-12-05 10:11:43 · 845 阅读 · 2 评论 -
mybatis之selectKey标签
保存数据后,获取得到自增长的主键id,用作其他业务处理可以使用mybatis为我们提供的 selectKey标签 <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> select LAST_INSERT_ID() </selectKey>...原创 2021-03-15 19:33:22 · 1115 阅读 · 0 评论 -
mybatis-plus代码生成器,一键生成代码
添加依赖 <!--mp--><dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version></dependency><!--代码生成器模板--><dependency..原创 2020-11-03 10:22:20 · 1321 阅读 · 0 评论 -
mybatis-plus 逻辑删除
mybatis-plus 逻辑删除转载 2020-11-23 16:54:31 · 844 阅读 · 0 评论 -
mybatis-plus自定义xml的模板
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace=""> //实体类mapper 对应的包路径</mapper>Mybatis-plus代.原创 2020-11-07 16:47:59 · 2168 阅读 · 0 评论 -
并发编程三要素
原子性:不可分割的操作,要么都成功要么都失败有序性:程序执行的顺序和代码的顺序保持一致可见性:一个线程对共享变量进行修改,另外的线程能立马看到原创 2021-07-28 18:37:18 · 563 阅读 · 0 评论 -
MySQLTransactionRollbackException: Deadlock found when trying to get lock
出现问题的场景: 多线程大批量插入(涉及到唯一索引, 没有插入 有则更新)锁争抢问题https://bugs.mysql.com/bug.php?id=77209解决方法有两种:添加test_id+group_id的组合索引,这样就可以避免掉index merge; 将优化器的index merge优化关闭; 加锁...原创 2021-07-24 12:26:07 · 1284 阅读 · 1 评论 -
Java的读锁到底有什么用 ReadWriteLock
如果有一个线程已经占用了读锁,则此时其他线程如果要申请读锁,可以申请成功。 如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁,因为读写不能同时操作。 如果有一个线程已经占用了写锁,则此时其他线程如果申请写锁或者读锁,都必须等待之前的线程释放写锁,同样也因为读写不能同时,并且两个线程不应该同时写。读读共享、其他都互斥(写写互斥、读写互斥、写读互斥)一个简单的例子public class TestReadWriteLock {...原创 2021-08-21 18:25:17 · 826 阅读 · 0 评论 -
Java 阻塞主线程 CountDownLatch 自定义CountDownLatch
CountDownLatch.await() 阻塞线程 .countDown() 指定的count -1;当count为0时 释放zusexiancheng public static void main(String[] args) throws InterruptedException { int threadSize = 20; final CountDownLatch downLatch = new CountDownLatch(thr...原创 2021-08-04 16:21:33 · 315 阅读 · 0 评论 -
高并发处理之限流方案 RateLimiter以及阿里Sentinel
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流缓存 缓存的目的是提升系统访问速度和增大系统处理容量 (本地, redis) 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开 (hystrix) 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 (令牌桶算法)令牌桶酸防简介令牌桶算法原理如下:用户请求必须拿到令牌才代表消...原创 2021-07-09 16:54:34 · 1532 阅读 · 0 评论 -
多线程插入数据开启事务,要么都成功要么都失败,PlatformTransactionManager 管理事务
spring为我们提供了事务相关的接口,PlatformTransactionManagerpublic interface PlatformTransactionManager extends TransactionManager { // 获取当前活动的事务或创建一个新事务 TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws Transactio..原创 2021-07-27 21:29:34 · 1317 阅读 · 0 评论 -
java 处理高并发接口 造成数据库长连接问题 自定义队列
把之前写的队列抽出来了, 这样有其他同事也有类似的场景就可以直接使用啦, 使用方法也很简单 , 直接继承就可以/** * 统一处理数据的队列 * 指定队列最大值. 当队列到达最大值时 执行execute方法, 若l分钟还没到达队列最大值也执行execute * * @param <L> */@Datapublic class UnifyStoreQueue<L> { // listener执行次数 计数器 private sta...原创 2021-07-16 15:43:08 · 622 阅读 · 0 评论 -
CompletableFuture的使用介绍, CompletableFuture与FutureTask的区别
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。 总的来说简洁了FutureTask与线程池的配合使用 没啥太大区别吧我觉得, 使用方法不一样, 多了一些方法...futureTask 创建异步任务 FutureTask<String> str...原创 2021-07-31 09:37:30 · 1651 阅读 · 0 评论 -
JVM学习笔记
之前我们在面试的时候是不是会经常被问到相关JVM的问题?来看看下面来自面试官的灵魂 “拷问”请谈谈你对jvm的理解? 什么是OOM,什么是栈溢出StackOverFlowError?如何分析? JVM常用调优参数有哪些? 内存快照如何抓取,怎么分析Dump文件? 谈谈JVM中,你对类加载器的认识?JVM运行在什么地方? JVM当然是运行在操作系统之上的,虽说是一个Java运行环境(JRE),就好比我们常用的软件。JVM体系结构以及名词介绍图例:名词...原创 2020-12-06 16:07:32 · 487 阅读 · 0 评论 -
为什么新生代有两个Survivor区
我们都知道JVM的堆内存分为新生代(Eden + from + to)和老年代例如我们可以创建个方法, 查看一下其占用的堆内存情况jps 查看所有运行的项目及方法 jmap -heap [方法id] 查看堆占用其他参数配置默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ,可以通过参数 –XX:NewRatio 配 置。 默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorR...原创 2021-08-26 08:47:11 · 457 阅读 · 2 评论 -
「Java」彻底掌握ReentrantLock实现原理
ReentrantLock主要利用CAS+CLH队列来实现。它支持公平锁和非公平锁,两者的实现类似。CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是由sun.misc.Unsafe这个类通过JNI调用CPU底层指令实现。 CLH队列:带头结点的双向非循环链表(如下图所示):原创 2021-12-30 16:20:19 · 525 阅读 · 0 评论