实际需求中使用区间合并算法
一直以来都觉得算法源于生活,这次有个核心计费算法,有个同事用正常的思维逻辑写的,写的蛮不错的。但是代码审核的时候我们几个初次看都没太看懂,因为计费逻辑稍微复杂些,代码长度就比较长,于是引发了我想用另一种更加直观的方式来做,于是乎想到了将需求拆分使用区间合并来做。
具体的需求是这样的:
某个物品进入某个安置点,当它达到N小时还没有人取的时候就要进行收费,其中收费规则会有以下几种:
1. 特殊必须收费时间段:T5-T6,T7-T8。。。必须收取手续费
2. 特殊免费时间段:T1-T2 , T3-T4。。。不需要收取手续费
3. 总的收费时间段,从进入安置点到用户取出这个总的时间。
4. 节假日免费时间段:周日,端午节。。。不收取手续费
5. 如果用户在这期间是会员那么就不需要收费。
而如果要改造的话,实现方案就是:
一、 把不收费的时间段计算出来。
二、 把必须收费的时间段计算出来。
三、 合并一和二的这些时间段,得到真实的收费时长和收费区间,减去免费保管时间的N小时区间。
四、 拿到单位收费金额和最大封顶金额。
五、 把真实收费区间的总时间金额*单位收费金额。
六、 封装数据...
2020-06-14 06:31
修改 jvm-sandbox 源码导致的线程安全问题
今天收到运维同事的消息,广告组某应用cpu从5月29号下午16:30开始陡增不下,本着对问题的好奇心帮忙排查了下这个问题。
首先看了下java进程的线程cpu使用情况,有四个处理线程每一个几乎一直处于40%-99%的cpu使用,正常情况下不应该出现这种情况,还好是多核机器,不然这容易直接搞崩溃机器。
同事提供了几分堆栈信息,在不同的时间段拿到的jstack信息占用高的cpu线程都指向了以下四个线程
```
"ForkJoinPool.commonPool-worker-1" #754509 daemon prio=5 os_prio=0 tid=0x00xxxxx36800 nid=0x1a9ec runnable [0x000xxxxx000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:2002)
at java.util.HashMap.putVal(HashMap.java:637)
at java.util.HashMap.put(HashMap...
2020-06-03 16:33
redis6.0 正式版的一些新特性之我见
两年前redis5刚出来的时候写过一篇 [redis5.0正式版的一些新特性之我见](https://yuxianghe.net/blog/18)
这次的文章参考redis的github仓库更新记录:
https://github.com/antirez/redis/blob/6.0/00-RELEASENOTES
这次的大版本可以说包含了很多企业化的功能特性,重量级,也可以说是最大的版本,也是参与人数最多的版本。
进入正题,从提交的记录来看,大的变化的确不少,上次redis5.0出来的时候我写了redis5.0的特性,这次的redis6.0的也还是蛮香的。
## Redis 6.0.0 GA特性和变化:
##### Released Thu Apr 30 14:55:02 CEST 2020
1. 修正了XCLAIM AOF/replicas传播错误。
2. 客户端缓存:新的NOLOOP选项,以避免得到关于我们自己执行的更改的通知。
3. ACL GENPASS现在使用HMAC-SHA256,并有一个可选的“bits”参数。这意味着你可以使用它作为一个通用的“安全随机...
2020-05-24 08:38
代码漏洞和风险
> 这几天在检查各个老项目的代码情况,本来是准备CodeReview用的,没想到越看越多的问题,一发不可收拾。。。
#### 1. 随机数问题
可以参考: https://stackoverflow.com/questions/11051205/difference-between-java-util-random-and-java-security-securerandom
`Random` 和 `SecureRandom` 的区别,这个知道的应该比较多,重要的情况下,随机函数的使用要尽量使用 `SecureRandom`
#### 2. 填充式加密
```
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec("********".getBytes());
```
我们系统的这种加密的填充方式居然是存在漏洞的。
使用pkcs5填充的CBC的这种特定模式很容易受到填充oracle攻击,虽然我也不是很懂填充oracle攻击,但是看百度的描述...
2020-03-19 12:31
kafka 获取时间戳所在时间的偏移量
这是 kafka获取时间戳所在时间的偏移量 的小白文,哈,类似的这种骚操作很容易忘记,所以记录下。
当生产环境遇到问题的时候,我们需要从某时间段开始消费消息补充数据,类似于旁路脚本进行数据修复,这时候我们如果知道出问题的时间点,然后从当前时间点进行消费数据就很完美了。
我们都知道直接编写代码可以直接定位到时间点所在的位置,但是基本原理都是获取该时间戳的所有分区的偏移量,然后从该偏移量开始取数据。
既然知道了原理,那怎么从指定时间戳取到所有分区的偏移量?
kafka提供了直接的命令工具来获取指定时间戳的所有分区偏移量,跟自己编写代码是类似的。
命令:
```
./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 127.0.0.1:9092 --topic opxxxPostTopic --time 1583808808000
```
获取topic为 `opxxxPostTopic` 的所有分区在 1583808808000 这个时间点的偏移量。
执行结果为:
```
// topic名称:分区序号:偏移量
op...
2020-03-10 11:58