记一次接口优化

1、优化背景 最近在做一个隐私号相关的服务,其中一个主要的接口遇到了性能瓶颈,本文把优化的思路、过程和结果记录下来,以供备忘和之后参考。 基础概念 隐私号服务:隐私保护通话(Private Number),针对企业的各种商业场景,在不增加SIM卡的情况下,为企业的用户增加隐私号码,使其既能享受优质的通话和短信服务,又能隐藏真实号码,保护个人隐私。—华为云 AXB:三个号码的绑定关系,其中X为隐私号码,A号码和B号码之间通过X号码进行通话。比如,在打车场景下,司机端为A号码,乘客端为B号码,之间通过X号码通话,两端看到的也都是X号码。(PS. 此处先不引入透传概念) AX:两个号码的绑定关系,其中X为隐私号码,任意B号码呼叫X号码,都可以呼叫到A号码。 绑定冲突:假设同时存在号码A1X1B1与A1X1B2,那么A1拨打X1的时候,就不知道应该转给B1还是B2了,这种情况就是一种绑定冲突。同理假设同时存在A2X2与A3X2,也会出现绑定冲突。 所以在同一个X号码的前提下,旧AXB关系中AB不允许与该X建立任何关系,旧AX关系中的X不允许建立任何关系,如下所示: 新AXB关系 新AX关系 旧AXB关系 AB号码有一个相同即冲突 冲突 旧AX关系 冲突 冲突 2、接口逻辑 隐私号服务提供绑定接口,该接口既支持AX绑定,也支持AXB绑定,除了要建立绑定关系之外,还要进行绑定冲突的校验,保证数据的正确性。主要逻辑如下所示: 如上图所示,主要逻辑包括幂等校验和冲突校验,且全部借助DB实现,简略版sql(忽略过期时间等附加参数)如下所示: 幂等校验 select * from 绑定关系表 where 状态 = 已绑定 and A = A and X = X and B = B AX冲突校验...

May 9, 2021 · 1 min · sunbufu

一个小周日

好长时间没有更新博客了,没有写点东西了,趁有点时间,随便写写近来生活和工作的感触吧。想到哪里写到哪里,也挺好的。 今天心情不错,算是入职头条以来难得的一个好周日,头条是大小周,每两周才有这么一次休息的周日。加上孙彩云难得不在家,所以更是显得格外可贵。虽然窗外一直传来汽车的鸣笛和隔壁小区施工的噪声,但却不怎么感觉到吵闹,也有不知名的小鸟站在邻居空调的外置机上,喳喳喳喳,也听不懂他们在说些什么,反正看起来很热闹,倒是家里的小猫咪有点按耐不住,想跟他们谈谈鸟生或者猫生。 恰逢夏秋交接,天气逐渐的转凉了,晚上打开窗户,不盖被子的时候都会被冻醒。但是白天更是一种享受,温度不冷不热,阳光从窗户斜斜的照进来,刚好可以在我一扭头可以看到的地方,提醒我外面的生活也很美好。我也想出去走走,但是孙彩云不在,一个人逛悠起来也没啥意思。跟着自己的思路随便想想,不去考虑那些工作上的压力,不去追逐生活中的烦恼,挺好。我起身去拉上了窗帘,窗户上的阳光映的电脑屏幕都快看不见了,一扭头小猫咪躺在我椅子后面的地板上,哼,这么粘人。 天气预报说可能会有小雨,天上还的确有那么几朵云。孙彩云买了个香薰,但是我的鼻子却不怎么灵敏,一直也没有闻到什么香味。昨天她临走的时候还点了起来,说要给我熏熏,出了门我就给吹了,我怕待会玩起来忘了。我这个人就是这样,总是被一些乱七八糟的东西填满,特别是一些鸡毛蒜皮的小烦恼,都会搞得我浑身难受,恨不得能立马把烦恼解决。我把手机锁屏签名改成了“本来无一物,何处惹尘埃”,但是看来没怎么有效果。今年开始一直再用滴答清单,好像是挺管用的,把要做和计划做的事情,和一些乱七八糟的烦恼,都写进去,可以的就设置个提醒时间,然后就尽量不要去想了。想的事情太多,反而一件事都做不了了。 头条的工作怎么说呢,的确是挺忙的。不管是工作的任务,还是工作的氛围,还是大家的工作方式,感觉就像是处在一个急湍的河水中,你刚想停下歇歇脚,身后的水流又推着你到了下一个转弯。这么说起来,还是挺怀念瓜子悠闲的时光的,嘿嘿。 我买了个小米手环,想记录下自己睡眠的状况,爸妈老担心我睡眠不足,身体不好。我自己倒是没有什么感觉,反正督促下自己注意身体吧。说起来我们可能要搬家了,尽量去一个离公司近的地方,应该能节省下不少上下班通勤的时间。但是睡觉睡多了,也会困。 最近好多认识的朋友、同学都要结婚了。大大小小的也都到了该成家的年纪,该背负的肯定还是要背的。最让我感到意外的是大改同学了,发展的贼迅速,也许是考虑了很多吧。 刚才吹来了一阵风,小猫咪哇哇哇哇的跑了吹去,就先写到这里吧,去找个电影看看。

