Redis和elasticsearch


redis

-----------NOSQL的對比和劣和應用場景參考好文 http://www.redis.cn/articles/20181020003.html ---------

-----------REDIS架構好文章 https://www.cnblogs.com/mrhelloworld/p/redis-architecture.html----------------

簡介

redis是一款高性能的NOSQL系列的非關系型數據庫

支持的類型

1) 字符串類型 string
2) 哈希類型 hash
3) 列表類型 list
4) 集合類型 set
5) 有序集合類型 sortedset

應用場景

• 緩存(數據查詢、短連接、新聞內容、商品內容等等)
• 聊天室的在線好友列表
• 任務隊列。(秒殺、搶購、12306等等)
• 應用排行榜
• 網站訪問統計
• 數據過期處理(可以精確到毫秒
• 分布式集群架構中的session分離

持久化

 redis持久化機制:
1. RDB:默認方式,不需要進行配置,默認就使用這種機制
* 在一定的間隔時間中,檢測key的變化情況,然后持久化數據
1. 1編輯redis.windwos.conf文件
# 900秒(15分鍾)后,如果至少有一個鍵被改變持久化一次
save 900 1
#   after 300 sec (5 min) if at least 10 keys changed
save 300 10
#   after 60 sec if at least 10000 keys changed
save 60 10000

2. AOF:日志記錄的方式,可以記錄每一條命令的操作。可以每一次命令操作后,持久化數據
1. 1編輯redis.windwos.conf文件
appendonly no(關閉aof) --> appendonly yes (開啟aof)

# appendfsync always : 每一次操作都進行持久化
appendfsync everysec : 每隔一秒進行一次持久化
# appendfsync no : 不進行持久化

 緩存穿透、緩存擊穿、緩存雪崩

緩存穿透

緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不
斷發起請求,如發起為id 為“-1”的數據或id為特別大
不存在的數據。這時的用戶很可能是攻擊者,攻擊會導
致數據 庫壓力過大。
解決方案:
​ 1.接口層增加校驗,如用戶鑒權校驗,id做基礎校驗,|id<=0的直接攔截; ​ 
2.從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將key-value對寫為 key-0。這樣可以防止攻擊用戶反復用同一個id暴力攻擊
3. 使用緩存預熱緩存預熱就是將數據提前加入到緩存
中,當數據發生變更,再將最新的數據更新到緩 存

緩存擊穿

緩存擊穿是指緩存中沒有但數據庫中有的數據。這時由
於並發用戶特別多,同時讀 緩存沒讀到數據,又同時
去數據庫去取數據,引起數據庫壓力瞬間增大,造成過
大壓 力。
解決方案:
​ 1.設置熱點數據永遠不過期。
​ 2.緩存預熱 

緩存雪崩

 ​ 緩存雪崩是指緩存數據大批量到過期時間,而查詢數
據量巨大,引起數據庫壓力過 大甚至down機。和緩存
擊穿不同的是,緩存擊穿指並發查同一條數據,緩存雪
崩是不同 數據都過期了,很多數據都查不到從而查數
據庫。
解決方案:
​ 1.緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。 ​ 2.設置熱點數據永遠不過期。
​ 3.使用緩存預熱

MQ

消息中間件簡介

消息中間件(消息隊列)是分布式系統中重要的組件,
主要解決應用耦合,異步消 息,流量削鋒等問題實現
高性能,高可用,可伸縮和最終一致性[架構]   使用較
多的消息 隊列有ActiveMQ,RabbitMQ,ZeroMQ,
Kafka,MetaMQ,RocketMQ
以下介紹消息隊列在實際應用中常用的使用場景:異步
處理,應用解耦,流量削鋒和消 息通訊四個場景 

MQ簡介

AMQP :Advanced Message Queue,高級消息隊列
協議。它是應用層協議的一個開放 標准,為面向消息
的中間件設計,基於此協議的客戶端與消息中間件可傳
遞消息,並不 受產品、開發語言等條件的限制

主要概念 :

RabbitMQ Server: 也叫broker server,它是一種傳輸服務。 他的角色就是維護一條 從Producer到Consumer的路線,保證數據能夠按照指定的方式進行傳輸。
Producer: 消息生產者,如圖A、B、C,數據的發送方。消息生產者連接RabbitMQ服 務器然后將消息投遞到Exchange。
Consumer:消息消費者,如圖1、2、3,數據的接收方。消息消費者訂閱隊列, RabbitMQ將Queue中的消息發送到消息消費者。 Exchange:生產者將消息發送到Exchange(交換器),由Exchange將消息路由到一個 或多個Queue中(或者丟棄)。Exchange並不存儲消息。RabbitMQ中的Exchange有 direct、fanout、topic、headers四種類型,每種類型對應不同的路由規則。
Queue:(隊列)是RabbitMQ的內部對象,用於存儲消息。消息消費者就是通過訂閱 隊列來獲取消息的,RabbitMQ中的消息都只能存儲在Queue中,生產者生產消息並最終 投遞到Queue中,消費者可以從Queue中獲取消息並消費。多個消費者可以訂閱同一個 Queue,這時Queue中的消息會被平均分攤給多個消費者進行處理,而不是每個消費者 都收到所有的消息並處理。

RoutingKey:生產者在將消息發送給Exchange的時候,一般會指定一個routing key, 來指定這個消息的路由規則,而這個routing key需要與Exchange Type及binding key聯 合使用才能最終生效。在Exchange Type與binding key固定的情況下(在正常使用時一 般這些內容都是固定配置好的),我們的生產者就可以在發送消息給Exchange時,通過 指定routing key來決定消息流向哪里。RabbitMQ為routing key設定的長度限制為255 bytes。


Connection: (連接):Producer和Consumer都是通過TCP連接到RabbitMQ Server 的。以后我們可以看到,程序的起始處就是建立這個TCP連接。
Channels: (信道):它建立在上述的TCP連接中。數據流動都是在Channel中進行 的。也就是說,一般情況是程序起始建立TCP連接,第二步就是建立這個Channel。


VirtualHost:權限控制的基本單位,一個VirtualHost里面有若干Exchange和 MessageQueue,以及指定被哪些user使用 

RabbitMQ發送與接收消息

直接模式(Direct)

我們需要將消息發給唯一一個節點時使用這種模式,這是最簡單的一種形式。
任何發送到Direct Exchange的消息都會被轉發到RouteKey中指定的Queue。
1.一般情況可以使用rabbitMQ自帶的Exchange:”"(該Exchange的名字為空字符串,下 文稱其為default Exchange)。

2.這種模式下可以不需要將Exchange進行任何綁定(binding)操作

3.消息傳遞時需要一個“RouteKey”,可以簡單的理解為要發送到的隊列名字。

4.如果vhost中不存在RouteKey中指定的隊列名,則該消息會被拋棄。 

分裂模式

當我們需要將消息一次發給多個隊列時,需要使用這種模式
任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的所有 Queue上。

 1.這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個 Queue,一個Queue可以同多個Exchange進行綁定。
 2.這種模式不需要RouteKey(其實就是隊列名字)
 3.如果接受到消息的Exchange沒有與任何Queue綁定,則消息會被拋棄。 

搜索技術Elasticsearch 

簡介

ElasticSearch是一個基於Lucene的搜索服務器。它提
供了一個分布式多用戶能力的 全文搜索引擎,基於RES
Tful web接口。Elasticsearch是用Java開發的,並作
為Apache 許可條款下的開放源碼發布,是當前流行的
企業級搜索引擎。設計用於雲計算中,能夠 達到實時
搜索,穩定,可靠,快速,安裝使用方便。 

 

IK分詞是一款國人開發的相對簡單的中文分詞器。雖然
開發者自2012年之后就不在維護 了,但在工程應用中I
K算是比較流行的一款

創建索引與映射字段 

類型名稱:就是前面將的type的概念,類似
於數據庫中的不同表  字段名:任意填寫 ,可以指定許多屬性,例如:
 type:類型,可以是text、long、short、date、integer、object等 
index:是否索引,默認為true 
store:是否單獨存儲,默認為false  ,一般內容比較多的字段設置成true,可提 升查詢性能 
analyzer:分詞器

創建索引 和 映射

// 請求方式 /索引名稱
PUT /.....
//創建索引--------------------------------
{
  // 索引設置,並設置主分片和副本分片個數
  "settings": {
    "index": {
      "number_of_shards": "16",
      "number_of_replicas": "0"
    }
  },
//put  localhost:9200/...
  //創建 映射,--------------------------------
  "mappings": {
    "article": { //映射類型(自己定義)
      "properties": {
        "id": { //文章的編號
            "type": "long", //相當於數據的字段類型              
            "store": true,    .//是否存儲       
          "index":"not_analyzed" // }, "title": {//文章的題目  "type": "text",       
            "store": true,       
           "index":"analyzed",           
         "analyzer":"standard"  }, "content":{ //文章內容
 "type": "text",           
           "store": true,       
          "index":"analyzed",         
          "analyzer":"standard" 
} } } } }

創建文檔document  向映射添加數據 

POST localhost:9200/....

    "id":1, 

    "title":"ElasticSearch是一個基於Lucene的搜索服務器", 

    "content":"它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java 開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時 搜索,穩定,可靠,快速,安裝使用方便。"    

  }



