# 1 web,app,微信小程序 # 2 web項目 -前端: -用cdn,靜態資源,放到cdn上(js,css,靜態圖片) -用精靈圖(一個大圖,上面又很多小圖,用定位,定位到小圖) -前端緩存(響應頭設置緩存時間)cache-control (django如何向響應頭寫鍵值對:響應對象["aaa"]="aaa") -nginx: -nginx做集群(dns解析,負載均衡硬件 f5)# dns解析到不同的nginx集群上(百度各地ip不同) 負載均衡硬件f5也能抗並發量,轉到不同的nginx集群中(硬件層面實現) -動靜分離(靜態資源直接通過nginx轉發,拿取;uwsgi只負責處理動態請求) -負載均衡(nginx的配置) -集群化部署 -拆服務(把項目做成分布式) -使用uwsgi(c寫的wsgi服務器)部署,使用gunicorn(python寫的wsgi服務器)部署 -代碼層面: -緩存(redis)--》本來一個請求,要查5個表,耗時3s---》json格式--》放到緩存中--》下次再發請求,直接去緩存查---》0.001秒就返回了-----》(存在問題:緩存擊穿,緩存穿透,緩存雪崩 雙寫一致性問題) -頁面靜態化(不適用於app和小程序),提前生成一個首頁頁面(被訪問頻繁的頁面) # 下方代碼示例 -/index--->(查數據庫(用了緩存)---》dtl渲染頁面)--》提前生成出index.hmtl---》django模板渲染 -數據不一致(當有數據增加,再重新生成一次這個頁面),同步?異步? -用異步:用celery,django的信號(異步操作),當對象保存時,重新生成靜態頁面(celery有返回值,信號無返回值) -異步操作(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) # 生成字符串(完整的html頁面),可以存入html格式文件 # # return HttpResponse(html) render('index.html',{'key':'value'}) # 此行用於回憶
# 1 產生背景:大規模數據如何檢索,數據安全(單點故障),備份,檢索速度 # mysql如果是innodb引擎在千萬級數據量,速度直線下降 # 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 -日志的收集和分析系統 # Logstash日志搬運工,收集日志存到es中,kibana前端展示 # 8 Elasticsearch特點和優勢 -筆記看一下即可 1)分布式實時文件存儲,可將每一個字段存入索引,使其可以被檢索到。 2)實時分析的分布式搜索引擎。 分布式:索引分拆成多個分片,每個分片可有零個或多個副本。集群中的每個數據節點都可承載一個或多個分片,並且協調和處理各種操作; 負載再平衡和路由在大多數情況下自動完成。 3)可以擴展到上百台服務器,處理PB級別的結構化或非結構化數據。也可以運行在單台PC上(已測試) 4)支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件等 # 9 為什么使用es? -13年初,GitHub拋棄了Solr,采取ElasticSearch 來做PB級的搜索 -我們用在什么地方? -我們項目如果有搜索功能,都可以用 -日志存儲分析 -大數據量的存儲和檢索 ** 應用場景:** 1)新系統開發嘗試使用ES作為存儲和檢索服務器; 2)現有系統升級需要支持全文檢索服務,需要使用ES # 10 Elasticsearch索引到底能處理多大數據 -es一個索引(數據庫)可以有多個分片,一個分片是一個lucene的索引 -lucene一個索引不能處理多於21億篇文檔,或者多於2740億的唯一詞條 -理論上是可以無限加的 在線教育---》用戶去瀏覽---》瀏覽記錄---》停留時間(前端傳給后端)---》存到日志---》日志分析的系統---》Linux感興趣---》定向推薦----》linux課程上新了,打折了,短信推送,微信推送,都行 日志記錄,收集
Elasticsearch-head連接如下
# 1 基於java開發的,安裝jdk,windows上安裝(jdk 1.8 以上),一路下一步(jdk,jre),(不需要配置環境變量了) #jre java運行環境 # jdk java開發 cmd下輸入 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. 注意版本一定要對應一致) # 此次我下載:elasticsearch-7.5.0-windows-x86_64.zip kibana-7.5.0-windows-x86_64.zip -版本問題:2 5版本 6版本 7版本 7.6.2版本最新(講課用7版本),公司可能會用6或者6之前的版本 -haystack:不支持es,6以上版本,django上做全文檢索的框架(對接es,對接solr,對接whoosh) # django開源搜索框架 -whoosh-純Python的全文搜索庫,Whoosh是索引文本及搜索文本的類和函數庫。它能讓你開發出一個個性化的經典搜索引擎 -6以后,不允許一個索引下建多個type(類型)---》一個數據庫只能有一個表 #6兼容,7只能有一表 # 3 解壓到指定目錄(隨便,不要有空格,中文 c://soft ) # 4 啟動es (如果在c盤,注意權限問題,可能kibana等工具無法刪除文件等操作,放d盤保險) # 索引數據路徑:..\elasticsearch-7.5.0\data\nodes\0 (單機配置) -cmd到es的bin路徑下,輸入elasticsearch.bat # 看到publish_address {127.0.0.1:9200}監聽地址,已啟動 瀏覽器輸入http://127.0.0.1:9200/ 可看到版本等信息如下 { "name" : "LAPTOP-41G9JFOT", "cluster_name" : "elasticsearch", "cluster_uuid" : "SpkA_Se6TuyqMw9iT_m3wQ", "version" : { "number" : "7.5.0", "build_flavor" : "default", "build_type" : "zip", "build_hash" : "e9ccaed468e2fac2275a3761849cbee64b39519f", "build_date" : "2019-11-26T01:06:52.518245Z", "build_snapshot" : false, "lucene_version" : "8.3.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } -Kibana 就是es的客戶端(官方提供,相當於Navicat) -Elasticsearch-head 就是es的客戶端(第三方的,相當於Navicat)#比Kibana好用 # 5 啟動kibana -修改kibana配置文件 ..\kibana-7.5.0-windows-x86_64\config\kibana.yml #里面最下面加入這4句話(頂格,去注釋) server.port: 5601 # kibana監聽端口號 server.host: "127.0.0.1" # kibana監聽地址 server.name: lqz # 名字隨便起 elasticsearch.hosts: ["http://localhost:9200/"] # 讓kibana連到es上 -配置跨域(改es的配置) # 因為端口不一樣 修改完配置,重啟es -elasticsearch.yml ..\elasticsearch-7.5.0\config\elasticsearch.yml #最下面加入 http.cors.enabled: true # 允許跨域 http.cors.allow-origin: "*" # 允許的域,任意客戶端來訪問 -cmd到kibana的bin路徑下,輸入kibana.bat 啟動 # 得到http server running at http://127.0.0.1:5601 瀏覽器訪問 # 6 啟動Elasticsearch-head(第三方用node 寫的一個es客戶端) -node 環境要裝好 -下載:https://github.com/mobz/elasticsearch-head -解壓 -執行 (進入Elasticsearch-head文件夾,cmd下運行下方2行代碼) npm install # 裝依賴 npm run start # 啟動 返回http://localhost:9100 http://localhost:9100/ # 輸入瀏覽器 # kibana:官方提供的es客戶端,主要用來做增刪查改,有提示(postman,Elasticsearch-head) # Elasticsearch-head :看集群的狀態,索引的狀態 # 你在工作中碰到的問題和如何解決的? -django+haystack+whoosh 實現全文檢索 -換成es,性能更高 目標 -項目里加全文檢索,django---》haystack---》es版本必須6以下 問題 -django+es原生操作---》實現了全文檢索 # 原生操作也就是http請求