September 13, 2020 · 1 min · sunbufu

bookkeeping 使用教程

一 介绍 一款开源永久免费的 webdav 记账 app 开源地址:https://github.com/sunbufu/bookkeeping 酷安地址:https://www.coolapk.com/apk/261672 特点: 开源且永久免费,欢迎监督,也欢迎 issue 和 pr 不申请多余权限,后台纯净 完全依赖 webdav,没有其他服务器,不会滥用用户数据 之前一直在使用圈子账本,刚开始还挺好,后来的广告越来越多,启动越来越慢,各种地方想变现,有点恶心了。找了一圈没找到喜欢的 app,索性自己用 flutter 开发一个,开源并放在了 github 上。欢迎大家下载使用,也欢迎大家的意见,更欢迎大家 PR。 二 配置 配置过程主要是对 webdav 的配置,我使用坚果云作为服务器,以下也以坚果云为例,其它服务类似。 2.1 webdav 创建目录 首先需要在 webdav 服务器新建目录 bookkeeping,用于保存 app 配置和数据。 2.2 创建 webdav 第三方账号 在【账户信息】>【安全选项】>【第三方应用管理】中新建账号,也可以参考坚果云官方示例。 2.3 在 bookkeeping 中配置 点击右上角菜单中的设置账号。 昵称:随便取 webdav url:webdav的地址【注意,此处需要加上目录名称,例如:https://dav.jianguoyun.com/dav/bookkeeping】 账号:webdav 的账户名 密码:webdav 的密码【注意,坚果云中需要点击"显示密码"复制出来】setting.png 至此,配置已经全部完成,enjoy it :) 三 导入导出 TODO. 四 关于

May 2, 2020 · 1 min · sunbufu

2020年春季换工作的总结

