基于spring boot的简单定时任务
spring-boot-scheduled说明使用自带的定时任务非常简单,我们只需要打开定时器
12345678910/** * 定时任务配置类 * @author YI * @date 2018-11-5 10:04:06 */@Configuration@EnableSchedulingpublic class Config {}
然后编写我们的任务即可完成一个简单的定时任务
12345678910111213141516171819/** * 定时任务 * @author YI * @date 2018-11-5 10:30:08 */@Componentpublic class ScheduledTasks { private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy- ...
HTTP网络请求分类
HTTP 方法客户端发送的 请求报文 第一行为请求行,包含了方法字段。
GET
获取资源
当前网络请求中,绝大部分使用的是 GET 方法。
HEAD
获取报文首部
和 GET 方法一样,但是不返回报文实体主体部分。
主要用于确认 URL 的有效性以及资源更新的日期时间等。
POST
传输实体主体
POST 主要用来传输数据,而 GET 主要用来获取资源。
更多 POST 与 GET 的比较请见第九章。
PUT
上传文件
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
123456PUT /new.html HTTP/1.1Host: example.comContent-type: text/htmlContent-length: 16<p>New File</p>
PATCH
对资源进行部分修改
PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。
1234567PATCH /file.txt HTTP/1.1Host: www.example.comContent-Type: a ...
Tomcat最佳实践
运行模式Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化。
1234org.apache.coyote.http11.Http11Protocol:BIOorg.apache.coyote.http11.Http11NioProtocol:NIOorg.apache.coyote.http11.Http11Nio2Protocol:NIO2org.apache.coyote.http11.Http11AprProtocol:APR
BIO一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。
NIO利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动:
1234<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" ...
为什么我们做分布式使用Redis?
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里对 Redis 常见问题做一个总结,解决大家的知识盲点。
1、为什么使用 Redis在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。
性能:如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据。
根据交互效果的不同,响应时间没有固定标准。在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。
并发:如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
使用 Redis ...
原型设计模式
6. 原型模式(Prototype)Intent使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
Class Diagram
Implementation123public abstract class Prototype { abstract Prototype myClone();}
123456789101112131415161718public class ConcretePrototype extends Prototype { private String filed; public ConcretePrototype(String filed) { this.filed = filed; } @Override Prototype myClone() { return new ConcretePrototype(filed); } @Override public String toString() & ...
工厂方法设计模式
工厂方法(Factory Method)Intent定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。
Class Diagram在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。
Implementation1234567public abstract class Factory { abstract public Product factoryMethod(); public void doSomething() { Product product = factoryMethod(); // do something with the product }}
1234567891011/** * 实现工厂抽象方法 * @author YI * @dat ...
生成器设计模式
生成器(Builder)Intent封装一个对象的构造过程,并允许按步骤构造。
Class Diagram
Implementation以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。
12345678910111213141516171819202122232425262728293031323334public class AbstractStringBuilder { protected char[] value; protected int count; public AbstractStringBuilder(int capacity) { count = 0; value = new char[capacity]; } public AbstractStringBuilder append(char c) { ensureCapacityInternal(count + 1); value[count++] = c; ...
简单工厂设计模式
简单工厂(Simple Factory)Intent在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
Class Diagram简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。
这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
Implementation123public interface Product { void hello();}
123456public class ConcreteProduct implements Product { @Override public void hello() { System.out.println("Hello Java"); }}
123456 ...
责任链设计模式
责任链(Chain Of Responsibility)Intent使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。
Class Diagram
Handler:定义处理请求的接口,并且实现后继链(successor)
Implementation123456789101112public abstract class Handler { protected Handler successor; public Handler(Handler successor) { this.successor = successor; } protected abstract void handleRequest(Request request);}
123456789101112131415161718public class ConcreteHandler1 extends Handler { publ ...
单例设计模式
单例(Singleton)Intent确保一个类只有一个实例,并提供该实例的全局访问点。
Class Diagram使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
ImplementationⅠ 懒汉式-线程不安全以下实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if (uniqueInstance == null) ,并且此时 uniqueInstance 为 null,那么会有多个线程执行 uniqueInstance = new Singleton(); 语句,这将导致实例化多次 uniqueInstance。
1234567891011121314public class Singleton { private static Singleton uniqueInstanc ...