索引刪除

DELETE localhost:9200/索引名字

刪除document

DELETE  localhost:9200/索引名字/索引類型/document的id

查詢文檔-querystring查詢

 POST localhost:9200/索引名/類型/_search
 //根據文章的標題 搜索"
搜索服務器"的關鍵字 {
   "query": {           "query_string": {             "default_field": "title", //document的某個屬性(此處是按照文章的標題搜索,也可以是文章的內容content
"query": "搜索服務器" //搜索的關鍵字
       }      } 
}

 使用IK 分詞器

在創建索引映射的時候進行設置

       IK提供了兩個分詞算法

             ik_smart 和 ik_max_word 其中 ik_smart 為最少切分,

             ik_max_word為最細粒度划分

"analyzer":"ik_max_word"  //設置

過濾查詢(java代碼方式)

//1.封裝查詢請求...................................................................................................
SearchRequest searchRequest=new SearchRequest("sku1");
searchRequest.types("doc"); //設置查詢的類型
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//布爾查詢構建器

//1.1關鍵字搜索
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", searchMap.get("keywords"));
boolQueryBuilder.must(matchQueryBuilder);

高亮

GET /sku/doc/_search 
{"query":{ 
  "match":{ 
"name":"手機"}
},
"highlight":{
  "fields":{
"name":{
  "pre_tags":"<font style='color:red'>", "post_tags":"</font>"

}

  } 

}, 
"size":2 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM