HiSEN

Personal Technology Blog


  • 归档

  • 分类

  • 标签

  • 书单

  • 关于

  • 搜索
close
HiSEN

各系统查询数据时间分布情况统计-日志处理

发表于 2019-10-25 | 分类于 java

一、说明

做这件事的目的是为了了解一条数据库记录从创建到使用的一个情况;
查询分布时间计算方式采用Top Percentile方式,就是按一定排序的数据,前面xx%的最大值是多少;
TP999 1ms 代表某接口99.9%的响应都在1ms之内;

最终的目的也就是为了知道数据多久之后可以打入冷宫,使用廉价存储;
冷热数据分级处理有利于在性能和成本上达到一定的平衡;
如把内存缓存时间设置为tp90所处的时间,那么90%的数据都能快速返回,其它少量数据回源处理;

关键字
java格式化输出
java8
stream
parallelStream
分组
排序
DoubleSummaryStatistics数据分析
TP999

二、效果

日志源数据预览

1
19-10-24.14:47:12.721 [THREAD-22000-18-T-17] INFO  FacadeImpl        - response yw:jiaoyi, orderId:123456, time:2019-10-24T14:46:44

ywcountmin(ms)max(ms)tp50(ms)tp90(ms)tp99(ms)tp999(ms)
hisen1000110000206090130
hisen-1200216000165070110

ps 输出是格式化的数据,并不是表格,可以通过:

world->粘贴输出文本->插入->表格->文本转换成表格->空格

即可完成文字到表格转换

这种过程可能比较low,但是也需要时间去处理,过程中还得配合linux命令等整合文本;

三、代码

完整:github-CallerAnalyze.java
摘要如下:

阅读全文 »

HiSEN

业务安全的资源层攻防介绍

发表于 2019-10-23 | 分类于 biz

一些简单的黑产攻防介绍

  1. 修改前置摄像头,直接播放本地视频或者图片(色情诈骗、网约车司机人脸识别);
  2. 恶意注册靶机系统:黑卡猫池、群控、云控、箱控(12个主板,模拟120台手机);
  3. 模拟点击脚本在黑产中使用比例逐年增高,主要是效果好很难区分是否为真实用户;
  4. ROS软路由(可管理250个IP)、秒拨(每次拨号IP改变);
    阅读全文 »
HiSEN

如何成为专业的技术从业者 - 《程序员的职业素养》 - Bob大叔出品

发表于 2019-10-08 | 分类于 read

很不错的一本书,作为程序员都值得去看一看,170+页周末一天可以看完, 还包括做笔记

医学专业已经建立起一套严密的辅导体系
软件行业建立一种包含学徒期、实习期、和长期指引的机制已是迫在眉睫

有人指导大多数人都可以快速的成长,节省很多走弯路的时间
当然,事在人为,只是说掌握了书中的那些要领,成为专业人员的几率更高,做更好的自己
如果从小学开始就一直有人引路并且自己也愿意跟着走的话,应该会很棒,现在也不晚,抓住时间就好

主要内容:
专业主义
学会说“不”,学会说“是”
编码的正确姿势
TDD
卡塔练习很重要,肌肉反应
验收测试(各方都一致同一的检验方式)
测试策略,自动化测试是趋势
时间管理,番茄工作法,注意力点数
预估的概念以及方法
压力,避免与面对
协作,学会与人交流
团队与项目,有凝聚力的团队战斗力强
软件开发如医生一样培训更佳
合适的工具事半功倍

阅读全文 »

HiSEN

Thread Pool Monitor - 线程池监控

发表于 2019-09-05 | 分类于 java

一、背景

业务当中多处用到线程池进行异步处理;
为了得知线程池设置是否合理,故需要增加线程池监控;
常见的实现方式:

  1. org.springframework.scheduling.concurrent.ScheduledExecutorTask
  2. org.springframework.scheduling.annotation.Scheduled

本文使用1的方式实现,主要是方便进行配置,可以托管多个任务;

二、效果预览

1
2
3
taskName:pool1-monitor. taskCount:820, completedTaskCount:820, largestPoolSize:30, poolSize:30, activeCount:0, corePoolSize:30, maximumPoolSize:50, queueSize:0
taskName:pool2-monitor. taskCount:1703, completedTaskCount:1703, largestPoolSize:30, poolSize:30, activeCount:0, corePoolSize:30, maximumPoolSize:50, queueSize:0
taskName:pool3-monitor. taskCount:820, completedTaskCount:448, largestPoolSize:30, poolSize:30, activeCount:30, corePoolSize:30, maximumPoolSize:50, queueSize:342

三、监控逻辑

代码如下:

阅读全文 »

HiSEN

《重塑大脑,重塑人生》读后感 + 摘抄

发表于 2019-09-03 | 分类于 read

一、内容简介

这是一本人类大脑可塑性研究先驱与翘楚的故事书,正是让我们用触觉看到世界的巴赫-利塔这类先驱,使得我们正在成为来自地球的神。

二、读后感

这本书对我来讲还是很棒的,刷新了我对大脑的认知;
以前还停留在左右脑分工上,殊不知这是日本鬼子整出来的不严谨的概念;
看完书,感觉对个人技术、学习方面都有帮助,增加信心,因为之前错过了学校的大把学习时间;
运动和学习是互补的,前者产生新的神经干细胞,后者使它们的寿命延长;

这本书我是很推荐看的;
犹如最近看完的reids英文版文档;
每天看一点点,持续的刺激大脑相关区域,收获还是可以;
之前也咨询过英语比较好的同事;
反馈说目前想提高,就拿着领域内的文档硬看,坚持下来会有收获的;

每次看完书都会发个微博,避开朋友圈的尴尬,扩大散播范围,与更多的同好交流;

