ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat(“consumer-queue-thread-%d”).build();
ExecutorService pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue(5),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());
return pool ;
}
}
使用时:
@Resource(name = “consumerQueueThreadPool”)
private ExecutorService consumerQueueThreadPool;
@Override
public void execute() {
//消费队列
for (int i = 0; i < 5; i++) {
consumerQueueThreadPool.execute(new ConsumerQueueThread());
}
}
其实也挺简单,就是创建了一个线程池的 bean,在使用时直接从 Spring 中取出即可。
假如有一个List,其中存的是用户User对象,用户对象有很多属性,我要根据其中的年龄属性对List排序,这个该怎么办?
==============================================================================================================================
可以通过Collections类的sort方法。但需要注意,使用sort方法的时候:
- 要么 User类实现Comparable接口,并在类中编写public int compareTo(T o)方法
public class User implements Comparable {
private int age;
private String name;
private String sex;
@Override
public int compareTo(User o) {
if (this.getAge() > o.getAge()) {
return 1;
} else if (this.getAge() < o.getAge()) {
return -1;
} else {
return 0;
}
}
// ……
}
List userList=new ArrayList();
userList.add(new User(10, “王二”, “男”));
userList.add(new User(8, “张三”, “男”));
userList.add(new User(17, “李四”, “女”));
Collections.sort(userList);
System.out.println(userList);
- 或者在排序的时候,给sort()方法传入一个比较器。具体来说,就是传入一个实现比较器接口的匿名内部类。
List userList=new ArrayList();
userList.add(new User(10, “王二”, “男”));
userList.add(new User(8, “张三”, “男”));
userList.add(new User(17, “李四”, “女”));
//Collections.sort(userList);
Collections.sort(userList, new Comparator() {
@Override
public int compare(User o1,User o2) {
if(o1.getAge()>o2.getAge()) {
return 1;
}else if(o1.getAge()<o2.getAge()) {
return -1;
}else {
return 0;
}
}
});
System.out.println(userList);
在Java8以后可以使用Lamda表达式来进行函数式地编程:
userList.sort((a, b) -> Integer.compare(a.getAge(), b.getAge()));
=====================================================================================
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不相关的东西。
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。
下面是使用流的过程:
下面是一个使用流的实例,用于List的迭代:
List stringList = new ArrayList();
stringList.add(“one”);
stringList.add(“two”);
stringList.add(“three”);
stringList.add(“one”);
Stream stream = stringList.stream();
stream.forEach( element -> { System.out.println(element); });
=========================================================================
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
传统的session认证一般是这样的流程:
-
1、用户向服务器发送用户名和密码。
-
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
-
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
-
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
-
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。
一种解决方案是 session共享,将session持久化或者存入缓存。各种服务收到请求后,都向持久层或缓存请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层或者缓存万一挂了,就会认证失败。
另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
JWT认证流程:
-
1、 用户使用账号和密码发出post请求;
-
2、 服务器使用私钥创建一个jwt;
-
3、 服务器返回这个jwt给浏览器;
-
4、 浏览器将该jwt串在请求头中像服务器发送请求;
-
5、 服务器验证该jwt;
-
6、 返回响应的资源给浏览器。
===========================================================================
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作, 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 。
事务是一个不可分割的工作逻辑单元事务必须具备以下四个属性,简称 ACID 属性:
-
原子性(Atomicity) :事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
-
一致性(Consistency): 当事务完成时,数据必须处于一致状态。
-
隔离性(Isolation) :对数据进行修改的所有并发事务是彼此隔离的, 这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
-
永久性(Durability) : 事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
=============================================================================
通过在方法加注解 @Transactional 来实现声明式的事务。
Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。
===============================================================================
-
1、查询语句中不要使用select *
-
2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代
-
3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
-
4、or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
-
5、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
-
6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
============================================================================
(这里应该是想问用过的命令)日产工作中,下面这些命令经常用到:
-
查看当前目录:pwd
-
切换目录 : cd
-
查看目录下的文件 :ls/ls -lh
-
创建目录:mkdir
-
启动war包:java -jar xx.war
-
后台启动war包:nohup java -jar * xx.war&
-
查找进程:ps –aux|grep java
-
杀死进程:kill -9 pid
参考:
【1】:SpringBoot学习笔记(十一:使用MongoDB存储文件 )
【2】:GridFS 基于 MongoDB 的分布式文件存储系统
【3】:Linux下shell脚本实现mongodb定时自动备份
【5】:Redis五种数据类型及应用场景
【6】:Redis五种数据类型及应用场景
【7】:面试官:说说什么是线程安全?一图带你了解java线程安全
【8】:如何优雅的使用和理解线程池
【9】:深入理解 Java 线程池:ThreadPoolExecutor
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后总结
ActiveMQ+Kafka+RabbitMQ学习笔记PDF
关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
-j5p2E93Y-1711812643766)]
最后总结
ActiveMQ+Kafka+RabbitMQ学习笔记PDF
[外链图片转存中…(img-Q6B1zJ2G-1711812643767)]
[外链图片转存中…(img-gVOxUwPx-1711812643767)]
[外链图片转存中…(img-XOY2KCqf-1711812643767)]
[外链图片转存中…(img-hfrOGwxM-1711812643768)]
关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