1 如何提高項目並發量
# 1 web,app,微信小程序
# 2 web項目
-前端:
-用cdn,靜態資源,放到cdn上(js,css,靜態圖片)
-用精靈圖(一個大圖,上面又很多小圖,用定位,定位到小圖)
-前端緩存(響應頭設置緩存時間)cache-control (django如何向響應頭寫鍵值對:響應對象["aaa"]="aaa")
-nginx:
-nginx做集群(dns解析,負載均衡硬件 f5)
-動靜分離(靜態資源直接通過nginx轉發,拿去;uwsgi只負責處理動態請求)
-負載均衡(nginx的配置)
-集群化部署
-拆服務(把項目做成分布式)
-使用uwsgi(c寫的wsgi服務器)部署,使用gunicorn(python寫的wsgi服務器)部署
-代碼層面:
-緩存(redis)--》本來一個請求,要查5個表,耗時3s---》json格式--》放到緩存中--》下次再發請求,直接去緩存查---》0.001秒就返回了-----》(存在問題:緩存擊穿,緩存穿透,緩存雪崩 雙寫一致性問題)
-頁面靜態化(不適用於app和小程序),提前生成一個首頁頁面(被訪問頻繁的頁面)
-/index--->(查數據庫(用了緩存)---》dtl渲染頁面)--》提前生成出index.hmtl---》django模板渲染
-數據不一致(當有數據增加,再重新生成一次這個頁面),同步?異步?
-用異步:用celery,django的信號(異步操作),當對象保存時,重新生成靜態頁面
-異步操作(celery),一個請求需要耗時3s,設計成異步--請來了--》直接返回(任務已提交,請求正在處理)
-小米秒殺:您正在排隊(前端設置了定時,每隔5s,發送一個請求,查是否秒殺成功)
-保存視頻,發送郵件,保存文章,
-后台管理,統計最近三,五,半年,個月的訂單量--》折線圖,餅狀圖展示
-消息隊列:rabbitmq,kafka。。。異步,解耦
-請求打到數據庫了(只要打到數據庫,性能就下來了)
-優化sql,外鍵盡量不建立,適當建索引
-讀寫分離,數據庫集群,分庫分表
-優化代碼,多線程處理,盡量不在for循環里查數據庫
-換框架(異步框架),換語言
--最本質的一句,代碼優化不了了,壘機器
django的cache如何實現的?
-配置,緩存到文件,redis,mysql
-可以緩存對象(set了對象,pickle序列化成二進制,存到了redis中)
-cache.set()
-cache.get()
# ================================django模板修改的視圖函數
# from django.template import Template,Context
# now=datetime.datetime.now()
# t=Template('<html><body>現在時刻是:<h1>{{current_date}}</h1></body></html>')
# #t=get_template('current_datetime.html')
# c=Context({'current_date':str(now)})
# html=t.render(c)
#
# return HttpResponse(html)
render('index.html',{'key':'value'})
2 Elasticsearch介紹
# 1 產生背景:大規模數據如何檢索,數據安全(單點故障),備份,檢索速度
# 2 Elasticsearch介紹
-是一個基於Lucene的分布式搜索和分析引擎,全文檢索引擎
-Elasticsearch使用Java開發
-但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,使得全文檢索變得簡單
# 3 Lucene與Elasticsearch關系
-Lucene只是java一個庫----》只能java來使用
-python中集合--》只能python來用--》java,go用不了,其它語言想用,怎么做?
-做成服務---》django搭建一個服務---》對外通過restful接口 ---> get /key post /key=value
-基於Lucene封裝 ,做成服務,通過restful來調用,使用全文檢索
# 4 Elasticsearch vs solr
-solr 也是一個全文檢索引擎
-跟es關系就像是mysql和oracle的關系
-傳統搜索用solr多,es新興互聯網用的多
# 5 es核心概念
-集群:多台服務器的集合,稱為es的集群
-節點:集群的每個服務器稱為節點
-分片:10g的數據(一個表中),對10g數據分片,分成2g,3g,5g,把這些數據,分別放在不同的節點上
-副本:為提高查詢吞吐量或實現高可用性,可以使用分片副本
-全文檢索:分詞,全文檢索---》可以根據關鍵字搜索
# 6 es跟mysql比較
mysql es
數據庫 索引(index)
表 類型(type)
一條一條數據 文檔(document)
一列一列(字段) 字段(field)(name,age)
字段屬性(主鍵,類型,索引) 映射(mapping)
索引 所有字段建索引(倒排索引)、
增刪查改 get、post、delete。。。
# 7 ELK是什么?
-ELK=elasticsearch+Logstash+kibana
-日志的收集和分析系統
# 8 Elasticsearch特點和優勢
-筆記看一下即可
# 9 為什么使用es?
-13年初,GitHub拋棄了Solr,采取ElasticSearch 來做PB級的搜索
-我們用在什么地方?
-我們項目如果有搜索功能,都可以用
-日志存儲分析
-大數據量的存儲和檢索
# 10 Elasticsearch索引到底能處理多大數據
-es一個索引(數據庫)可以有多個分片,一個分片是一個lucene的索引
-lucene一個索引不能處理多於21億篇文檔,或者多於2740億的唯一詞條
-理論上是可以無限加的
在線教育---》用戶去瀏覽---》瀏覽記錄---》停留時間---》存到日志---》日志分析的系統---》Linux感興趣---》定向推薦----》linux課程上新了,打折了,短信推送,微信推送,都行
日志記錄,收集
3 Elasticsearch安裝配置
# 1 基於java開發的,安裝jdk,windows上安裝(jdk 1.8 以上),一路下一步(jdk,jre),(不需要配置環境變量了)
-java -version
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
# 2 安裝es(去官網下載相應的版本,es+kiban. 注意版本一定要對應)
-版本問題:2 5版本 6版本 7版本 7.6.2版本最新(講課用7版本),公司可能會用6或者6之前的版本
-haystack:不支持es,6以上版本,django上做全文檢索的框架(對接es,對接solr,對接whoosh)
-whoosh-純Python的全文搜索庫,Whoosh是索引文本及搜索文本的類和函數庫。它能讓你開發出一個個性化的經典搜索引擎
-6以后,不允許一個索引下建多個type(類型)---》一個數據庫只能有一個表
# 3 解壓到指定目錄(隨便,不要有空格,中文 c://soft )
# 4 啟動es
-到es的bin路徑下,elasticsearch.bat
-Kibana 就是es的客戶端(官方提供,相當於Navicat)
-Elasticsearch-head 就是es的客戶端(第三方的,相當於Navicat)
# 5 啟動kibana
-修改kibana配置文件
server.port: 5601
server.host: "127.0.0.1"
server.name: alen
elasticsearch.hosts: ["http://localhost:9200/"]
-配置跨域(改es的配置)
-elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
-到kibana的bin路徑下,kibana.bat 啟動
# 6 啟動Elasticsearch-head(第三方用node 寫的一個es客戶端)
-node 環境要裝好
-下載:https://github.com/mobz/elasticsearch-head
-解壓
-執行
npm install
npm run start
http://localhost:9100/
# kibana:官方提供的es客戶端,主要用來做增刪查改,有提示(postman,Elasticsearch-head)
# Elasticsearch-head :看集群的狀態,索引的狀態
# 你在工作中碰到的問題和如何解決的?
-django+haystack+whoosh
-換成es,性能更高
-項目里加全文檢索,django---》haystack---》es版本必須6一下
-django+es原生操作---》實現了全文檢索