ARTS 打卡 Week4
Algorithm
Go 版本实现如下
思路:题目本身不难,但是要理解题意:不要使用额外的数组空间,仅使用
O(1)
额外空间并原地修改输入数组,说明不能借助新数组。实现方式:从左向右遍历,相等元素用后面替换,不等元素跳过,同时更新数组长度。
Review
Books/grok_system_design_interview.pdf at main · WaitBright/Books (github.com)
继续学习系统设计,阅读了 Grokking the System Design Interview 第二章,学习心得如下
这一章的第 5 点讲数据库设计,需要明确的点有:(1)需要存储的数据量及每条数据的大小。(2)该短链接服务需要设计两张表,URL 映射表和用户表。(3) 数据的存储结构,使用关系型还是 NoSQL。
第 6 节讲基础系统设计和算法,主要考虑的问题有:(1)如何设计原始 URL 编码方式,需要考虑压缩的位数,不同位数可以采用不同的 hash 算法。(2)Key Generation Service (KGS) key 生成服务离线随机生成字符串,方便快速对 URL 编码和保证生成的短链接不重复。(3)KGS 单点故障问题需要考虑服务的冗余备份。
第 7 节讲分区备份问题,要考虑服务的可扩展性和安全性。可以采用区间分区和哈希分区。
第 8 节讲缓存,需要考虑的问题点:(1) 是否需要用缓存,该服务读多写少,且是 heavy-read 类型服务,为了提高访问效率和减少数据库压力,采用缓存非常合适。(2)缓存什么数据,根据前面分析结论了解到 20%的资源被 80%用户访问,所以其实只用缓存 20%经常使用的 URL 即可。(3)缓存淘汰策略怎么选,LRU 是首选,能让不经常访问的资源淘汰符合要求。
第 9 节讲负载均衡,首推轮询,这种方式简单易操作,但是没有考虑每个服务器的负载情况,如果想更加智能可以加服务器负载纳入权重。
最后三节是一些收尾工作,包括定时清除过期的 URL,数据统计以及安全和权限的知识,这些可以交给第三方工具处理。
Technique/Tips
继续学习 Go 的相关技巧,这次学习的内容是 Go 中 option 设计模式。
首先明确使用场景:一般是用在初始化数据的时候,有些字段是必须要初始化的,而有些则是不用。那些不用初始化的字段就被称为可选项。用户根据自己的实际需求对其进行初始化。
然后知道使用方式:1.定义一个函数类型:
type UserOption func(user *User)
2. 写一些可选函数func WithUserPassword(password string) UserOption
,func WithUserName(name string) UserOption
。 3.定义一个初始化结构体方法
最后需要掌握 Option 变种,修改 Option 函数签名的返回值,这种模式可以用作对 Option 函数的参数进行校验。由于这里发生了变更,导致初始化结构体的方法也需要做出相应的变化。
Share
这次想分享的话题是:有效学习。下面是一些看法。
首先要自己主动想学,爱学,这个是原动力,也是最重要的。
然后要带着明确的目标或任务去学习,不然会很容易放弃。
接着就是实践,这一步需要拆解目标,越具体越好,有个小技巧,可以在固定时间学习。
最后一定要有产出,不然和玩手机、看电影在本质上并没有太大的区别。
版权声明: 本文为 InfoQ 作者【WaitBright】的原创文章。
原文链接:【http://xie.infoq.cn/article/01b7bce358fae47c6b7dd714f】。文章转载请联系作者。
评论