给产品经理讲技术
在数据量大的情况下,要分场景选择不同的数据库:
对于业务数据关系复杂的,使用关系型数据库
对于简单的
key-value
数据,果断上NoSQL
对于NoSQL
数据库,使用key
来查询数据。
分布式计算的基础:MapReduce
:把大量的数据分解成独立的单元执行(Map
),然后将结果归并在一起(Reduce
)。
比如要计算2.6TB数据中排名最前的十个人,就可以使用90台服务器做Map
计算,每一台算出自己分配的数据里的前10个,然后将计算结果发送到另外10台机器上做Reduce
:
关系型数据库:
索引:上亿条记录查询很慢,可以像字典一样编制一个索引,查询时先查索引,再拿数据就快很多了
事务:多条
SQL
语句必须一次性执行完毕,强制原子操作,在数据一致性和完整性方面,使用事务操作是必须的联合查询:多张表格一起查询
索引分类:
聚簇索引:按照数据的物理存储顺序建立索引,会改变数据库表的存储结构和数据排序,所以一张表只能有一个聚簇索引
非聚簇索引: 可以有多个
上图中,左边为聚簇索引,右边为名字的非聚簇索引。
ORM: 把对象转换成SQL
语句写入数据库,从数据读数据自动转换为对象。
埋点: 在正常的功能逻辑中添加统计逻辑,统计某个按钮的点击数,一般统计次数会先缓存在APP中。
上报: 周期性上传统计数据给服务器。
记录: 服务器将这些统计数据记录在磁盘
入库&计算:一般将日志发送给日志处理程序,统计出日活、日留存率、某个功能使用次数等数据
展示: 通过报表的方式提供数据分析师
报表数据问题:
报表数据为0
报表数据(日活、在线时长、点击量)大面积突降
报表数据突增
历史数据出现问题
报表数据明显低于预期
业务流程复杂的漏斗统计数据异常
对APP的分发渠道分别统计数据是非常有意义的,这要求为每个渠道生成一个APP,当然对于开发来说,写个配置文件就可以解决了。
硬件知识
CISC 复杂指令集
RISC 精简指令集
刷新率 : 标示一个输出设备每秒钟会更新多少次,单位是 Hz、显示设备的刷新率决定了你1秒钟最多看到多少张画面,比如我的显示器的刷新率就是60fps
帧率:由软件决定的,软件每秒向输出设备发送多少张图片
导致蓝牙音质差的原因是:蓝牙提供的带宽有限、二次编码带来的音质劣化
NFC: 近场通信技术,15cm
以内,两台NFC
设备感知到对方后,就会以13.56MHz
的频率建立数据通道。
主动通信: 耗电、维持一个
RF
场,比如地铁里的门禁机器被动通信:不需要维护
RF
场,只需要被动链接上对方的RF
场后,应答就行
地图
WGS-84
是GPS定位使用的标准坐标系统,它标注的经纬度与地球上的经纬度是一致的,是一个准确的坐标系。
GCJ-02
是我国为了保证地图数据安全,对标准坐标系做了偏移后产生的坐标系,也叫火星坐标系。
所以处理地图相关功能的正确做法是,先根据GPS
获得标准坐标系上的点,然后将标准坐标系的点转换为火星坐标系的点,然后在中国地图上标注这个火星坐标系的点就ok了。
客户端技术
动画:
滑动
翻转
回弹
广告追踪:
APK是怎样练成的
一个解压后的APK文件:
AndroidManifest
包含了软件的一些基本信息,例如版本号,同时它也是程序间能够相互调用的基础,比如在微信里声明了weixin://
这样的协议头,那么其他应用就能通过这个协议头调用微信的功能。
Xposed神器
需要Root
权限,能够从外部修改APP
的功能,实现自动抢红包、修改GPS定位、看到微信撤回的消息。
APP 的 Push
后台有新消息想发给终端时,就使用Push
向终端推送一条消息,而Push
能成功的原因是: 终端周期性给服务器发数据包,告诉自己的存在和联系方式,这就是所谓的“心跳包”。
IOS
上要求使用统一的Push
服务,而国内安卓各个厂商都自己搞自己的。
安卓APP续命大法
监听系统事件,
Android
的广播机制,当系统发生某件事时,它会通知给所有需要知道这件事的应用守护进程唤醒,当
App
守护进程发现主进程被杀死时,自动再次唤醒它全家桶唤醒大法,同一家公司的
App
相互守护,唤醒对方
手机传感器
磁场传感器,可以获得手机在
x
、y
、z
三个方向上的磁场强度。加速度传感器,获得
x y z
三个方向上的加速度值三轴陀螺仪
近距离传感器,里面有个脉冲雷达,通过脉冲信号返回时间计算距离
光线传感器
气压传感器,可以计算海拔高度
温度传感器
一个超级APP是如何诞生的
客户端和服务器之间是一条充满妖魔鬼怪的荆棘之路,有搞劫持的、搞DNS欺诈的、挂羊头卖狗肉的。
所以APP拿到用户密码的第一件事情就是Hash
不可逆加密,然后再传送给服务器。服务器验证后,会返回一个票据作为用户的已登录凭证。用户每次请求把这个凭证带上,服务器就知道你已经登录过了。
点9图:
i18n国际化:
App获取的权限
读取手机状态和身份权限,有了这个权限就可以获取到手机的唯一识别码IMEI
,很多应用用它来做单一用户标识。
原生UI 与 Hybrid App
何时使用原生UI:
对流畅性体验要求较高
UI样式相对固定,不会频繁变化
交互复杂
何时使用H5页面:
较强的动态运营需求
UI样式复杂多变
交互简单
多平台复用
微信登录
微信授权登录系统的授权流程:
用户请求第三方应用 微信号登录
第三方应用使用AppID向微信开放平台(微信App)发送登录请求
微信客户端加载授权页面,请求用户确认
用户点击确认按钮
微信服务器回调第三方服务器,并且将临时授权码(code)传递给第三方服务器
第三方服务器使用code、AppID和AppSecret,通过Https协议向微信开放平台索要用户的
access_token
微信服务器返回用户的
access_token
和refresh_token
,以及用户其他信息
分析授权流程可知,想要获取用户的access_token
,就需要code
AppID
AppSecret
三个标识,code
只在用户确认授权时产生,并且有效期只有几秒钟,AppID
和Appsecret
由第三方应用服务器保管,所以安全性是可以信赖的。
屏幕适配
像素: 物理上的点,分辨率指的是1920*1080
屏幕密度(dpi
或ppi
): 对角线上每英寸距离包含多少像素,比如iPhone 6 Plus
,对角线为5.5
英寸,分辨率为1920*1080
,根据勾股定理,对角线有2203
个像素,屏幕密度就是2203/5.5=400
密度无关像素(dp):dp=(dpi/160)*px
,也就是说在160dpi
的屏幕上,1dp=1px
,而在320dpi
屏幕下,1dp=2px
适配时:
mdpi区间: 1dp = 1px
hdpi区间: 1dp = 1.5px
xhdpi区间: 1dp = 2px
xxhdpi区间: 1dp = 3px
如何用安卓实现计步
计步传感器 + 加速度传感器
应用生存期
应用之间是如何交互的
应用可以声明自己独有的Scheme
,比如微信的weixin:
,QQ的mqq:
,那如果多个应用都声明相同的Scheme
呢?这时系统将会弹出支持的应用列表,让用户自己选择。
计算机网络
NAT协议 网络地址枯竭的救星
NAT: 网络地址转换
静态转换: 内网地址与外网地址是一一对应的关系
动态转换: 与静态转换一致是一一对应的,但是IP与IP的对应关系不是固定的,内网机器如果下线,下次再链入互联网时,会分配一个不同IP,一般ISP服务商会用这种方式
端口多路复用:外网IP的多个端口,对应内网的多个IP
一般家庭或公司内网都是使用的端口多路复用,请求过程梳理如下:
PC浏览器访问
www.ip138.com
,目标:服务器124.167.236.102
端口80
,GET
请求包源地址为192.168.1.106
端口3453
GET
请求包先到达路由器,路由器中的NAT服务
发现源地址为内网地址,于是将请求包中的源地址修改为119.182.101.189
端口4444
,并且记下这个映射关系到NATTABLE
里。www.ip138.com
服务器收到请求包后,向目标地址119.182.101.189
端口4444
发送响应包路由器接收到响应数据包,通过查询
NATTABLE
,将响应包的IP修改为192.168.1.106
端口3453
,然后发送到内网网络,浏览器就收到了响应数据。
P2P终结者的原理
局域网内的ARP攻击
Ping和网关
检查本机的TCP/IP
协议是否正确:ping 127.0.0.1
Session机制
session
机制解决了Http
协议无状态的问题,相当于给每个用户分配了一个身份cookie
,从而完成对用户的识别。
端口
物理端口: USB接口等
TCP的可靠机制
顺序编号: 文件会被拆分成多个数据包发送,数据包会顺序编号
确认机制: 接收方拿到数据包后,会返回一个确认包,通知发送方:已收到
超时重传: 当发送方久久没有收到一个数据包的确认包时,就会重新发送这个包
UDP 不可靠
数据包发送出去后,就与当前主机再无联系
数据包是无序的
HTTP2
多个
HTTP
请求复用在一个TCP
链路上二进制传输:可以用来传加密数据、或视频流
使用
HPACK
压缩头部信息服务端可以主动
Push
消息到浏览器
邮件协议
POP: Post Office Protocol
邮局协议,用于从邮件服务器拉取邮件到本地。
IMAP: 比POP
协议强大,它是先获取邮件的标题和摘要,当你想看具体内容时再去拉取正文,同时它还可以将邮件处理状态(删除、标记已读)同步给服务器。
SMTP:发邮件的协议,一封邮件从客户端到自己的邮箱服务器,再从自己的邮箱服务器到对方的邮箱服务器,都是使用这个协议进行传输的。
反向代理
CDN
CDN: 内容分发网络,内容一般指静态资源,比如一张图片、一个文本文件、一个视频、一个CSS、一个JS等。
CDN基于当前互联网的基础架构,全国各地部署大量服务器,在其上层再构成一个网络,这个网络专为资源分发而生。
关键点: 应用服务器 与 资源服务器 解耦。CDN
专注于处理资源服务器,利用DNS
判断出用户位置后,将离用户距离最近的资源服务器,返回给用户。
Socket
就是一套API
,封装了TCP/IP
协议。
VPN
Virtual Private Network 简称 VPN
。
RESTful API
规则:
URL
只能表示资源对资源的操作一律用
HTTP
协议自带的动词(GET
POST
UPDATE
DELETE
)完成
序列化
序列化: 将数据对象转成二进制串。
反序列化: 将二进制串还原成数据对象。