• 项目知识点


    项目一:

    数据库索引: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怎么保持缓存与数据库一致性

    1. 首先尝试从缓存读取,读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。
    2. 需要更新数据时,先更新/删除数据库,然后把缓存里对应的数据失效掉(删掉)---若:还不一致的原因,一定是数据库更新/删除了,但是删除缓存失败了。
    • 针对2的解决方案:
    1. 对删除缓存进行重试,数据的一致性要求越高,我越是重试得快。
    2. 定期全量更新,简单地说,就是我定期把缓存全部清掉,然后再全量加载。
    3. 给所有的缓存一个失效期。
      第三种方案可以说是一个大杀器,任何不一致,都可以靠失效期解决,失效期越短,数据一致性越高。但是失效期越短,查数据库就会越频繁。因此失效期应该根据业务来定。
    • 并发不高的情况:
      读: 读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 附加包即可。

    • tornado配合celery及rabbitmq实现web request异步非阻塞

    阻塞

    阻塞,先从耗时操作讲起,常见的场景比如用户输入、等待(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/

    用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/

    4. 二维码,uuid,学生信息、加盐

    5. 雪花算法

    https://www.cnblogs.com/oklizz/p/11865750.html

  • 相关阅读:
    微信授权,重定向两次
    Newtonsoft.Json 序列化 排除指定字段或只序列化指定字段
    各大快递公司面单号准确性验证的正则表达式,来自淘宝开放平台,时间是20181206,
    微信小程序web-view(webview) 嵌套H5页面 唤起微信支付的实现方案
    HTTP请求头及其作用 转
    sql server 只读帐号设置能读取存储过程,view等内容。
    PhantomJS命令行选项
    XML实体注入漏洞
    XmlDocument 避免XXE
    Centos7.6安装redis
  • 原文地址:https://www.cnblogs.com/oklizz/p/11853037.html
Copyright © 2020-2023  润新知