一 背景介绍 18 年加入瓜子,想来已经有两年多了,期间学到了很多,也收获了很多,感谢瓜子。但随着时间的流逝,我也变成了他们口中的"老人",尤其是最后的那段时间,感觉项目失去了挑战,工作也没有了激情,俨然瓜子已经成了我"舒适区"的模样。人不都说嘛,要"敢于跳出自己的舒适区",“生于忧患死于安乐”,所以我毅然决然的决定出来看看。 但是 20 注定是不平凡的一年,年初就遇到了新冠病毒,各个地方也实施了隔离、封城、停工停产等措施。很多依赖实体的企业也迫不得已断尾求生,裁员、降薪、停职也都纷纷拿到了台面上,让今年的面试更难了一些。 虽然如此,但是路还是要走,生活还是要继续,经过了一番苦战吧,最终有幸来到了字节跳动,今年的面试也算是一份特殊经历吧,因此写下来,算是对自己的一个总结吧。 二 面试过程 既然目标(跳到一家心仪的公司)确定了,下一步就需要计划和准备了。我在网上看了一些面试的经验,大概把我的面试分成一下几个步骤: 面试的准备 准备大概可以分成三部分:自我介绍、项目、知识点、算法题和情景题。我的面试准备大概是从年前开始的吧,在网上找了一些资料,根据自己的理解,把知识点用思维导图的方式整理了一遍,后来在看项目的时候把项目也加了进去。但对于算法题和情景题我没有特别好的办法,就是日常的的时候多做做题,刷刷 lc,逛逛技术论坛吧。 面试不是特别心仪的公司 在面试中查缺补漏,及时找出自己知识的漏洞和盲区,特别是开发岗位,的确很难一上来就把所有的知识点都回忆起来,这也是我觉得这一步是非常有必要且重要的原因。对于我来说,毕业到今年面试之前总共也就面试了三四次,面试经验可以说是一点都没有,感觉这次收获了很多,特别是在一些案例题的时候,可以有一定思路的说出自己的想法了。 怎么去界定自己这一步完成了呢?我是在这一步开始之前,先定一个目标,拿到几家 offer 之后,觉得自己应该准备好了,就算是完成了。 大胆去面试心仪的公司 一旦自己觉得可以试试心仪公司的时候,马上结束不心仪公司的面试,去投心仪公司,不要犹豫。一是公司的hc肯定是有限度的,二是继续面不心仪的公司不会给你带来多大的帮助,反而会浪费你的精力和时间。 拿到心仪公司的offer后,尝试下更高层次的公司 因为你很难保证会一辈子呆在这家公司,更高层次的公司可能就是你的下个目标,试下他们的难度呗,反正又没有什么坏处。 其实我这一步没有怎么做,但是我还是推荐大家如果有时间和精力,可以去试试。 三 面试经验 今年的面试,大概面了 10+ 家吧,大概总结下自己面试的一些经验。 一般公司面试大概有这么几轮,组长面、leader 面、总监面、交叉面、hr 面。不排除有些公司为了效率会减少一轮或者几轮。 一般情况下,前几轮面试的重点在于基础能力的掌握,后几轮可能偏向于一些架构设计和问题分析,有些公司可以从 hr 那里知道下一轮的面试官处于什么样的职位,我们可以针对性的准备一些知识。 自我介绍是很重要的一部分,要突出自己的优势,尽量把接下来的话题引导到你擅长的地方。 面试其实有很大的运气成分,跟面试官聊的愉快与否直接关系到能不能通过,所有我们也可以根据是不是聊的愉快来大概判断自己有没有通过,但是也有些面试官会故意问一些很深的题,来考验你,答不上来不代表你们聊的不愉快。 有些面试官会在最后问你有没有想问他的,一般这个时候我都会问日常工作中接触到的组织架构大概是什么样子,一方面了解下公司的规模和人员大概情况,另一方面根据面试官会不会详细的讲解来判断自己的表现。 四 最后总结 找工作本身就是一个双向选择的事情,面试失败不代表你不优秀,可能只是你跟面试官脾气不合,这种情况就算进去,在日后的工作中也会很憋屈。况且大多数公司不同业务线和部门之间的招聘是不会冲突的,就算一个部门的面试失败,也不会妨碍你继续面试下一个部门。你要做的就是从失败的郁闷里面走出来,整理整理心情,继续出发。

May 1, 2020 · 1 min · sunbufu

关于索引失效

1. 使用 EXPLAIN EXPLAIN 是很重要的一个 sql 关键字,可以帮我们查看 sql 的执行计划,寻找到 sql 的问题,优化你的 sql。 使用起来却很简单,只需要在你原来的 sql 前面添加 EXPLAIN 即可,但是我们的重点是在分析执行计划上。 EXPLAIN SELECT * FROM t_order; 执行计划各列的含义如下:详情请参考官方文档 列名 含义 id 执行序号,mysql 会按照从大到小的顺序执行 select_type 查询类型:SIMPLE 简单查询,PRIMARY 外层查询,SUBQUERY 子查询,DERIVED 派生查询(FROM 中包含的子查询),UNION UNION 中第二个或后面的那个查询,UNION RESULT UNION 的结果 table 引用的表 partitions 所属分区 type 访问类型官方文档,常见访问类型:system 只有一条记录的表(=系统表),const 通过索引一次就查询到,eq_ref 唯一索引等值扫描,ref 非唯一索引等值扫描,range 范围索引扫描,index 索引扫描,all 全表扫描 possible_keys 可能使用的索引(优化前) key 实际使用的索引(优化后) key_len 使用索引的长度 ref 上述表的连接匹配条件(哪些列或常量被用于查找索引列上的值) rows 必须扫描的行数 Extra 附加信息官方文档,常见附加信息:Using filesort mysql 无法利用索引完成排序操作,Using temporary 使用了临时表保存中间结果,Using index select 操作使用了覆盖索引,Using where 使用 where 过滤,using join buffer 使用了连接缓存,impossible where where子句的值总是false,不能用来获取任何记录,distinct 优化 distinct,在找到第一个匹配的记录后停止扫描同样值的动作 2....

December 26, 2019 · 2 min · sunbufu