实际需求中使用区间合并算法
一直以来都觉得算法源于生活,这次有个核心计费算法,有个同事用正常的思维逻辑写的,写的蛮不错的。但是代码审核的时候我们几个初次看都没太看懂,因为计费逻辑稍微复杂些,代码长度就比较长,于是引发了我想用另一种更加直观的方式来做,于是乎想到了将需求拆分使用区间合并来做。 具体的需求是这样的: 某个物品进入某个安置点,当它达到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

类型:工作 标签:jvm,sandbox,java,线程安全

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

类型:工作 标签:redis,6.0

代码漏洞和风险
> 这几天在检查各个老项目的代码情况,本来是准备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

类型:工作 标签:sql,漏洞,安全

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

类型:工作 标签:kafka,偏移量

我与我周旋久 独孤影 开源实验室