在互联网产品中,缓存无处不在。当一个网站前期请求量少,服务响应很快,当随着请求增加响应越来越慢。这时需要对请求的入口合并、业务调整、底层代码重构、数据库SQL与表等等优化后提高响应最终提升整体的性能,也可以引入缓存以提高吞吐量。但是引入缓存也带了维护的问题,比如脏数据的问题、缓存数据更新的策越等等。

Synchronized 在1.5以前是重量级锁,当遇到synchronzed时,其他线程需要等待并进入blocked状态。 在1.6以后,经过大量的测试发现加锁的地方经常被一个线程访问。所以对synchronized进行了锁的粒度优化,主要在对象头增加标记位因此有了偏向锁、轻量级锁、重量级锁。 三种常用用法Synchronized(A.class), synchronized(变量) synchronized method, 通过代码与bytecode对比发现, synchronized method: 字节码中存在ACC_SYNCHRONIZED这个标记,当执行到这个行是,当前线程需要获取对象monitor锁,然后在进入方法处理...

Spring SpringBoot小的细节总结记录 spring mvc 采用SPI技术,注入Spring的Servlet类,具体是实现了javax.servlet.ServletContainerInitializer接口的SpringServletContainerInitializer类,在这个类上注解@HandlesTypes传递的参数给Servlet中进行扩展使用 Srping boot Servlet3.0中@HandlesTypes会触发WebApplicationInitializer实现类, SpringBootServletInitializer; 实现的WebApplicationInitializer接口的...

限流器 我们项目是新闻类的站点,每天需要限制各种爬虫,保证服务在可承受范围内,需要保护后台服务正常。需要使用限流器。 固定 滑动 令牌桶 一 固定窗口: 当前请求是否在最后一次请求时间点+设置的窗口的时间范围内,然后累计请求次数,判断是否达到上限,如果不在范围会重新初始化请求数(0)并记录当前请求时间为最后一次请求时间。 例如当程序启动的时候设置最后一次请求时间为当前系统是,当有一个请求到来是,判断请求时刻在(最后一次请求时间+固定的窗口是否)之间,如果在之间说明需要判断是否允许请求,即累加当前窗口的次数并判断是否达到最大的请求数 缺点是:时间窗口会承受2倍的请求。比如窗口时间每秒允许10个请求, 当第一秒的后半秒请求了10,在下一...

bean初始化过程: 大体分为三个过程bean的对象创建、属性填充、初始化事件 bean的创建前事件,其中bean的创建前事件主要场景是在aop(AnnotationAwareAspectJAutoProxyCreator主要实现了InstantiationAwareBeanPostProcessor)通过对bean的创建前拦截, 将adviser方法加入到aop包下的的ProxyFactory产生一个代理类,并且会被cache。 并在后期(postProcessAfterInitialization)对目标类进行包装。最终加入到容器与对象的属性赋值。(这个阶段会属性填充混合进行) bean创建后置事件,用的比较少 属性填充:...

