1. Algorithm 每周一道算法题
本周算法题是出自身外所有数乘积
本题的难点在于不能使用除法,并且要求 O(1)时间复杂度,首先不使用除法,那么能想到的方式是用一个数组保存当前下表左边所有数的乘积,这样从后往前遍历即可得到结果,但是空间复杂度为 O(N),想了半天没想到空间复杂为 O(1)的解法,查看题解发现,返回数组不算空间复杂度,原来我的解法空间复杂度已经是 O(1)了,真是醉了
2. Review 阅读一篇英文文章
本周同样没有时间看英文文章,并且暂时没有发现有价值的文章,欠账记录,目前欠 4 篇文章了,如果你有好的英文文章,欢迎留言推荐,不甚感激。
3. Techniques/Tips 分享一个小技巧
最近在学习架构设计课程,获益蛮多的,其中学习到高性能数据库集群其中的读写分离和分库分表,读写分离使用主从实现,适用于读多写少系统,针对读可方便的使用扩容扩展其性能,但是存在主从延迟以及请求分配的问题,针对主从延迟,没有较为完美的方案,不过有三种方式可以减少主从延迟:
- 如果刚刚写入的数据,从主机读
- 从机读取失败的数据切换到主机读
- 关键业务数据从主机读,非关键业务数据从从机读
以上解决办法都不完美,都会增加主机负载
虽然读写分离问题已经够麻烦了,但是相较于分库分表而言,复杂度还差的远
对于分库而言,有 join 问题、事务问题,解决办法是通过代码解决
对于分表而言,分为垂直分表和水平分表
垂直分表复杂性体现在表操作数量会增加,因为需要关联多个表查询数据
水平分表有 join、count、order by、路由问题
其中路由问题是比较灵活的问题,有以下几种解决方案:
- 范围路由:简单,扩展性好,但是范围大小不好定,且存在数据倾斜问题
- hash 路由:基本不存在数据倾斜问题,但是初始表数量不好定,并且扩容麻烦
- 配置路由:使用额外的表保存数据和子表的映射关系,配置表可能存在性能问题
4. Share 分享一个观点
个人成长过程中,我认为对自己有清醒的认识非常重要,知道自己现在所处的位置以及未来学习前进的方向,比自己闷头瞎学要重要的多,并且在学习过程中,需要有方式的学习,不然很多时候会变成知识以一种碎片化的方式进入脑袋,然后被我们的大脑当做垃圾清理掉,我目前正在使用的学习方式是做思维导图,并且尝试将自己学习的结果讲给别人听,很多时候在讲解的过程中就会发现其实有些地方掌握的不算牢靠,还需要进一步加深印象,并且如果能将别人讲懂,那么表明你自己对该部分知识已经完全掌握,除此外,还可以通过写文章的方式加深理解,但是写文章老实讲,很耗精力和时间,因此建议先写思维导图,当某个知识完全学习完成后,可以尝试写一篇总结性的问题。