图片无法加载
本教程的知识点为:简介 1. 内容 2. 目标 产品效果 ToutiaoWeb虚拟机使用说明 数据库 理解ORM 作用 思考: 使用ORM的方式选择 数据库 SQLAlchemy操作 1 新增 2 查询 all() 数据库 分布式ID 1 方案选择 2 头条 使用雪花算法 (代码 toutiao-backend/common/utils/snowflake) 数据库 Redis 1 Redis事务 基本事务指令 Python客户端操作 Git工用流 调试方法 JWT认证方案 JWT & JWS & JWE Json Web Token(JWT) OSS对象存储 七牛云存储 需求 方案 使用 缓存 缓存架构 多级缓存 头条项目的方案 缓存数据 缓存 缓存问题 1 缓存 2 缓存 头条项目缓存与存储设计 APScheduler定时任务 定时修正统计数据 RPC RPC简介 1. 什么是RPC RPC 编写客户端 头条首页新闻推荐接口编写 即时通讯 即时通讯简介 即时通讯 Socket.IO 1 简介 优点: 缺点: Elasticsearch 简介与原理 1 简介 属于面向文档的数据库 2 搜索的原理——倒排索引(反向索引)、分析、相关性排序 Elasticsearch 文档 索引文档(保存文档数据) 获取指定文档 判断文档是否存在 单元测试 为什么要测试 测试的分类 什么是单元测试 断言方法的使用:
全套笔记资料代码移步: 前往gitee仓库查看
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
图片无法加载
图片无法加载
部分文件图片:
图片无法加载
简介
1. 内容
- 项目介绍
- 数据库方案
- Gitflow工作流
- 认证方案
- 对象存储
- 缓存方案
- RPC方案 grpc
- 搜索方案
- 即时通讯方案
- APScheduler定时任务
- supervisor进程管理
2. 目标
- 以头条产品为依托案例,但不再以具体业务实现为主
- 力求掌握解决不同问题的实施方案
- 深入理解并巩固前面所学的知识
产品效果
用户端
- 移动web
[
- iOS
[ (App下载地址)](
图片无法加载
- Android
[ (App下载地址)](
图片无法加载
- 自媒体端
[
- MIS管理后台
[
ToutiaoWeb虚拟机使用说明
- 作为项目的开发环境
- 黑窗口 无GNOME 模拟企业中的开发服务器环境
- CentOS7.2
- 开机前先将虚拟机调成NAT模式
- 虚拟机占用内存4G,如果主机内存不足,可启动前将内存占用调为2G
在Windows中使用SSH客户端
- Termius
- xshell
- ssh python@自己的ip地址
用户名 密码
系统
- root -> chuanzhi
- python -> chuanzhi
MySQL
- root -> mysql
端口
MySQL (mariadb)
- master -> 3306
- slave -> 8306 (mysql -uroot -p -h 127.0.0.1 --port=8306)
Redis
- cluster -> 7000 7001 7002 7003 7004 7005
- master & slave -> 6380 6381
- sentinel -> 26380 26381 26382
Elasticsearch 5
- 9200
Python 虚拟环境
- workon toutiao
- 关机 sudo shutdown now
- 重启 reboot
Pycharm远程开发
可以在Windows中使用Pycharm编写代码,而代码的调试运行可以使用远程服务器中的python解释器。
在本地创建好工程项目(或从git上clone下代码)后,用Pycharm打开:
- 打开「Tools」设置 「Deployment」
图片无法加载
- 选择SFTP
图片无法加载
- 设置服务器名字
图片无法加载
- 设置服务器信息
*图片无法加载*
- 测试服务器连接是否可用
图片无法加载
- 设置上传代码的目录映射
图片无法加载
- 打开设置,设置远程Python解释器
图片无法加载
- 选择已存在的服务器设置
图片无法加载
- 选择Create 复制服务器设置到解释器中
图片无法加载
图片无法加载
- 选择远程服务器中虚拟环境里的解释器
/home/python/.virtualenvs/toutiao/bin/python
图片无法加载
- 设置远程服务器运行代码的目录映射
图片无法加载
- 若Pycharm不能自动上传代码,可勾选Automatic Upload
图片无法加载
注意,设置后Pycharm要加载环境,需要花费一定时间(只在配置后第一次使用发生)
产品与开发
1 产品介绍
头条是一款基于个性化推荐的科技资讯类阅读产品,类似于今日头条,产品分为以下几个终端:
- 用户端
用户获取个性化推荐资讯的终端,有阅读、关注、评论、智能客服(聊天机器人)等功能,分移动Web页面及iOS和安卓手机App。
- 自媒体端
自媒体端是自媒体作者编辑、发布资讯文章、查看自媒体号运营数据的平台。
- MIS管理后台
MIS管理后台是头条产品公司运营管理的后台,可进行用户管理、文章审核及管理、评论管理等。
2 原型图与UI图
- 产品原型图
产品经理制作,是产品的原型设计,表达产品的功能组成
产品原型图的查看,需要安装Axure RP的Chrome浏览器扩展,方式如下:
- 进入Chrome浏览器「扩展程序」页面
图片无法加载
- 打开「开发者模式」
图片无法加载
- 点击「加载已解压的扩展程序」,并选择「Axure_RP_Extension_for_Chrome_0.6.3」目录
图片无法加载
- 选择已安装扩展的「详细信息」
图片无法加载
- 打开「允许访问文件网址」
图片无法加载
安装后,打开原型图目录中的「index.html」文件即可。
原型图包含:
前台原型图
- 用户端
- 自媒体端
- 后台原型图(MIS管理后台)
- UI效果图
用户界面效果图,由UI人员设计,是产品最终的用户能够看到的产品样式效果。
3 技术架构
项目采用前后端分离模式。
图片无法加载
4 开发
人员团队(最少规模):
- 产品经理 1人
- UI 1人
前端 2~3 人
- Flutter 开发APP
- Vue 开发Web页面
- Web后端 2~3人
- 推荐系统 2~3 人
- Chatbot 1~2 人
- 测试 1~2 人
开发平台
- Gitlab
请到[
为方便将大家拉入到项目团队中,注册帐号的要求
图片无法加载
注意:此gitlab不要放私人项目,会定期清理数据。
- 使用Windows的同学需要在windows中安装git
- YApi 接口管理
[
数据库
- 数据库设计
- SQLAlchemy
- 数据库理论
- 分布式ID
- Redis
数据库
- 数据库设计
- SQLAlchemy
- 数据库理论
- 分布式ID
- Redis
数据库设计
1 需求
根据头条前台产品原型图中用户端的部分,进行数据库设计。
- 表结构
- 字段类型、是否允许为null、是否有默认值
- 索引设计
- 数据库引擎的选择
2 注意事项
- 为了查询效率,可以做冗余字段设计(空间换时间的思想,属于一种反范式设计)
字段类型的选择
整型的存储大小与显示大小
mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同。如果不同,分别是多大?
我们建立下面这张表:
CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `i1` int(3) unsigned zerofill DEFAULT NULL, `i2` int(6) unsigned zerofill DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
插入一些数据后 图片无法加载
发现,无论是int(3), int(6), 都可以显示6位以上的整数。但是,当数字不足3位或6位时,前面会用0补齐。
手册解释是这样的:
MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
也就是说,int的长度并不影响数据的存储精度,长度只和显示有关,为了让大家看的更清楚,我们在上面例子的建表语句中,使用了zerofill。
最终答案:存储范围相同。
char 与 varchar 的选择
- char 不可变,查询效率高,可能造成存储浪费
- varchar 可变,查询效率不如char,节省空间
常见MySQL数据类型
类 型 | 大 小 | 描 述 |
---|---|---|
CAHR(Length) | Length字节 | 定长字段,长度为0~255个字符 |
VARCHAR(Length) | String长度+1字节或String长度+2字节 | 变长字段,长度为0~65 535个字符 |
TINYTEXT | String长度+1字节 | 字符串,最大长度为255个字符 |
TEXT | String长度+2字节 | 字符串,最大长度为65 535个字符 |
MEDIUMINT | String长度+3字节 | 字符串,最大长度为16 777 215个字符 |
LONGTEXT | String长度+4字节 | 字符串,最大长度为4 294 967 295个字符 |
TINYINT(Length) | 1字节 | 范围:-128~127,或者0~255(无符号) |
SMALLINT(Length) | 2字节 | 范围:-32 768~32 767,或者0~65 535(无符号) |
MEDIUMINT(Length) | 3字节 | 范围:-8 388 608~8 388 607,或者0~16 777 215(无符号) |
INT(Length) | 4字节 | 范围:-2 147 483 648~2 147 483 647,或者0~4 294 967 295(无符号) |
BIGINT(Length) | 8字节 | 范围:-9 223 372 036 854 775 808~9 223 372 036 854 775 807,或者0~18 446 744 073 709 551 615(无符号) |
FLOAT(Length, Decimals) | 4字节 | 具有浮动小数点的较小的数 |
DOUBLE(Length, Decimals) | 8字节 | 具有浮动小数点的较大的数 |
DECIMAL(Length, Decimals) | Length+1字节或Length+2字节 | 存储为字符串的DOUBLE,允许固定的小数点 |
DATE | 3字节 | 采用YYYY-MM-DD格式 |
DATETIME | 8字节 | 采用YYYY-MM-DD HH:MM:SS格式 |
TIMESTAMP | 4字节 | 采用YYYYMMDDHHMMSS格式;可接受的范围终止于2037年 |
TIME | 3字节 | 采用HH:MM:SS格式 |
ENUM | 1或2字节 | Enumeration(枚举)的简写,这意味着每一列都可以具有多个可能的值之一 |
SET | 1、2、3、4或8字节 | 与ENUM一样,只不过每一列都可以具有多个可能的值 |
索引
- 主键 Primary Key
外键 Foreign Key
- 保持数据完整性
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]
例如:
ALTER TABLE `user_resource` CONSTRAINT `FKEEAF1E02D82D57F9` FOREIGN KEY (`user_Id`) REFERENCES `sys_user` (`Id`)
CASCADE
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
* ON DELETE:删除主表时自动删除从表。删除从表,主表不变
* ON UPDATE:更新主表时自动更新从表。更新从表,主表不变
SET NULL
在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)
* ON DELETE:删除主表时自动更新从表值为NULL。删除从表,主表不变
* ON UPDATE:更新主表时自动更新从表值为NULL。更新从表,主表不变
NO ACTION
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
* ON DELETE:从表记录不存在时,主表才可以删除。删除从表,主表不变
* ON UPDATE:从表记录不存在时,主表才可以更新。更新从表,主表不变
RESTRICT
同no action, 都是立即检查外键约束
SET DEFAULT
父表有变更时,子表将外键列设置成一个默认的值 但Innodb目前不支持
索引 Key / Index
- 提升查询效率,减慢增删改速度
唯一约束 Unique
- 保证数据不重复
- MySQL数据库引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
SHOW ENGINES # 命令来查看MySQL提供的引擎
SHOW VARIABLES LIKE 'storage_engine'; # 查看数据库默认使用哪个引擎
InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。InnoDB主要特性有:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。
InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
4、InnoDB支持外键完整性约束
5、存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
6、InnoDB被用在众多需要高性能的大型数据库站点上
InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。MyISAM主要特性有:
1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
5、BLOB和TEXT列可以被索引
6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩
8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
9、可以把数据文件和索引文件放在不同目录
10、每个字符列可以有不同的字符集
11、有VARCHAR的表可以固定或动态记录长度
12、VARCHAR和CHAR列可以多达64KB
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。MEMORY主要特性有:
1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
2、MEMORY存储引擎执行HASH和BTREE缩影
3、可以在一个MEMORY表中有非唯一键值
4、MEMORY表使用一个固定的记录长度格式
5、MEMORY不支持BLOB或TEXT列
6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
图片无法加载
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
3 头条项目数据库
加入Gitlab项目组,克隆toutiao-backend
代码,理解数据库sql文件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。