0%

当初这个文档应该是在『科技爱好者周刊』上还是哪里发现的
看这个文档本来的目的是每天坚持阅读英文文档
技术文档一般都比较简洁易懂,英语是一个长期的过程,还得继续坚持阅读~

看的过程中发现,结合一定的场景,和示例
和官方文档相比,没有那么枯燥,也更好理解
甚至有一些之前未曾关注的用法让我感到惊艳

所以推荐一下

下载地址:how-to-manage-a-redis-database.pdf

零、背景

很多时候我们调用接口并不是需要接口返回的所有信息;
就像查询数据库很少使用 select * from table; 一样;

为了使现有的存储结构以及代码逻辑改动最少
想办法在最外层的接口对返回的对象进行精简

目的使为了提高接口性能:减少 RPC 传输时间、节省网络带宽、节省序列化开销

一、方案

  1. 直接创建一个对象,根据入参传入的所需字段,写一堆 if else 进行 get set;
  2. 使用序列化工具,转为类似 Map 结构,取值拼装;
  3. 使用 BeanWrapper 操作对象;

前面两种比较呆板,属于定制化开发;

二、实践

Spring BeanWrapper 方案处理非集合对象比较完美,输出对象小不少;
基本数据类型有默认值,无法去除,不过这种对大小影响不大;
完整代码:github.com

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
Order order = getOrder();
Order smallerOrder = new Order();
List<String> keepFields = Lists.newArrayList();
keepFields.add("orderId");
keepFields.add("address.province");
// i want get all names, not only index 1, how to do ?
keepFields.add("productInfos[1].name");
copyLimitedProperties(order, smallerOrder, keepFields);
Gson gson = new Gson();
System.out.println("src:" + gson.toJson(order));
System.out.println("des" + gson.toJson(smallerOrder));
}
Read more »

零、本文背景

有个朋友抛出一个问题,明显不符合最左匹配原则的 SQL,居然走索引了
兜兜转转,嘀咕了好几天,期间也和几个朋友讨论了一下
都没有结果,最后还是在 MySQL 的官方文档中找到了原因
记录下,也算是一次不错的探索。

一、问题描述

1.1 表结构

