项目知识点
项目一:
数据库索引:https://juejin.im/post/5de85a66f265da33d21e68b7
索引设计规则:https://www.cnblogs.com/oklizz/p/12076519.html
1. App上方提示
2. 数据实时数据:事务
事务的四个属性:ACID原子性,一致性,隔离性,持久性
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。
3. 悲观锁,乐观锁
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性
4. 频繁变化的数据
频繁变化的数据,那就假设调用第三方接口的频率为1s/次,看起来貌似用不着缓存。但题注强调了这个接口很慢,猜想应该是在业务里同步调用这个接口来更新数据,并且写入缓存的。那解决方案如第一个答案一样,缓存数据不要设置过期时间,在线业务只从缓存读取数据,数据的同步交给离线脚本异步来做,这样就消除了第三方接口对在线业务的影响,可以很快的返回数据了
5.缓存的更新机制该怎么做?
1.缓存的更新就是异步离线脚本,定时轮询API,获取新数据,存入缓存,只是这里需要记录需要更新数据的航班,毕竟不是所有航班都有人访问。
2.题主提到该接口收费,即希望尽可能少的调用,可以在业务端有人访问某个航班的时候做个记录,并且在数据同步脚本仅对有记录的且T时间内没有同步过数据的航班进行数据同步,T是航班同步间隔,自己根据业务来。
3.让第三方接口查询在后台操作,比如用crontab在后台定时取第三方接口数据,存储取到的数据到自己数据库或cache;如果要求实时性很高,crontable时间设置短一点
工作中常用的crontab命令:
https://www.cnblogs.com/MartinChentf/p/6060252.html
shell教程
https://www.runoob.com/linux/linux-shell.html
6.Redis怎么保持缓存与数据库一致性
- 首先尝试从缓存读取,读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。
- 需要更新数据时,先更新/删除数据库,然后把缓存里对应的数据失效掉(删掉)---若:还不一致的原因,一定是数据库更新/删除了,但是删除缓存失败了。
- 针对2的解决方案:
- 对删除缓存进行重试,数据的一致性要求越高,我越是重试得快。
- 定期全量更新,简单地说,就是我定期把缓存全部清掉,然后再全量加载。
- 给所有的缓存一个失效期。
第三种方案可以说是一个大杀器,任何不一致,都可以靠失效期解决,失效期越短,数据一致性越高。但是失效期越短,查数据库就会越频繁。因此失效期应该根据业务来定。
- 并发不高的情况:
读: 读redis->没有,读mysql->把mysql数据写回redis,有的话直接从redis中取;
写: 写mysql->成功,再写redis; - 并发高的情况:
读: 读redis->没有,读mysql->把mysql数据写回redis,有的话直接从redis中取;
写:异步话,先写入redis的缓存,就直接返回;定期或特定动作将数据保存到mysql,可以做到多次更新,一次保存;
6. elasticserch实现全文检索
7. apscheduler集成定时任务,使redis和Mysql数据同步
8. redis缓存采用read-throuht实现读缓存,Redis过期策略采用惰性过期和定时过期
- 定时数据校准解决缓存更新问题
9. 使用redis实现评论、收藏、文章、历史记录和冗余数据持久化,采用AOF+RDB
10. 第三方百度地图,实现定位
11. 对个人信息数据进行垂直分表,使用雪花算法构建学生数据id,以优化数据库,搭建mysql集群实现读写分离
项目二:
1. 热点新闻中心采用页面静态化+定时任务进行刷新,个人可以进行评论点赞
- 评论列表使用zset形式存储,评论按时间顺序展示
- 对于数据库中不存在的数据,在缓存中设置默认值和较短的有效期,以防止缓存穿透问题
- 经题目。文章数据的有效期设置为一定范围内的随机值,防止缓存雪崩问题
2. redis缓存日访问量,阅读量等数字冗余字段,并实现持久化
3. elasticserch实现全文检索
Elasticsearch简介和原理
1.分析
2.倒排/反向索引
3.相关性排序
3. 爬虫相关requests
项目三:
1. 负载均衡
2. 线程threading
3. 消息队列
原因:高并发环境下,由于来不及同步处理,请求往往发生堵塞,比如大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发并发错误。
解决:消息队列,异步处理请求从而缓解系统的压力
https://www.cnblogs.com/dongxiaodong/p/10495941.html
4. Redis事务、pipline
- 使用pipeline读写redis:
https://blog.51cto.com/leizhu/1825733
我们的批量里有5个操作,在处理时间维度上性能提升了4倍!
网络延迟大约是30ms,不使用批量的情况下,网络上的时间损耗就有0.15s(30ms*5)以上。而pipeline批量操作只进行一次网络往返,所以延迟只有0.03s。可以看到节省的时间基本都是网路延迟 - pipeline不仅仅用来批量的提交命令,还用来实现事务transation。
细心的你可能发现了,使用transaction与否不同之处在与创建pipeline实例的时候,transaction是否打开,默认是打开的。 - redis事务
5. 异步celery + 队列rabbitmq
celery没有消息存储功能,他需要介质,比如rabbitmq redis mysql mongodb 都可以。有这个可控的东西,你也可以在库里面搞搞。
推荐rabbitmq,速度和可用性都很高,redis怕意外挂掉
- Celery和RabbitMQ是两个层面的东西。
Celery是一个分布式的任务队列。它的基本工作就是管理分配任务到不同的服务器,并且取得结果。
至于说服务器之间是如何进行通信的?这个Celery本身不能解决。
所以,RabbitMQ作为一个消息队列管理工具被引入到和Celery集成,负责处理服务器之间的通信任务。
后来Celery相继增加了一些对Redis,MongoDB之类的支持。原因是RabbitMQ尽管足够强大,但对于一些相对简单的业务环境来说可能太多(复杂)了一些。这样用户可以有多一些的选择。
-
celery的介绍
Celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。
它侧重于实时操作,但对调度支持也很好。
celery用于生产系统每天处理数以百万计的任务。
celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。
建议的消息代理RabbitMQ的,但提供有限支持Redis, Beanstalk, MongoDB, CouchDB, ,和数据库(使用SQLAlchemy的或Django的 ORM) 。
celery是易于集成Django, Pylons and Flask,使用 django-celery, celery-pylons and Flask-Celery 附加包即可。
阻塞
阻塞,先从耗时操作讲起,常见的场景比如用户输入、等待(sleep)这些都属于,具体到实际项目中比如说发邮件、发短信、机器/深度学习训练模型、自动化测试中的各种操作流程等待都会产生耗时
耗时操作通常我们也会称之为阻塞,意思就是程序一行一行代码执行,你这些耗时操作没执行完毕,后面的代码就不会执行,阻塞了后面的代码执行
项目四:
1. 文档上传功能
2. 解决普通索引和唯一索引更新出现的问题
3.
项目五:
1. 数据库性能优化
数据库优化查询方法:外键、索引、联合查询、选择特定字段等等
https://www.cnblogs.com/lideqiang0909/p/11162665.html
(1)选取最适用的字段属性
(2)使用join代替子链接
(3)使用联合(UNION)来代替手动创建的临时表
(4)事务
(5)锁定表
(6)使用外键
使用逻辑外键,不使用物理外键,不然影响查询效率
(7)使用索引
(8)优化查询语句
2. Redis缓存
3. qrcode开源模块
qrcode博客:
https://blog.csdn.net/Zhipeng_Hou/article/details/83381133
https://blog.csdn.net/cungudafa/article/details/85871871#_130
pypi:
https://pypi.org/project/qrcode/6.1/
- 2016.7读取二维码
https://fishc.com.cn/thread-73859-1-3.html
用Python生成二维码非常方便,只需pyqrcode包。但是这个包无法读取二维码信息。我在读取的时候遇到了以下困难
1、读取二维码使用了qrtools包,但是安装这个包需要安装zbar
1、zbar包,只支持Python2.5,Python2.6。我使用的是Python3.5,anacond4.
2、zbarlight包支持Python3,pip安装时提示Unable to find vcvarsall.bat
[解码网站]https://jiema.wwei.cn/