定义自定义注解 1@Retention(RetentionPolicy.RUNTIME) 2@Target(ElementType.PARAMETER) 3public @interface Logined { 4} 注解处理器 1@Component 2@Slf4j 3public class LoginedArgumentResolver implements HandlerMethodArgumentResolver { 4 @Override 5 public boolean supportsParameter(MethodParameter parameter) { 6 return...

Spring HandlerMapping 1package org.springframework.web.servlet; 2 3import javax.servlet.http.HttpServletRequest; 4 5import org.springframework.lang.Nullable; 6 7public interface HandlerMapping { 8 // 省略一下常量配置..... 9 /** 10 * 返回此请求的处理程序和任何拦截器。可以根据请求URL、会话状态或实现类选择的任何因素做出选择。 11 * 返回的HandlerExecutionChain包含一个处理程序对象,而不是标记接...

Java 基础技能 包括以下大致内容 Object类的常用方法 常用反射方法 常用字段处理 枚举处理 泛型的获取 基本类型的判断 1. isAssignableFrom()与instanceof isAssignableFrom() 描述:判断目标类是否为父类的子类 使用:父类.class.isAssignableFrom(子类.class) instanceof 描述:判断实例是否为父类的子类 描述:(new)实例 instanceof 父类 具体的demo如下 1package cn.linuxcrypt.api.demo; 2 3import lombok.Data; 4import org.junit.Test; 5...

DispatcherServlet 关系说明 DispatcherServlet 继承了FrameworkServlet; FrameworkServlet 继承了HttpServletBean并实现了ApplicationContextAware(设置上下文); HttpServletBean继承了HttpServletu(抽象类),并实现了获取环境变量的设置和获取接口; HttpServlet实现了为Java EE Servlet的标准 启动流程 当容器启动时,容器(tomcat、jetty、undertow),启动后会依次加载HttpServlet的实现类 Spring MVC中DispatcherServlet为实现类,并作...

版本发布规范 版本号命名规则指南 版本号的格式为 X.Y.Z(又称 Major.Minor.Patch),递增的规则为: X 表示主版本号,当 API 的兼容性变化时,X 需递增。 Y 表示次版本号,当增加功能时(不影响 API 的兼容性),Y 需递增。 Z 表示修订号,当做 Bug 修复时(不影响 API 的兼容性),Z 需递增。 详细的规则如下: X, Y, Z 必须为非负整数,且不得包含前导零,必须按数值递增,如 1.9.0 -> 1.10.0 -> 1.11.0 0.Y.Z 的版本号表明软件处于初始开发阶段,意味着 API 可能不稳定;1.0.0 表明版本已有稳定的 API。 当API的兼容性变化时,X必须递增,Y和Z同时设...

一、Java基础类型 名字 默认值 占用空间 最大值 最小值 byte 0 8位 127(2^7-1) -128(-2^7) chat ‘u0000’ 16 位 Unicode 字符 \uffff (65535) \u0000 (0) boolean false 1位 - - short 0 16位 32767(2^15 - 1) -32768(-2^15) int 0 32 位 2,147,483,647(2^31 - 1) -2,147,483,648(-2^31) float 0.0f 32位 - - long 0L 64 位 9,223,372,036,854,775,807(2^63 -1)...

调用时机 clinit在jvm第一次加载class时调用,init在实例创建出来的时候调用 clinit在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行 init在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。 详情 clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺...

Java的内存优化之Reference,SoftReference、WeakReference、StrongReference 引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用、弱引用与虚引用,三种级别也各有所不同(软引用>弱引用)。本文浅析下软引用与弱引用。大概的解释,软引用适合应用在需要cache的场景,一般面向实现内存敏感的缓存;弱引用则是适用在某些场景为了无法防止被回收的规范性映射,它优先级最低,一般与引用队列联合使用。 详情 强引用(默认存在) 强引用,是在实际开发中最为普遍的引用。有时候你开发的时候,申请一个内存空间的时候,就已经是强引用了。例如: 1Object obj = new...

HttpClient 工具类 1package cn.linuxcrypt.utils; 2 3import org.apache.http.*; 4import org.apache.http.client.ClientProtocolException; 5import org.apache.http.client.ResponseHandler; 6import org.apache.http.client.config.CookieSpecs; 7import org.apache.http.client.config.RequestConfig; 8import...

概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者 ArrayDeque实现了Deque的接口以及上图其他的接口,因此ArrayDeque支持序列化、克隆、迭代器操作、队列特性并且扩展了AbstractCollection抽象类 应用场景 linkedList内部实现用node节点链接前后元素。模拟c/c++的链表(长处在于中间节点的增删操作为o(1))。 vector方法加...

Java 8中的常用函数式接口 函数式接口 函数描述符 原始类型特化 Predicate T->boolean IntPredicate, LongPredicate, DoublePredicate Consumer T->void IntConsumer,LongConsumer, DoubleConsumer Function<T,R> T->R IntFunction, IntToDoubleFunction, IntToLongFunction, LongFunction, LongToDoubleFunction, LongToIntFunction, DoubleFunction, ToIntFunction,...

Java 类的加载机制

大致流程: 读取.class文件二进制文件–>验证与解析(格式 关键字 关键词 语法 引用 类型转化等等) –> 初始化 –> 使用 –> 卸载