细说SpringBootBean定义覆盖机制
印象中Spring Boot 2.x中的bean定义是不能重复的,如下demo:
12345678910111213141516171819202122232425@SpringBootApplicationpublic class BeanDemoApplication { public static void main(String[] args) { SpringApplication.run(BeanDemoApplication.class, args); }}@Configurationclass Bean1Config { @Bean public String bean() { return "BEAN1"; }}@Configurationclass Bean2Config { @Bean public String bean() { return "BEA ...
Maven依赖中的scope详解
Maven的一个设计范式是约定优于配置(convention over configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了。今天梳理一下maven的scope。
scope的分类compile默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。
providedprovided意味着打包的时候可以不用包进去,别的设施(如JDK或者容器)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
runntimerunntime表示被依赖项不是编译所必需的,而是执行所必需的。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。orac ...
基于DFA算法实现的敏感词过滤算法
一、 DFA 算法简介在实现文字过滤的算法中,DFA是唯一比较好的实现算法。
DFA 全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA 中不会有从同一状态出发的两条边标志有相同的符号。
简单点说就是,它是是通过 event 和当前的 state 得到下一个 state,即 event + state= nextstate。理解为系统中有多个节点,通过传递进入的 event,来确定走哪个路由至另一个节点,而节点是有限的。
二、 DFA 算法实践敏感词过滤
敏感词库构造以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:
用 hash 表构造为:
1234567891011121314151617{ "王":{ "isEnd":&qu ...
仿Kafka实现的JAVA版时间轮算法
项目地址 https://github.com/weylanshi/timing-wheel
从 2 个面试题说起,第一个问题: 如果一台机器上有 10w 个定时任务,如何做到高效触发?
具体场景是:有一个 APP 实时消息通道系统,对每个用户会维护一个 APP 到服务器的 TCP 连接,用来实时收发消息,对这个 TCP 连接,有这样一个需求:“如果连续 30s 没有请求包(例如登录,消息,keepalive 包),服务端就要将这个用户的状态置为离线”。其中,单机 TCP 同时在线量约在 10w 级别,keepalive 请求包较分散大概 30s 一次,吞吐量约在 3000qps。怎么做?
常用方案使用 time 定时任务,每秒扫描一次所有连接的集合 Map<uid, last_packet_time>,把连接时间(每次有新的请求更新对应连接的连接时间)比当前时间的差值大 30s 的连接找出来处理。
另一种方案,使用环形队列法:
三个重要的数据结构:
30s 超时,就创建一个 index 从 0 到 30 的环形队列(本质是个数组)
环上每一个 slot 是一个 Se ...
图解Java虚拟机系列(二)节码指令
虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别在于物理机的执行引擎是直接建立在 CPU 处理器、指令集、操作系统和硬件层面上的。
而虚拟机的执行引擎则由自己实现,因此可以制定自己的指令集和执行引擎的结构体系,而且还可以执行一些不被硬件直接支持的指令集格式。这就是虚拟机相对于物理机的优势所在。
但是缺点也比较明显,由于多了一层虚拟指令,执行虚拟机指令后还要转化为本地机器码,所以在执行效率上,虚拟机是不如物理机的。
Java 虚拟机的字节码指令由一个字节长度的操作码(Opcode)以及紧随其后的零至多个操作数(Operands)构成。
如果忽略异常处理,那么 Java 虚拟机的解释器通过下面这个伪代码的循环即可有效工作:
1234567do{ 自动计算pc寄存器以及从pc寄存器的位置取出操作码; if(存在操作数){ 取出操作数; } 执行操作码所定义的操作;} while(处理下一次循环);
由于字节码指令集限制了其操作码长度为 1 个字节(0 ~ 255),即意味着整个指令集中包含的指 ...
图解 Java 虚拟机系列(一)字节码文件结构
我们都知道 .java 文件在执行之前会编译成 .class 文件后再执行。比如下面的代码:
12345678package com.jeanboy.jvm;public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }}
在 控制台 执行下面命令:
$ cd JVMTraning/src/main/java/com.jeanboy.jvm/
$ javac HelloWorld
在 HelloWorld.java 的同级目录下会看到创建了一个 HelloWorld.class 文件。
将 HelloWorld.class 文件用 16 进制编辑器打开,可以看到如下内容:
ClassFile 结构每个 class 文件对应一个如下所示的 ClassFile 结构。
1234567891011121 ...
Java中关于try、catch、finally中的细节分析
前言阿里巴巴开发手册中有这么一条:【强制】不要在 finally 块中使用 return , 在开发过程中发现部分同学对这条规则理解不是很透彻,本文将就 try 、catch、finally 的一些问题,分析一下 try 、catch、finally 的处理流程。
首先看一个例子:
例11234567891011121314151617181920public class TryCatchFinally { public static String test() { String t = ""; try { t = "try"; return t; } catch (Exception e) { t = "catch"; return t; } finally { t = " ...
Java 虚拟机字节码指令表
字节码
助记符
指令含义
0x00
nop
None
0x01
aconst_null
将null推送至栈顶
0x02
iconst_m1
将int型-1推送至栈顶
0x03
iconst_0
将int型0推送至栈顶
0x04
iconst_1
将int型1推送至栈顶
0x05
iconst_2
将int型2推送至栈顶
0x06
iconst_3
将int型3推送至栈顶
0x07
iconst_4
将int型4推送至栈顶
0x08
iconst_5
将int型5推送至栈顶
0x09
lconst_0
将long型0推送至栈顶
0x0a
lconst_1
将long型1推送至栈顶
0x0b
fconst_0
将float型0推送至栈顶
0x0c
fconst_1
将float型1推送至栈顶
0x0d
fconst_2
将float型2推送至栈顶
0x0e
dconst_0
将double型0推送至栈顶
0x0f
dconst_1
将double型1推送至栈顶
0x10
bipush
将单字节的常量值(-128~1 ...
相关淘宝的名词解释
产品
淘宝标准化产品,由类目+关键属性唯一确定。如:手机类目,关键属性是品牌和型号,Nokia N95就是一个产品,nokia是品牌,N95是型号。
SPU
spu=standard product unit 标准化产品单元;spu相当于一个产品,可详见产品定义。
SKU
sku=stock keeping uint(库存量单位),为保存库存控制的最小可用单位,例如一件T恤中一个SKU通常由颜色、尺码组成,如下图:
CSPU(达尔文)
CSPU是以最细粒度的产品节点为核心,使用系统+运营机制的方式维护一套丰富、准确的产品库
天猫文档: https://open.taobao.com/doc.htm?docId=108954&docType=1
从天猫文档可以了解到:
达尔文主要为了实现一套丰富、准确的产品库,解决标准产品的信息统一、标准化问题
达尔文是一套多方参与共建的一个准确有效的产品库
达尔文通过品牌归一、型号归一等解决现存的重复SPU的问题。
spu、cspu、cku 关系
12cspu = spu + 销售属性sku = cspu + 价格 + 库 ...
Redis分布式锁如何续期
我们目前项目中使用的 redis 锁并没有续期的功能,所以在执行长时间任务时会触发 attempt to unlock '{}', not locked by current thread. 异常,解决这个问题比较正确的姿势是采用 redisson 这个客户端工具.具体介绍可以搜索最大的同性交友网站 github.
我们看官方的解释:
Redisson 为避免存储这个分布式锁的Redisson节点宕机出现锁死的情况,在内部提供了一个监控锁的看门狗,其作用是在Redisson实例被关闭前,不断延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒,可以通过修改 Config.lockWatchdogTimeout 来指定。另外Redisson还通过加锁的方法提供了 leaseTime 的参数来指定加锁的时间。超过这个时间后锁便自动解开了。
细心的同学可能会发现上面解释的歧义:
看门狗每隔 30 秒检查一次锁的超时时间
看门狗会去检查锁的超时时间,锁的时间时间默认是30秒
所以看门狗具体是怎么检查锁的,我们从源码中找答案。代码如下:
12 ...