熙仪繁华
这个作者很懒,什么都没留下…
展开
-
黑马头条项目 12 部署相关 supervisor进程管理工具
Supervisorsupervisor是进程管理工具安装supervisor对python3支持不好,须使用python2sudo pip install supervisor 查看头条虚拟环境的pip版本可以看到为3.6我们退出头条的虚拟环江 在外面安装配置运行echo_supervisord_conf命令输出默认的配置项,可以如下操作将默认配置保存到文件中echo_supervisord_conf > superviso...原创 2021-12-24 18:21:27 · 123 阅读 · 0 评论 -
黑马头条项目 12 部署相关 Gunicorn(绿色独角兽)
GunicornGunicorn(绿色独角兽)是一个Python WSGI的HTTP服务器。从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器与各种Web框架兼容,实现非常简单,轻量级的资源消耗。Gunicorn直接用命令启动,不需要编写配置文件,相对uWSGI要容易很多。安装gunicornpip install gunicorn查看命令行选项:安装gunicorn成功后,通过命令行的方式可以查看gunicorn的使用信息。$gunicorn ...原创 2021-12-24 17:43:00 · 145 阅读 · 0 评论 -
黑马头条项目 11 单元测试
单元测试为什么要测试Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的。测试的分类测试从软件开发过程可以分为:单元测试 对单独的代码块(例如函数)分别进行测试,以保证它们的正确性 集成测试 对大量的程序单元的协同工作情况做测试 系统测试 同时对整个系统的正确性进行检查,而不是针对独立的片段原创 2021-12-24 16:47:06 · 107 阅读 · 0 评论 -
黑马头条项目 10.10 头条suggest查询实现
头条suggest查询实现思路先将关键字在completions 自动补全索引库中查询,获取建议的补全信息 如没有获取到补全信息,可能表示用户输入的关键词有拼写错误,在articles索引库中进行纠错建议查询实现在toutiao-backend/toutiao/resources/search.py中实现自动补全视图class SuggestionResource(Resource): """ 联想建议 """ def get(self):原创 2021-12-24 15:23:27 · 111 阅读 · 0 评论 -
黑马头条项目 10.9 suggest查询 自动补全
联想提示拼写纠错使用普通的索引库即可实现,对于自动补全需要单独建索引库1 拼写纠错对于已经建立的articles索引库,elasticsearch还提供了一种查询模式,suggest建议查询模式curl 127.0.0.1:9200/articles/article/_search?pretty -d '{ "from": 0, "size": 10, "_source": false, "suggest": { "text...原创 2021-12-24 15:13:55 · 120 阅读 · 0 评论 -
黑马头条项目 10.8 python全文检索实现 (热启动 测试)
头条全文检索实现elasticsearch python客户端使用https://elasticsearch-py.readthedocs.io/en/master/>pip install elasticsearchelasticsearch 对2.x 5.x 6.x 都进行安装了 使用的时候需要指定从哪个版主中导入对于elasticsearch 5.x 版本 需要按以下方式导入from elasticsearch5 import Elasticsearch#...原创 2021-12-23 13:11:02 · 147 阅读 · 0 评论 -
黑马头条项目 10.7 查询
1 基本查询 根据文档ID curl -X GET 127.0.0.1:9200/articles/article/1 curl -X GET 127.0.0.1:9200/articles/article/1?_source=title,user_id curl -X GET 127.0.0.1:9200/articles/article/1?_source=false 查询结果 查询所有 curl -X GET 127.0.0.1:9200原创 2021-12-23 10:19:00 · 61 阅读 · 0 评论 -
黑马头条项目 10.6 使用logstash导入数据
Logstash导入数据使用logstash 导入工具从mysql中导入数据Logstach安装sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch在 /etc/yum.repos.d/ 中创建logstash.repo文件[logstash-6.x]name=Elastic repository for 6.x packagesbaseurl=https://artifacts.elastic原创 2021-12-23 09:50:14 · 141 阅读 · 0 评论 -
黑马头条项目 10.5 文档
文档一个文档的实例{ "name": "John Smith", "age": 42, "confirmed": true, "join_date": "2014-06-01", "home": { "lat": 51.5, "lon": 0.1 }, "accounts": [ { "type": "fa原创 2021-12-23 09:12:56 · 321 阅读 · 0 评论 -
黑马头条项目 10.4 索引与类型
索引与类型索引查看索引curl 127.0.0.1:9200/_cat/indices请求curl 127.0.0.1:9200/_cat可获取用于查询的名称创建索引索引可以在添加文档数据时,通过动态映射的方式自动生成索引与类型。索引也可以手动创建,通过手动创建,可以控制主分片数目、分析器和类型映射。PUT /my_index{ "settings": { ... any settings ... }, "mappings": {原创 2021-12-22 11:08:48 · 191 阅读 · 0 评论 -
黑马头条项目 10.3 IK中文分析器
IK中文分析器https://github.com/medcl/elasticsearch-analysis-ik>将elasticsearch-analysis-ik-5.6.16.zip 复制到虚拟机中scp elasticsearch-analysis-ik-5.6.16.zip [email protected]:~/安装sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///ho原创 2021-12-22 10:23:54 · 58 阅读 · 0 评论 -
黑马头条项目 10.2 概念与集群 (查看集群的健康状态)
概念存储数据到 Elasticsearch 的行为叫做索引(indexing)关于数据的概念Relational DB -> Databases 数据库 -> Tables 表 -> Rows 行 -> Columns 列Elasticsearch -> Indices 索引库 -> Types 类型 -> Documents 文档 -> Fields 字段/属性一个 Elasticsearch 集群可以 包含多个索引(indic...原创 2021-12-22 10:22:54 · 72 阅读 · 0 评论 -
黑马头条项目 10.1Elasticsearch简介与原理
You know, for search!文档Elasticsearch: 权威指南 | Elastic1 简介Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多用户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。所有其他语言可以使用RESTful API 通过端口9200和 Elasticsearch 进行通信Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。官方客户端在Java、.NET...原创 2021-12-17 09:33:36 · 209 阅读 · 0 评论 -
黑马头条项目 9.5 头条在线消息推送实现
头条在线消息推送实现需求在头条的Flask应用中,用户关注后需要推送消息,通过消息队列告知IM服务为用户进行推送在Socket.IO 框架中可以选择使用以下两种方式作为消息中间件: 使用Redis mgr = socketio.RedisManager('redis://') sio = socketio.Server(client_manager=mgr) 使用RabbitMQ pip install kombu mgr = .原创 2021-12-08 21:19:06 · 163 阅读 · 0 评论 -
黑马头条项目 9.4头条聊天服务实现+使用firecamp.app进行测试
头条聊天服务实现在toutiao-backend/im目录中创建server.pyimport socketio# 创建sio对象sio = socketio.Server(async_mode='eventlet')app = socketio.Middleware(sio)在toutiao-backend/im目录中创建im服务启动程序main.py运行方式python main.py [端口],如python main.py 8000import eventlete原创 2021-12-08 15:17:36 · 176 阅读 · 0 评论 -
黑马头条项目 9.3 Socket.IO
头条项目不再使用原生的Websocket 二是使用封装后的一个工具Socket.IO1 简介Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,..原创 2021-12-08 09:40:42 · 138 阅读 · 0 评论 -
黑马头条项目 9.2 WebSocket
WebSocketHTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。在2008年诞生,2011年成为国际标准。现在基本所有浏览器都已经支持了。WebSocket是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连接后传输一次握手数据),两者之间就直接可以创建持久性的连接,并进行双向数据传输。Websocket使用ws.原创 2021-12-08 09:37:44 · 233 阅读 · 0 评论 -
黑马头条项目 9.1.2 在线推送技术说明
hettp的方式 1.0 和1.1 版本:客户向服务器发送了 http请求后 与服务器建立了tcp连接,会断开。keepalive只是声明,表明使用长连接,但是通讯双方都有权断开。可以结合 轮询的方式访问服务器,1.轮询 5 s发送一次请求 询问是否有数据 有点 比较通用2.comet 长连接 发起一次请求后 服务器如果没有数据,不做响应,当有了数据,服务器返回 响应数据,客户端立即发送下一次请求。以上服务器都是被动的请求。3...原创 2021-12-08 09:22:16 · 1373 阅读 · 0 评论 -
黑马头条项目 9.1即时通讯简介
即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。类型:在线push 适用:web页面 和 App 自己构建IM服务器 使用WebSocket 采用成熟的框架方案Socket.IO 对于App还可自己封装socket 使用第三方IM服务商提供的服务 离线push 适用:App 对于iOS,使用APNs 对于andorid,使用FCM(国外)或第三方IM服务商提供的服务 提供第三方IM服务的服务商有:网易云信原创 2021-12-08 09:07:55 · 147 阅读 · 0 评论 -
黑马头条项目 8.7头条首页新闻推荐接口编写+测试
在toutiao-backend/toutiao/resources/news/article.py中编写from rpc import reco_pb2, reco_pb2_grpcclass ArticleListResource(Resource): """ 获取推荐文章列表数据 """ def _feed_articles(self, channel_id, timestamp, feed_count): """ 获取推荐文章原创 2021-12-08 09:03:35 · 1727 阅读 · 0 评论 -
黑马头条项目 8.6.2 Pycharm中安装扩展使.proto文件关键字有高亮显示
1.安装扩展file-->setting-->PluginsmarketPlace 栏搜索Protobuf安装之后 proto文件关键字高亮显示原创 2021-12-07 22:53:01 · 204 阅读 · 0 评论 -
黑马头条项目 8.6 编写客户端
在toutiao-backend/common/rpc目录下新建client.pyimport grpcimport reco_pb2import reco_pb2_grpcimport timedef feed_articles(stub): # 构建rpc调用的调用参数 user_request = reco_pb2.UserRequest() user_request.user_id = '1' user_request.channel_id = 1原创 2021-12-07 22:37:01 · 315 阅读 · 0 评论 -
黑马头条项目 8.5 补全服务端
补全服务端为了方便看到效果,我们编写补全服务端代码。注意:此处实际推荐的代码在后续推荐系统课程中会涉及到在toutiao-backend/common/rpc目录下新建server.py文件import reco_pb2_grpcimport reco_pb2import timeimport grpcfrom concurrent.futures import ThreadPoolExecutor# 首先补全被调用的函数代码class UserRecommendServic原创 2021-12-07 22:35:33 · 1995 阅读 · 0 评论 -
黑马头条项目 8.4 推荐系统接口定义
推荐系统接口定义接口原型接口名称: user_recommend调用参数:UserRequest: user_id # 用户id channel_id # 频道id article_num # 推荐的文章数量 time_stamp # 推荐的时间戳返回数据:ArticleResponse: expousre # 曝光埋点数据 time_stamp # 推荐的时间戳...原创 2021-12-07 22:34:11 · 482 阅读 · 0 评论 -
黑马头条项目 8.2.2使用Protobuf 定义推荐接口
原创 2021-12-07 21:18:38 · 326 阅读 · 0 评论 -
黑马头条项目 7.4日志模块讲解
Python本身就自带一个logging标准模块。一般我们使用日志器可使用这样的方式去启动的一个。from logging import getLoggerlogger=getLogger()处理器指定了可以将日志写道那个文件中 /home/python/logs格式化工具:我们在使用user缓存的时候记录的日志current_app.logger 就是名字为“flask.app”的日志对象...原创 2021-12-07 20:16:16 · 706 阅读 · 0 评论 -
黑马头条项目 - 7.3 定时修正统计数据第二种实现
我们的思路:是创建flask app对象的时候直接把后台任务调度器创建好在工厂函数(创建flask app对象的函数)from apscheduler.schedulers.background import BackgroundSchedulerfrom apscheduler.executors.pool import ThreadPoolExecutor # 创建APScheduler定时任务对象 # 指定执行器的线程方式 executers={原创 2021-12-07 17:42:42 · 88 阅读 · 0 评论 -
黑马头条项目 - 8.3 Protocol Buffers
Protocol BuffersProtocol Buffers 是一种与语言无关,平台无关的可扩展机制,用于序列化结构化数据。使用Protocol Buffers 可以一次定义结构化的数据,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。现在有许多框架等在使用Protocol Buffers。gRPC也是基于Protocol Buffers。 Protocol Buffers 目前有2和3两个版本号。在gRPC中推荐使用proto3版本。1 文档结构1原创 2021-12-07 16:23:10 · 108 阅读 · 0 评论 -
黑马头条项目 - 8.2 gRPC
简介 gRPC是由Google公司开源的高性能RPC框架。 gRPC支持多语言 gRPC原生使用C、Java、Go进行了三种实现,而C语言实现的版本进行封装后又支持C++、C#、Node、ObjC、 Python、Ruby、PHP等开发语言 gRPC支持多平台 支持的平台包括:Linux、Android、iOS、MacOS、Windows gRPC的消息协议使用Google自家开源的Protocol Buffers协议机制(proto3) 序列化 gRP原创 2021-12-07 16:12:18 · 133 阅读 · 0 评论 -
黑马头条项目 - 8.1 RPC简介
RPC简介1. 什么是RPC远程过程调用(英语:Remote Procedure Call,缩写为RPC,也叫远程程序调用)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。2. 背景与用途在单台计算机中,我们可以通过程序调用来传递控制和数据;或者说通过程序调用,我们可以将多个程序组成一个整体来实现某个功能。如果将这种调用机制推广到多台.原创 2021-10-18 09:32:35 · 180 阅读 · 0 评论 -
黑马头条项目 - 7.2 定时修正统计数据(flask上下文环境启动APScheduler+导包路径解释)
在toutiao-backend/toutiao/__init__.py中添加APScheduler调度器对象from apscheduler.schedulers.background import BackgroundSchedulerfrom apscheduler.executors.pool import ThreadPoolExecutordef create_app(config, enable_config_file=False): ... # 添加定时任务AP原创 2021-10-14 16:24:24 · 163 阅读 · 0 评论 -
黑马头条项目 - 7.1 APScheduler使用
APScheduler使用APScheduler (advanceded python scheduler)是一款Python开发的定时任务工具。文档地址User guide — APScheduler 3.8.0.post1 documentation特点: 不依赖于Linux系统的crontab系统定时,独立运行 可以动态添加新的定时任务,如 下单后30分钟内必须支付,否则取消订单,就可以借助此工具(每下一单就要添加此订单的定时任务) 对添加的定时任务可以做持.原创 2021-10-14 15:41:57 · 205 阅读 · 0 评论 -
黑马头条项目 - 6.8 项目Redis持久存储实现
项目Redis持久存储实现common/cache/statistic.pyfrom flask import current_appfrom redis.exceptions import ConnectionErrorclass CountStorageBase(object): """ 统计数据存储父类 """ key = '' @classmethod def get(cls, user_id): """原创 2021-10-14 15:40:41 · 120 阅读 · 0 评论 -
黑马头条项目 - 6.5缓存问题(缓存穿透 缓存雪崩)
缓存问题1 缓存穿透缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了。如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间所有请求的压力都落在了数据库上,这样会导致数据库连接异常。解决方案:约定:对于返回为NULL的依然缓存,对于抛出异常的返回不进行缓存,注意不要把抛异常的也给缓存了。采用这种手段的会增加我们缓存的维护成本,需要在插入缓存的时候删除这个空缓存,当然我们可以通过设置较短的超时时间来解决这个问题。.原创 2021-10-14 10:39:56 · 135 阅读 · 0 评论 -
黑马头条项目 - 6.7 头条项目缓存实现+缓存测试
以用户信息数据缓存为例common/cache/user.pyfrom flask import current_appfrom redis.exceptions import RedisErrorimport jsonfrom sqlalchemy.orm import load_onlyfrom models.user import Userfrom . import constantsclass UserProfileCache(object): """ 用原创 2021-10-14 15:39:30 · 72 阅读 · 0 评论 -
黑马头条项目 - 6.6头条项目缓存与存储设计
头条项目缓存与存储设计缓存设计1 User Cache用户资料key 类型 说明 举例 user:{user_id}:profile string user_id用户的数据缓存,包括手机号、用户名、头像 用户扩展资料key 类型 说明 举例 user:{user_id}:profilex string user_id用户的性别 生日 用户状态key 类型 说明 举例 user:{user原创 2021-10-14 10:41:04 · 120 阅读 · 0 评论 -
黑马头条项目 - 6.4缓存模式
缓存模式1) Cache Aside更新方式 先更新数据库,再更新缓存。这种做法最大的问题就是两个并发的写操作导致脏数据。如下图(以Redis和Mysql为例),两个并发更新操作,数据库先更新的反而后更新缓存,数据库后更新的反而先更新缓存。这样就会造成数据库和缓存中的数据不一致,应用程序中读取的都是脏数据。 先删除缓存,再更新数据库。这个逻辑是错误的,因为两个并发的读和写操作导致脏数据。如下图(以Redis和Mysql为例)。假设更新操作先删除了缓存,此时正好..原创 2021-10-14 10:16:20 · 86 阅读 · 0 评论 -
黑马头条项目 - 6.3缓存有效期与淘汰策略
缓存有效期与淘汰策略有效期 TTL (Time to live)设置有效期的作用:节省空间 做到数据弱一致性,有效期失效后,可以保证数据的一致性Redis的过期策略过期策略通常有以下三种: 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 setex('a', 300, 'aval') setex('b', 600原创 2021-10-14 09:42:39 · 67 阅读 · 0 评论 -
黑马头条项目 - 6.2 缓存数据
缓存数据缓存数据的类型在设计缓存的数据时,可以缓存以下类型的数据 一个数值 例如 验证码 用户状态 如:user:{user_id}: enable 数据库记录, Caching at the object level 以数据库对象的角度考虑, 应用更普遍 例如, 用户的基本信息 user = User.query.filter_by(id=1).first()user -> User对象{ 'user_id'原创 2021-10-14 09:26:45 · 78 阅读 · 0 评论 -
黑马头条项目 - 6.1缓存架构
缓存架构脑中的直观反应计算机体系结构中的缓存多级缓存头条项目的方案SQLAlchemy起到一定的本地缓存作用 在同一请求中多次相同的查询只查询数据库一次,SQLAlchemy做了本地缓存(类似Django中的Queryset查询结果集) 使用Redis构建一层缓存......原创 2021-10-14 09:19:09 · 73 阅读 · 0 评论