redis的自动注入
Redis的自动注入12@Autowiredprivate RedisTemplate<String, String> redisTemplate;
Redis 自动注入出现java.lang.NullPointerException异常
原因
是因为定义了静态方法, 而RedisTemplate 不能用静态注入的方式。
解决方案
1、通过@PostConstruct 注解初始化实例
12345678910@Autowiredprivate RedisTemplate<String, String> redis;public static RedisTemplate<String, String> redisTemplate;@PostConstructpublic void getRedisTemplate() { redisTemplate = this.redis;}
2、将静态方法改成非静态,去掉static
@PostConstruct
是一个在spring框架中使用的注解,用于指定在对 ...
springmvc中的Handler
Handler是什么?
Handler是一个Controller的对象和请求方式的组合的一个Object对象
HandleExcutionChains是HandleMapping返回的一个处理执行链,它是对Handle的二次封装,将拦截器关联到一起。然后,在DispatcherServlert中完成了拦截器链对handler的过滤。
DispatcherServlet要将一个请求交给哪个特定的Controller,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。HandlerMapping是把一个URL指定到一个Controller上,(就像应用系统的web.xml文件使用将URL映射到servlet)。
其实Spring Boot在启动后,会将所有扫描到的@RequestMapping注解注册到映射处理器handlerMappings中,其中包含了路径、方法等信息,在接收到请求时,会从注册的映射处理器中查找对应的路径方法,最后分发到方法中进行处理。
Java中的延迟队列
延迟队列(DelayQueue )1private BlockingQueue<DataDelay> delayQueue = new DelayQueue<>();
一般需要自定义泛型,定义泛型的时候必须要重写getDelay()和compareTo(),同时根据需要重写equals()和hashCode();比如自定义类中有time字段,那么延迟队列每次都会取出最早时间的元素(小根堆)。
关于定时任务执行器的两个方法的区别scheduleAtFixedRate() 和scheduleWithFixedDelay()
任务的执行时间间隔是按照固定的时间间隔来计算的,即使上一个任务的执行时间超过了间隔时间,下一个任务也会按照预定的时间触发。
简单来说每个任务的开始执行时间是是根据上一个任务的开始时间加上间隔时间。
scheduleWithFixedDelay()
任务的执行时间间隔是基于上一个任务完成的时间点来计算的,在上一个任务完成后,等待指定的延迟时间,然后触发下一个任务。简单来说就是每个任务的开始执行时间是基于上一个任务完成后的时间再加上间隔时 ...
走索引一定比全表扫描快吗?
走索引一定比全表扫描快吗?
user表中name是二级索引,id是主键索引
12explainselect * from user where name = "Alice";
执行结果是进行了全表扫描,type=all
首先索引底层是由B+树实现的,B+树是一种数据结构,具体怎么使用索引是由Server层的sql优化器来决定,sql优化器它的作用就是制定执行方案,就是具体选择哪个索引,就是从所有可能的执行计划中选择成本最低的一个执行计划。
那么这个成本是什么呢?
成本分为CPU成本和I/O成本,因为像存储引擎的数据和索引都是存储在磁盘上的,我们要把它加载到内存当中进行增删改查,这个从磁盘加载到内存当中就是I/O成本;CPU成本是指对数据的搜索、条件判断、排序等这些操作的成本,这个就是CPU成本;其实这个成本是可以量化的,比如页是磁盘与内存交互的基本单位,MySQL规定了从磁盘中读取一个页面到内存所花费的成本是1,从内存中读取一个页面所花费的的成本是0.25,记录间比较成本是0.1,而索引键值的比较成本是0.05,是成本中最 ...