App后台开发笔记
1.关于API
- RESTful API设计,参见阮一峰的blog
- 根据对象来设计:比如“对象名称/操作名称”,如“user/delete”
- 返回正确值和空值的类型保持一致(不要各种null)
2.用户登录
简单方法
- APP后台接收到用户名和密码,验证正确后生成一串token,在Redis中建立token字符串和用户信息的对应关系
- 后台将token传回
- 需要验证用户身份的操作必须传回token(token字符串附加在URL上)
- 退出登录时,后台将该用户对应的token删除
安全性修改
- Redis中建立token字符串和用户id的对应关系
- API请求不直接附加token字符串,而是附加原“URL+token”的md5值作为签名,同时附加用户id而后再传
防止攻击者重放
- 加入时间戳
- 客户端和服务端进行时间校准
更进一步
- 使用自定义通信协议
- 使用加密算法
- 支付密码永远不在APP端保存
3.数据更新
- 轮询(典型的”拉“),每隔一段时间向App后台发送请求
- 服务端推送,客户端接收消息后再拉取
- 使用”updateTime“增量更新,设置since(从何时开始)和latest(想要取得的最新时间),取得两者之间服务器端更新的内容。
- (增量更新中的删除)在后台把需要删除内容的updateTime更新到最新,设置delete字段为1,则APP本地获取后,就进行删除。
4.数据库
MySQL的两种引擎:InnoDB和MyISAM
InnoDB支持行锁和外键,事务安全
MyISAM支持表锁,不支持外键,事务不安全
索引
- 给合适的列简历索引
- 索引列的值尽可能不同
- 使用短索引(字符类型指定长度)
- 利用最左前缀
优化建议
- 避免使用select * (传输量过大,耗费时间)
- 字段设置为NOT NULL(除非需要严格区分未填和空)
- 缓存(系统缓存、MySQL缓存和Redis应用缓存)
- 分库分表(详见李智慧《大型网站技术架构核心原理与案例分析》)
- 分析慢查询记录
5.Redis
- 全部数据操作在内存,保证了高速
- 提供了丰富多样的数据类型
- AOF和RDB两种数据持久化方式
- 所有操作都是原子性
数据类型
- String:比较灵活(缓存商品分类等)
- hash:类似数据库,存储对象的数据(根据id获取信息等)
- list:按照插入顺序排序的字符串列表(消息队列、发送短信等)
- set:无序且不重复的集合(共同好友等)
- sorted list:有序且不重复