- 博客(88)
- 资源 (11)
- 收藏
- 关注
原创 <JAVA学习笔记>SpringBoot中的@Retryable重试注解
Retryable注解的功能顾名思义,即重试。它可以作用在方法上,当方法抛出指定的异常时,整个方法将会被重新执行。在使用时需要先在pom.xml中导入相关依赖,再在启动类中添加@EnableRetry注释以开启重试功能,最后在相应的方法上添加@Retryable注释。
2023-07-19 14:55:07 420
原创 一文拿下JAVA线程池系列(1)
1、什么是线程池大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。线程池和数据库连接池的原理也差不多,创建线
2022-01-20 15:08:47 172
原创 面试必备Java核心技术120面试题
本文梳理了Java核心技术常见面试题,整理了120道题目,包括Java基础、集合框架、并发编程、NIO、反射等部分的内容。语法基础面向对象的特征有哪些方面?hashCode和equals方法的理解?两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?深拷贝和浅拷贝区别?&和&&的区别?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?switch是否能作用在by
2022-01-15 15:55:08 237
原创 Nginx实现反向代理
一、代理服务器1、什么是代理服务器代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。2、为什么要使用代理服务器1)提高访问速度由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。2)防火墙作用由于所有的客户机请求都必须通过代理服务器访
2022-01-05 16:59:31 1494
原创 SpringBoot:处理跨域请求
一、跨域背1.1Url的一般格式:协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址示例:https://www.dustyblog.cn:8080/say/Hello是由https+www+dustyblog.cn+8080+say/Hello组成。只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。1.2 一次正常的请求Controller层代码: @Reque...
2021-11-13 11:08:56 212
原创 线程的几种状态转换
线程在一定条件下,状态会发生变化。线程一共有以下几种状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行
2021-08-12 10:23:13 3525
原创 Linux 中查看文件第n行内容的命令
方法1:head -m filename | tail -1 //查看filename文件的第m行(tail -1是数字1)e.g. head -100 data.txt | tail -1 //查看data.txt文件的第100行方法2:nlfilename| sed -n 'mp'//查看filename文件的第m行e.g.nl data.txt| sed ...
2021-07-23 15:07:52 2536 1
原创 Linux vmstat命令实战详解
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
2021-07-21 14:36:03 96
原创 shell脚本if判断中各个字段的含义
-s file 文件大小非0时为真[ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限[ -n "$var" ] :判断$var变量是否有值[ "$a" = "$b" ] :判断$a和$b是否相等-r file 用户可读为真-w file 用户可写为真-x file 用户可执行为真-f file 文件为正规文件为真-d file 文件为目录为真-c file .
2021-07-21 09:22:27 159
原创 电话号码的字母组合
问题描述:给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]解题思路:我想的是按照树的dfs做,不知道怎么动手打开评论区,先做出来再理解吧。本题是一个电话号码组合的问题,或者说是一个全排列问题。路径:也就是已经做出的选择。选择列表..
2021-07-02 18:00:07 81
原创 MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
今天遇到一个问题,有一个 Select 语句没有加 “Order By”,返回的数据是不确定的。这种问题碰到不止几次了。追根寻底, Select 语句如果不加 “Order By”,MySQL会怎么排序呢?在网上搜了一下,在MySQL论坛发现了这篇文章。http://forums.mysql.com/read.PHP?21,239471,239688#msg-239688简单翻译一下* 不能依赖 MySQL 的默认排序* 如果你想排序,总是加上 Order By* GROUP BY.
2021-01-27 18:27:33 721
原创 关于SpingAop切面拦截的问题 protect方法代理问题
问题貌似不能拦截私有方法?试了很多次,都失败了,是不是不行啊?我想了一下,因为aop底层是代理,jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到;cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。我不是类内部直接调用方法,而是通过维护一个自身实例的代理execution(* test.aop.ServiceA.*(..))public class ServiceA { private ServiceA sel......
2021-01-20 14:14:04 1885
原创 RedisTemplate常用方法总结
Redis常用的数据类型:String Hash List Set zSet Sorted setString类型判断是否有key所对应的值,有则返回true,没有则返回falseredisTemplate.hasKey(key)有则取出key值所对应的值redisTemplate.opsForValue().get(key)删除单个key值redisTemplate.delete(key)批量删除keyredisTemplate.delete(key
2021-01-13 22:54:29 302
原创 Spring AOP 切面利用@Around注解实现幂等性
@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;再比如我们想在执行方法时动态修改参数值等类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验证等方面。完整演示代码如下:需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,见
2021-01-11 14:28:23 1942 1
原创 @Transactional的使用
1.Spring事务的原理Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。使用@Transactional的相比传统的我们需要手动开启事务,然后提交事务来说。它提供如下方便根据你的配置,设置是否自动开启事务 自
2021-01-11 14:05:31 1848
原创 @RequestParam和@PathVariable的用法与区别
SpringBoot——@PathVariableURL变量Web应用中的URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1和http://weibo.com/user2。我们不能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,他们仅仅是URL中的某一部分不同,为他们各自的用户名,我们说他们具有相同的模式)。定义URL变量规则可以
2021-01-06 14:22:23 231
原创 服务端与客户端传对象以及 I/O 流顺序问题
创建要传输的实体对象UserInfo:package com.NIO.socket;import java.io.Serializable;public class UserInfo implements Serializable { private long id; private String userName; private String password; public UserInfo(){} public UserInfo(long i
2020-10-27 09:57:14 247
原创 comparable接口和comparator接口
comparable 接口和 comparator 接口实现比较的区别和用法1.定义 Comparable 接口:使用 Array 或 Collection 的排序方法时,自定义类需要实现 Java 提供 Comparable 接口的 compareTo(TOBJ)方法,它被排序方法所使用,应该重写这个方 法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0 或正整 数。 使用 Comparator 接口的情景:在大多数实际情况下,我们想根据不同参数进行排序。比如, 作为
2020-10-24 20:13:45 248
原创 详解 & 0xff 的意义及作用
首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.下面着重来说说&0xff都有哪些应用:1. 只是为了取得低八位通常配合移位操作符>>使用例如:java socket通信中基于长度的成帧方法中,如果发送的信息长度小于65535字节,长度信息的字节定义为两个字节长度。这时候将两个字节长的长度信息,以Big-Endian的
2020-10-23 11:37:29 22991 1
原创 Linux大厂面试题
(1)Linux 中主要有哪几种内核锁?Linux 的同步机制从 2.0 到 2.6 以来不断发展完善。从最初的原子操作,到后来的信号量,从 大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux 从单处理器到对称多处理器的 过渡; 伴随着从非抢占内核到抢占内核的过度。Linux 的锁机制越来越有效,也越来越复杂。 Linux 的内核锁主要是自旋锁和信号量。 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被 持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等
2020-10-22 15:15:33 295
原创 分布式集群利器Zookeeper
1. zookeeper在分布式集群的作用1.1,数据发布与订阅(配置中心)发布与订阅模型,即所谓的配置中心,顾名思义就是讲发布者将数据发布到zk节点上,共订阅者动态获取数据,实现配置的集中式管理和动态更新。例如,全局的配置信息,服务服务框架的地址列表就非常适合使用。 分布式环境下,配置文件管理和同步是一个常见问题 一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群、集群中的数据库配置信息等全局配置 对配置文件修改后,希望能够快速同步到各个节点上。 配置管
2020-10-20 16:07:36 631
原创 剑指offer:重建二叉树(JAVA实现最新版)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。代码实现及解题思路/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode rig
2020-10-19 14:41:00 99
原创 剑指offer:二维数组的查找(JAVA实现最新版)
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码实现及解题思路public class Solution { public boolean Find(int target,int array[][]){ int row = array.length; int col = array[0].leng
2020-10-19 14:20:31 80 1
原创 剑指offer:链表中倒数第K个节点(JAVA实现最新版)
题目描述输入一个链表,输出该链表中倒数第k个结点。代码实现及解题思路public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ListNode pre=null,p=null; //两个指针都指向头结点 p=head; pre=head; //记录k值 int a=k; //记录节
2020-10-19 14:03:24 98
原创 数据库中count(字段) ,count(主键 id) ,count(1)和count(*)的区别
注:下面的讨论和结论是基于 InnoDB 引擎的。首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。至于分析性能差别的时候,记住这么几个原则:server 层要
2020-10-14 11:45:10 1340
原创 java nio buffer中文乱码问题
public static void main(String[] args) throws IOException { String charsetName = "GBK"; String fileName = "data.txt"; bufferToTxt(charsetName, fileName); txtToBuffer(charsetName, fileName); } public static void txt.
2020-10-13 16:22:51 407
原创 拼多多笔试题(六):选靓号
问题描述:A 国的手机号码由且仅由 N 位十进制数字(0-9)组成。一个手机号码中有至少 K 位数字相同则被定义为靓号。A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号。小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。比如将 1 修改为 6 或 6 修改为 1 都需要花 5 块钱。给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?输入描述:第一行包含2个整数 N、K,分别表示手机号码数字个数以及靓
2020-09-28 15:21:00 801
原创 拼多多笔试题(五):二维表第k大数
问题描述:在一块长为n,宽为m的场地上,有n✖️m个1✖️1的单元格。每个单元格上的数字就是按照从1到n和1到m中的数的乘积。具体如下n = 3, m = 31 2 32 4 63 6 9给出一个查询的值k,求出按照这个方式列举的的数中第k大的值v。例如上面的例子里,从大到小为(9, 6, 6, 4, 3, 3, 2, 2, 1)k = 1, v = 9k = 2, v = 6k = 3, v = 6...k = 8, v = 2...
2020-09-27 10:45:55 650
原创 拼多多笔试题(四):骰子期望
问题描述:扔n个骰子,第i个骰子有可能投掷出Xi种等概率的不同的结果,数字从1到Xi。所有骰子的结果的最大值将作为最终结果。求最终结果的期望。输入描述:第一行一个整数n,表示有n个骰子。(1 <= n <= 50)第二行n个整数,表示每个骰子的结果数Xi。(2 <= Xi <= 50)输出描述:输出最终结果的期望,保留两位小数。输入例子:22 2输出例子:1.75思路分析:分析:这道题本身是蛮简单的,但比较难理解的是题意,主
2020-09-25 14:15:23 1184
原创 拼多多笔试题(三):多多的电子字典
问题描述:多多鸡打算造一本自己的电子字典,里面的所有单词都只由a和b组成。每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。多多鸡的幸运数字是K,它打算把所有满足条件的单词里的字典序第K小的单词找出来,作为字典的封面。输入描述:共一行,三个整数N, M, K。(0 < N, M < 50, 0 < K < 1,000,000,000,000,000)输出描述:共一行,为字典序第K小的单词。输入例子:2 1 4输出例子:ab
2020-09-25 11:00:59 741 1
原创 拼多多笔试题(二):多多的排列函数
问题描述:数列 {An}为N的一种排列。例如N=3,可能的排列共6种:1, 2, 31, 3, 22, 1, 32, 3, 13, 1, 23, 2, 1定义函数F(X):其中|X|表示X的绝对值。现在多多鸡想知道,在所有可能的数列 {An} 中,F(N)的最小值和最大值分别是多少。输入描述:第一行输入1个整数T,表示测试用例的组数。( 1 <= T <= 10 )第二行开始,共T行,每行包含1个整数N,表示数列 {An} 的元素个.
2020-09-24 12:05:02 479
原创 拼多多笔试题(一):多多的魔术盒子
问题描述:多多鸡有N个魔术盒子(编号1~N),其中编号为i的盒子里有i个球。多多鸡让皮皮虾每次选择一个数字X(1 <= X <= N),多多鸡就会把球数量大于等于X个的盒子里的球减少X个。通过观察,皮皮虾已经掌握了其中的奥秘,并且发现只要通过一定的操作顺序,可以用最少的次数将所有盒子里的球变没。那么请问聪明的你,是否已经知道了应该如何操作呢?输入描述:第一行,有1个整数T,表示测试用例的组数。(1 <= T <= 100)接下来T行,每行1个整数N,表示有.
2020-09-24 11:15:25 2038
原创 MySQL数据的备份和恢复
1. 数据备份的重要性在生产环境中,数据的安全性至关重要 任何数据的丢失都可能产生严重的后果 造成数据丢失的原因 程序错误 人为操作错误 运算错误 磁盘故障 灾难(如火灾、地震)和盗窃2. 数据库备份的分类物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份 物理备份方法 冷备份(脱机备份):是在关闭数据库的时候进行的 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作 逻辑备份:对数
2020-09-17 14:28:57 113
转载 九种分布式ID生成方式
一、为什么要用分布式ID?1、什么是分布式ID?2、那么分布式ID需要满足那些条件?二、 分布式ID都有哪些生成方式?1、基于UUID2、基于数据库自增ID3、基于数据库集群模式4、基于数据库的号段模式5、基于Redis模式6、基于雪花算法(Snowflake)模式7、百度(uid-generator)Snowflake算法CachedUidGenerator吞吐量测试8、美团(Leaf)9、滴滴(Tinyid)性能与可用性Tinyid的特
2020-09-16 18:08:22 636
原创 算法开发工程师常见面试题
数据归一化的方法有哪些,为什么要进行归一化,哪些模型一定需要归一化归一化的方法:1、线性归一化函数(Min-Max Scaling)x’ = (x-min(x))/(max(x)-min(x))把原始数据取值转换到[0,1]之间。实际使用时,不同样本集得到的max/min可能不同,造成归一化结果不稳定,从而使模型后续使用也不稳定。可以经验值来代替max/min,比如人的年龄,max=100,min=0。避免不同样本集max/min的不同造成的模型偏差。2、0均值标准化(Z-score sta..
2020-09-16 15:30:10 1053
原创 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite
问题描述:给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)(数据保证每个员工的每条薪水记录to_date-from_date=1年,而且同一员工的下一条薪水记录from_data=上一条薪水记录的to_data)CREATE TABLE `salaries`
2020-09-12 09:34:14 281
原创 对所有员工的当前(to_date=‘9999-01-01‘)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
问题描述:对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列CREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`salary` int(11) NOT NULL,`from_date` date NOT NULL,`to_date` date NOT NULL,PRIMARY KEY (`emp_no`,`from_date`));输入描述
2020-09-10 14:05:03 559
原创 Redis面试整理最新版
redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?区别:1.mc可缓存图片和视频。rd支持除k/v更多的数据结构;2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份;3.rd可以做消息队列。原因:mc多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。redis主从复制如何实现的?redis的集群模式如何实现?redis的key是如何寻址的?主从复制实现:主节点将自己内存中的数据做.
2020-08-06 15:08:52 112
原创 Mysql中key 、primary key 、unique key 与index区别
索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。字符串是自动地压缩前缀和结尾空间。索引用.
2020-07-28 18:25:05 361
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人