李小武

Stay hungry, stay foolish.

Kotlin小技巧,秒杀Java

呵呵,看完这个,会不会让你放弃Java 集合操作 list转map(associateBy) 场景:订单列表转换成以id为key的订单map val mainOrders = orderDao!!.queryUserOrder(param) val orderMap = mainOrders.associateBy { it.id }.toMap() map的key或者valu...

Kotlin问题汇总

与Spring AOP结合 在默认情况下,kotlin定义的非抽象class是final类型,字段也是一样;而在Spring中,AOP是不能代理final的类或者成员变量的, final的类代理会报异常,而final的成员变量代理后是null。目前这是个很隐蔽的坑,有的时候在运行时才能发现。解决方法就是在类或者成员变量上加上open修饰。 @Service open class Orde...

Kotlin参考资料

手册 官方文档:https://kotlin.link/ 资源汇总:https://kotlin.link/ 问题汇总:http://blog.lichengwu.cn/kotlin/2017/05/12/summary-of-questions/ 电子书 Kotlin In Action 中文版:https://www.gitbook.com/book/panxl6/kotli...

Java序列化总结

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: class T{ transientint a;//不需要维持 int b;//需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。 volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。在多线...

Web防爬

爬虫与防爬是一个永无止境的斗争。 爬虫识别 防爬的首先要识别爬虫请求,这也是最难的一步。如何从大量的正常用户请求中精准识别爬虫请求,是整个防爬过程中很关键的环节,因为后面的策略都是围绕爬虫请求展开,如果爬虫识别错误,会对业务和真实用户造成干扰。 与正常用户相比,爬虫的请求多少会留下一些蛛丝马迹。 IP 最容易想到的是IP黑名单,可以通过手动/自动的方式把识别出来的IP地址添加到黑名...

如何减少接口响应时间

Premature optimization is the root of all evil.   — Donald Knuth 对于程序优化,我一直采取保守的态度,除非万不得已。但是随着业务的不断发展,程序越来越复杂,代码越写越多,优化似乎是终有一天会到来的事情。 那么对于一个典型的后台服务接口,...

有用的git命令,持续更新

彩色的 git 输出 git config color.ui true 修改上次提交内容 git commit --amend -m "New commit message"

一种基于“哨兵”的分布式缓存设计

14年双11大促缓存方案,今天有点闲暇时间,回顾一下当时的思路。 场景介绍: 大促活动下,对于某些产品进行整点秒杀活动。预计流量是平时峰值5+倍。 商品计算逻辑比较复杂:某个最终展示的商品属性和价格,可能需要上亿次动态条件计算获得,动态条件每时每刻都在变化,并且商品的库存属性属于行业共有库存,每时每刻都在变化。 计算模型:前端机并发去后端获取实时计算数据,然后合并结果,根据用户信息给...

[case]并发环境下HashMap引起full gc排查

现象 最近上线一个需求,完成需求的过程对代码进行了一次重构。应用发布后半个小时左右,发现一个机器报警,load过高。登陆机器看CPU使用情况,发现load已经正常,看下CPU使用情况,发现有一个核跑满,其他CPU使用率很低。大概一个小时后,其他机器陆续报警,发现同样的问题,紧急回滚应用。 应用运行在16G内存的虚机上,整个JVM11G内存,其中新生代3G,CMS gc,JDK7。 第一...

有用的vim命令,持续更新

命令篇 缩写 在vim中,可以定义缩写,快速替换内容。语法格式为: :ab [缩写] [要替换的文字] 如定义Java Virtual Mechine的缩写是jvm: :ab jvm Java Virtual Mechine 插入模式下输入jvm,然后按esc,jvm就好自动替换成Java Virtual Mechine。 忘记以root打开的时候 当打开一个文件,修改后...