1
2
3
4
5
6
7
8
CREATE TABLE `people_new` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_name` varchar(255) NOT NULL,
`first_name` varchar(255) NOT NULL,
`bob` date NOT NULL,
PRIMARY KEY (`id`),
KEY `index_union` (`last_name`,`first_name`,`bob`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='人员-新'

1.2 数据

1
2
3
4
5
6
7
mysql> select * from people_new;
+----+-----------+------------+------------+
| id | last_name | first_name | bob |
+----+-----------+------------+------------+
| 1 | hisen | yuan | 2008-08-08 |
+----+-----------+------------+------------+
1 row in set (0.00 sec)

1.3 SQL 分析

可以看到 Using index
但是 possible_keys null 而 key 显示 index_union

1
2
3
4
5
6
7
mysql> explain select * from people_new  where bob = '2008-08-08' and first_name = 'yuan';
+----+-------------+------------+------------+-------+---------------+-------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+-------+---------------+-------------+---------+------+------+----------+--------------------------+
| 1 | SIMPLE | people_new | NULL | index | NULL | index_union | 1537 | NULL | 1 | 100.00 | Using where; Using index |
+----+-------------+------------+------------+-------+---------------+-------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

二、原因

Read more »

零、关于面试

面试决定因子:70% 能力、20% 缘分、10% 行情。
软件工程师是条不归路,每天进步一点点,早日走上人生巅峰。

一、面经/知识点

仓库的内容更多是抛砖引玉,提供通用与重要的技术,
真正掌握还得贴合自身需要,花时间持续深入地学习。

基础指引:https://github.com/Snailclimb/JavaGuide
进阶之路:https://github.com/doocs/advanced-Java
编程书籍:https://github.com/jobbole/awesome-programming-books
算法小抄:https://labuladong.gitbook.io/algo/
大厂试题:https://github.com/0voice/interview_internal_reference
简历打磨:https://github.com/geekcompany/ResumeSample/blob/master/Java.md

后续持续更新,多交流,共同成长。

二、相关内容

计算机科学的自我修炼
技术人的自我修炼(书单)

三、更新记录

2020-12-18

Read more »

零、写在前面

早几天在领导 JG 的朋友圈看到这篇文章
简单几个字的标题,让我产生了兴趣
一来这个标题是挺吸引人,典型的自媒体文章
二来JG 之前推过一些书很不错
三来一般领导朋友圈都不会推垃圾信息

全文看来其实感觉还是挺切合我的认知:

  1. 人很难认清自己,很难找到方向,成长路上有他人指点会很棒
  2. 除了遇到的人合读过的书,十年之后你还是你
  3. 多与他人交流,多帮助他人,利人利己
  4. 运动、学习、反馈、重塑大脑

离开学校
大部分时间都是围绕着工作
有些人可能觉得当前的工作不满意
然后想着学点什么高大上的东西为以后的工作做准备
极端情况下这种选择是对的,大部分情况会让自己进退两难
正确的选择应该是:过好当下,瞭望远方,持续学习,总结反思,慢慢进步
架构师同事 SGLS 说过:做好当下的事情才是最重要的,不管现在是做什么项目,设计和实现是我们自己可以控制的。

以下为原文

1
2
3
审视是一个特别好的词。当一个人开始审视世界、审视经历、审视自己的时候,更容易做出有担当的选择。
作为美团“二号首长”,王慧文选择在2020年底正式“退休”,这不可分说地成为了焦点——
王慧文,是怎么成为“王慧文”的?

一、“不自我设限”,造就无边界的王慧文

什么是促使人成长的本质原因?
王慧文一直在渴求突破,也一直在探究这个问题。

1. 人要接受变化,有动荡才有进化

王慧文修行的开端,就是校内网。
2006年3月,王慧文、王兴和另外四名同伴绞尽脑汁、黑白颠倒,终于让校内网收获了一百多万用户。
王兴开始四处找投资,但在多数投资人眼里看来,他们仍是群“生瓜蛋子”、“杂牌军”,校内网不过是几个大学生做的小打小闹的玩意儿。
但在这时,千橡集团董事长陈一舟出现了,他愿意拿出一千多万人民币,收购校内网。《九败一胜:美团创始人王兴创业十年》中这样描述

Read more »

零、分页查询

分页查询一般都会想到 offset limit

问题1

当不停机需要全量同步数据时
有可能会漏掉或者重复处理很多数据
因为中途会有数据改动
每次分页内的数据与预期的会有出入

问题2

offset 会进行全表扫描

一、推荐方案

通过不变的字段进行排序
最好是使用递增的主键索引

1
2
3
4
5
select *
from hisen
where id > ${lastId}
order by id
limit ${pageSize};

二、参考

Read more »

在 敏捷 + devops 盛行的年代
软件部署的频率一般都比较高,一周一迭代、一周两迭代
这就需要有良好的工具来支持,更需要良好的机制来避免人为犯错

工作当中会遇到很多部署导致的问题
其中大部分的问题原因是配置问题

关于部署

  1. 开发的时候记录大致改动点
  2. 上线之前按检查列表(团队或个人定义一些常规检查项目)挨个检查
  3. 上线之前写上线步骤列表,部署时做一个人肉机器人,按步骤操作即可
  4. 上线之前写好验证步骤,验证需要的各种权限
  5. 以上做完了最好找相关人员核对一遍,以免遗漏(互备很重要)
  6. 灰度发布(应用启动期间性能抖动问题值得研究)

互备很重要,哪怕对方没有介入开发,简单的按正常流程问你几个问题,也许就会发现漏了什么。

零、读后感

美国风险投资家 Naval Ravikant 通过一个很长的推特阐明了他的商业观,感觉挺精辟。
积累独到的知识(无法批量复制的),为社会提供他们需要的。
财富不是靠出卖时间获得,应该通过杠杆(资本、人力、一本万利的工具<写书等>)去积累。
选择一个可以长期从事的行业,寻找一批可以长期共事的人。

一、原文(及翻译)

  1. Seek wealth, not money or status. Wealth is having assets that earn while you sleep. Money is how we transfer time and wealth. Status is your place in the social hierarchy.

    去寻求财富,而非金钱或地位。财富就是你拥有资产,而资产在你睡觉的时候都还在为你赚钱;金钱是我们转换时间和财富的工具;身份是你在社会等级体系里所处的位置。

  2. Understand that ethical wealth creation is possible. If you secretly despise wealth, it will elude you.

    要明白一件事:一个人完全可以不靠坑蒙拐骗站着赚取财富。如果你在暗中鄙视财富,那么财富也会躲着你。

  3. Ignore people playing status games. They gain status by attacking people playing wealth creation games.

    别去理会那些热衷于玩身份游戏的人,他们通过攻击那些创造财富的人以获得自己的身份。

  4. You’re not going to get rich renting out your time. You must own equity — a piece of a business — to gain your financial freedom.

    你不会通过出租自己的时间而变得富有。你必须拥有产权,也就是生意的一部分,以此才能赢得个人财务自由。

Read more »

微博目前关注了好几个做安全的大佬
不要问我为什么关注
问就是想观摩下有钱人的微博!

其中有一个经常发 Java 相关的内容
今天看到一个稍微熟悉一点关于 FastJson 漏洞

窃以为Fastjson入门的最佳篇章非Mi1k7ea这个系列莫属,郑重推荐: Mi1k7ea
共有5篇,从第3篇开始,成体系地由旧到新展示了1.2.25之后各版本的补丁绕过,
直至思路惊艳的1.2.47绕过方案及1.2.48的修补方案,相当完备。
可以看出此君是动手实践派、整理归纳派,要我说,新学东西时就得这套路,无它。

今天看了这两篇文章,不得不说对 Java 是异常的熟悉。
想做好安全,想必要对用的东西了如指掌,知道坑在哪里,怎么填坑。

Read more »