三、内容摘要

《重塑大脑,重塑人生》0822~0901
在持续不断噪声环境中长大的孩子都好动和吵闹,白噪声对大脑发育也有影响。

阅读全文 »

HiSEN

resteasy fastjson版本冲突问题

发表于 2019-08-04 | 分类于 java

零、相关介绍

关键错误信息:
java.lang.RuntimeException: RESTeasy Provider Factory is null, do you have the ResteasyBootstrap listener configured?
java.lang.RuntimeException: Illegal to inject a message body into a singleton into public com.alibaba.fastjson.support.jaxrs.FastJsonProvider(java.lang.String)

resteasy:JBoss的一个开源项目,提供一套完整的框架帮助开发人员构建RESTful Web Service和RESTful Java应用程序。
fastjson:由阿里开发的一个性能很好的Java JSON 解析器和生成器。

引起错误的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version><!--改为:1.1.34.sec01相安无事-->
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>2.2.1.GA</version>
</dependency>

一、错误日志

本地启动Server报错

阅读全文 »

HiSEN

性能指标的含义与计算方式:TP50、TP90、TP99、TP999

发表于 2019-08-01 | 分类于 java

零、本文背景

一个接口的关键指标应该就是响应速度,要想提高响应速度,结果在缓存中最好;
那么怎么确定一个合理的缓存时间,以平衡性能与成本呢?
我们可以通过记录业务请求,看读取缓存的时间分布,比如 99% 的请求都是 1天内;

近期在做日志分析,找到比较理想的一个缓存过期时间,使 90% 的查询都能被缓存覆盖;
发现有些同学不太懂 TP 指标,故写文记录一下。

一、性能指标含义

常见指标:TP50、TP80、TP90、TP99、TP999
正式解释:TP=Top Percentile,Top百分数,是一个统计学术语,与平均数、中位数都是一类;
通俗理解:TP99 100ms,99%的查询都能在100ms内返回;
本质理解:它是一个分位值,看数据的一个分布;

二、性能指标计算

计算方式:拿到所有请求耗时,升序排序,取 99% 位置的数据,就是 TP99;
比如说:拿 100 次请求的耗时,升序排序,取第 99 个的数据,就是TP99的值;

具体的代码方式就是,先算出耗时,放入 List ,然后排序,按指定的下标取值即可;

代码如下:

阅读全文 »

HiSEN

Autowire、Resource的区别 | Java注解

发表于 2019-07-22 | 分类于 java

零、本文背景

项目中看到有一个缓存接口存在多个实现类,
但是在代码中使用@Resource注解注入,
之前有了解过@Autowire @Resource的区别,
于是就尝试着搜索@@Resource,于是就有本文的总结了。

一、两个注解

1.1 @Autowire

1.1.1 Spring开发;
1.1.2 按照type来注入;

1.2 @Resource

1.2.1 JDK开发;
1.2.2 按照名称注入,若无,则按type来注入(未指定name的情况下);

二、后记

  1. 做事情要有计划,得主动;
  2. 需要想清楚自己想要什么样的生活,然后朝着目标奋斗;
  3. 使用现成的代码尽量搞清楚来龙去脉,可以学习知识,更能避免被坑;
  4. 每天的学习时间需要保证,坚持很重要;
HiSEN

读取文件路径相关问题

发表于 2019-07-16 | 分类于 java

零、本文由来

感觉从业这么久以来,读取文件路径相关问题一直是一个痛
用的很少,之前也解决过相关的问题
但是得用这种路径

1
src/test/resources/test/test.txt

上面这种路径如果在代码中的话,src/test/resources是不会存在的,会出现问题
本次学到了一个新的方法,Class.getResourceAsStream();
需要的路径在资源文件夹下面即可,填写路径:/test/test.txt
打包最终的路径会在:WEB-INF/classes/test/test.txt

ps:因maven打包配置不同,最终resources资源文件夹下的路径是不同的,注意src的坑即可

一、文件结构

1
2
3
4
5
6
7
│   └── test
│   ├── java
│   │   └── mq
│   │   └── Test.java
│   └── resources
│   ├── test
│   │   └── test.txt

二、读取代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/spring-config.xml"})
public class Test {
@Test
public void test() throws IOException {
InputStream inputStream = Test.class.getResourceAsStream("/test/test.txt");
byte[] buffer = new byte[1024];
int len;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
String res = bos.toString();
System.out.println(res);
}
}
HiSEN

浅谈volatile

发表于 2019-06-12 | 分类于 java

一、volatile是什么

volatile是Java提供的一种轻量级的同步机制
保证变量的修改其它线程立马可见,解决部分并发问题

二、volatile局限性

无法解决复合操作,例如 i++ i–这种操作
原因:i++操作分三步

  1. 读取i=1;
  2. i=i+1=2;
  3. i=2写入主存
    有可能在3写入之前,其它线程已经对i进行了修改,比如改为100了,结果覆盖写入了2

三、volatile原理

volatile底层依靠指令重排序来实现内存可见性的
具体的规则如下

  1. 当第二个操作是voaltile写时,无论第一个操作是什么,都不能进行重排序
  2. 当第一个操作是volatile读时,不管第二个操作是什么,都不能进行重排序
  3. 当第一个操作是volatile写时,第二个操作是volatile读时,不能进行重排序
阅读全文 »
1…678…27
hisenyuan

hisenyuan

Java R & D

266 日志
33 分类
112 标签
GitHub Weibo
Links
  • 科技爱好者周刊
  • 美团技术团队
  • duanple(老师木)
  • 当然我在扯淡(王垠)
  • 段永平的博客
  • 梦殇国际
© 2016 - 2024 hisenyuan
由 Hexo 强力驱动
您是第  个访问者    |   
主题 - NexT.Mist