6.面试题--redis、rabbitmq、es
六、Redis部分
1.0講一下你理解的Redis,為什么Redis很快
Redis是一種高性能的,開(kāi)源的,C語(yǔ)言編寫(xiě)的非關(guān)系型數(shù)據(jù)庫(kù),可以對(duì)關(guān)系型數(shù)據(jù)庫(kù)起到補(bǔ)充作用,同時(shí)支持持久化,可以將數(shù)據(jù)同步保存到磁盤(pán)
說(shuō)Redis很快是相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)如mysql來(lái)說(shuō)的,主要有以下因素
第一,數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,所以速度快
第二,直接在內(nèi)存中讀寫(xiě)數(shù)據(jù),所以速度快
第三,采用多路IO復(fù)用模型,減少網(wǎng)絡(luò)IO的時(shí)間消耗,避免大量的無(wú)用操作,所以速度快
第四,單線程避免了線程切換和上下文切換產(chǎn)生的消耗,所以速度快
1.1你常用的Redis的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)有哪些,他們的使用場(chǎng)景分別是什么
Redis存儲(chǔ)的是key-value結(jié)構(gòu)的數(shù)據(jù),其中key是字符串類(lèi)型,value有5種常用的數(shù)據(jù)類(lèi)型:字符串string、哈希hash、列表 list、集合 set、有序集合 sorted set
String可以用作緩存,計(jì)數(shù)器,防攻擊,驗(yàn)證碼、登錄過(guò)期等,List可以用來(lái)做隊(duì)列,秒殺等,Set可以用來(lái)去重
1.3Redis每種存儲(chǔ)結(jié)構(gòu)的簡(jiǎn)單命令
1.String
set key value 設(shè)置指定key的值**,**key相同的情況下,后設(shè)置的值覆蓋前設(shè)置的值
get key 獲取指定key的值**
setex key seconds value 設(shè)置指定key的值,并將key的過(guò)期時(shí)間設(shè)為seconds秒**
setnx key value 只有在key不存在時(shí)設(shè)置key的值****
2.hash
*●hset key field value將哈希表key中的字段field的值設(shè)為value*
*●hget key field 獲取存儲(chǔ)在哈希表中指定字段的值*
*●hdel key field 刪除存儲(chǔ)在哈希表中的指定字段*
*●hkeys key 獲取哈希表中所有字段*
*●hvals key 獲取哈希表中,所有值*
*●hgetall key 獲取在哈希表中指定key的所有字段和值*
*hset 001 name zhangsan ,hset 001 age 20,hset 001 city beijing*
*hget 001 name 結(jié)果zhangsan*
*hdel 001 age 刪除age字段*
*hkeys 001 結(jié)果 name city*
*hvals 001 結(jié)果zhangsan beijing*
*hgetall 001 結(jié)果 name zhangsan city beijing*
3.List
*●lpush key value1 [value2] 將一個(gè)或多個(gè)值插入到列表頭部*
*●lrange key start stop 獲取列表指定范圍內(nèi)的元素*
*●rpop key 移除并獲取列表最后一個(gè)元素*
*●llen key 獲取列表長(zhǎng)度*
*●brpop key1 [key2 ] timeout 移出并獲取列表的最后一個(gè)元素,如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止*
*lpush list a b c d 在列表中插入多個(gè)值*
*lrange list 0 -1,獲取列表中的元素,從0開(kāi)始到結(jié)束。結(jié)果一次輸出 d c b a*
*rpop list 結(jié)果為a*
*llen list 結(jié)果為3*
*brpop list 10 結(jié)果為b ,brpop list 10 結(jié)果為 c,brpop list 10 結(jié)果為d,brpop list 10 列表中沒(méi)有元素,阻塞等待10s后結(jié)束。*
4.Set
*●sadd key member1 [member2] 向集合添加一個(gè)或多個(gè)成員*
*●smembers key 返回集合中的所有成員,*
*●scard key 獲取集合的成員數(shù)*
*●sinter key1 [key2] 返回給定所有集合的交集*
*●sunion key1 [key2] 返回所有給定集合的并集*
*●sdiff key1 [key2] 返回給定所有集合的差集*
*●srem key member1 [member2] 移除集合中一個(gè)或多個(gè)成員*
*sadd set1 a b c d m n 向集合添加多個(gè)成員,*
*sadd set2 a b c d x y z*
*smembers set1 得到集合所有成員 b d a c m n*
*scard set1 結(jié)果為6*
*sinter set1 set2 返回給定集合的交集,結(jié)果為a b c d*
*sunion set1 set2 返回給定集合的并集,結(jié)果為a b c d m n x y z*
*sdiff set1 set2 返回給定集合的差集,結(jié)果為 m n*
*srem set1 m n 移除set1集合中的 m n 成員*
5.sorted set
zadd key score1 member1 [score2 member2] 向有序集合添加一一個(gè)或多個(gè)成員,或者更新已存在成員的
分?jǐn)?shù)
zrange key start stop [WITHSCORES] 通過(guò)索引區(qū)間返回有序集合中指定區(qū)間內(nèi)的成員
zincrby key increment member 有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量increment
zrem key member [member] 移除有序集合中的一個(gè)或多個(gè)成員
zadd zset 10. 0 a 9.0 c 6.0 d 8.0 e
zadd zset 12.0 a 后添加的a的分?jǐn)?shù)會(huì)覆蓋先添加的
zrange zset 0 -1 結(jié)果為 d e c a
zincrby zset 1.0 e,給zset集合中的e元素的分?jǐn)?shù)加一
zrem zset e c ,移除zset集合中的多個(gè)成員
通用命令
●keys pattern 查找所有符合給定模式( pattern)的key
●exists key 檢查給定key是否存在
●type key 返回key所儲(chǔ)存的值的類(lèi)型
●ttl key 返回給定key的剩余生存時(shí)間(TTL, time to live),以秒為單位
●del key 該命令用于在key存在是刪除key
1.4你們項(xiàng)目是怎么用Redis的
使用的是Springboot整合的redis,主要用來(lái)解決前后端分離后前后端會(huì)話問(wèn)題,以及驗(yàn)證碼的問(wèn)題
1.5怎么防止Redis宕機(jī)數(shù)據(jù)丟失問(wèn)題
通過(guò)對(duì)Redis持久化,把內(nèi)存中的數(shù)據(jù)和命令,保存一份到磁盤(pán)中做備份,當(dāng)Redis發(fā)生宕機(jī),重啟服務(wù)器的時(shí)候,會(huì)從磁盤(pán)重新加載備份的數(shù)據(jù),從而解決數(shù)據(jù)丟失問(wèn)題
1.6Redis持久化是什么?有幾種方式
將內(nèi)存中的數(shù)據(jù)備份到磁盤(pán)的過(guò)程,就叫作持久化
Redis持久化主要有兩種方式,RDB和AOF,可以通過(guò)修改redis.conf進(jìn)行配置
RDB是記錄數(shù)據(jù)快照,而AOF是記錄寫(xiě)命令的
1.7Redis有了AOF持久化為什么還要RDB?
AOF和RDB各有所長(zhǎng)
RDB是記錄數(shù)據(jù)快照,它的優(yōu)點(diǎn)是只產(chǎn)生一個(gè)持久化文件,體積相對(duì)較小,啟動(dòng)恢復(fù)速度快,備份方便,它的缺點(diǎn)是沒(méi)辦法做到數(shù)據(jù)百分百不丟失,因?yàn)樗敲扛粢欢〞r(shí)間保存一次
AOF是記錄寫(xiě)命令,它的優(yōu)點(diǎn)是格式清晰,容易理解,數(shù)據(jù)更安全,采用append模式即使持久化過(guò)程中宕機(jī),也不影響已經(jīng)保存的數(shù)據(jù),它的缺點(diǎn)是文件體積較大,恢復(fù)速度慢
根據(jù)實(shí)際需要來(lái)選擇,通常二者可以結(jié)合來(lái)使用
1.8Redis內(nèi)存不夠了怎么辦?
方式一:增加物理內(nèi)存
方式二:使用淘汰策略,刪掉一些老舊數(shù)據(jù)
方式三:集群
1.9你們Redis用在哪些業(yè)務(wù)上?用的什么存儲(chǔ)結(jié)構(gòu)
主要用做緩存,比如:驗(yàn)證碼,分類(lèi)緩存,數(shù)據(jù)字典緩存,權(quán)限數(shù)據(jù)緩存,登錄信息緩存等。
String類(lèi)型的存儲(chǔ)結(jié)構(gòu)用的比較多,并且使用了Json格式進(jìn)行序列化。
2.0淘汰策略有哪些?你們用的哪種
volatile-lru :從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中挑選將要過(guò)期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰
no-enviction:不使用淘汰
2.1Redis事務(wù)和Mysql事務(wù)的區(qū)別
Mysql的事務(wù)是基于日志,記錄修改數(shù)據(jù)前后的狀態(tài)來(lái)實(shí)現(xiàn)的,而Redis的事務(wù)是基于隊(duì)列實(shí)現(xiàn)的
Mysql中的事務(wù)滿(mǎn)足原子性:即一組操作要么同時(shí)成功,要么同時(shí)失敗,
Redis中的事務(wù)不滿(mǎn)足原子性,即一組操作中某些命令執(zhí)行失敗了,其他操作不會(huì)回滾
因此對(duì)于比較重要的數(shù)據(jù),應(yīng)該存放在mysql中
2.2緩存的執(zhí)行流程
1.客戶(hù)端發(fā)起查詢(xún)請(qǐng)求
2.判斷緩存中是否有數(shù)據(jù)
如果有,直接返回
如果沒(méi)有,就從數(shù)據(jù)庫(kù)查詢(xún),再把數(shù)據(jù)同步到緩存
3.返回?cái)?shù)據(jù)給客戶(hù)端
2.3你們?cè)趺幢WCRedis和Mysql的一致性
我們?cè)诖a中控制,如果數(shù)據(jù)庫(kù)做是寫(xiě)操作,直接把redis中的對(duì)應(yīng)數(shù)據(jù)刪除,下次查詢(xún)數(shù)據(jù)會(huì)重新寫(xiě)入緩存。
我們的業(yè)務(wù)對(duì)一致性要求不是很高,因此采用了先操作mysql,后刪除redis。在寫(xiě)數(shù)據(jù)庫(kù)和刪除緩存行代碼之間如果有查詢(xún)請(qǐng)求依然會(huì)查詢(xún)到Redis中的老數(shù)據(jù),但是這種情況非常極端,而且我們的業(yè)務(wù)也能容忍這種短暫的臟數(shù)據(jù)。
我還知道其他方案,比如延遲雙刪 , 監(jiān)聽(tīng)Mysql事務(wù)日志自動(dòng)同步Redis等。
2.4SpringCache常用注解
@EnableCaching:打在主啟動(dòng)類(lèi)上,開(kāi)啟緩存功能
@Cacheable:打在方法上,表示該方法會(huì)開(kāi)啟緩存,打在類(lèi)上,表示類(lèi)中所有的方法都開(kāi)啟緩存,方法的返回值會(huì)自動(dòng)寫(xiě)入緩存。如果緩存中已經(jīng)有數(shù)據(jù),方法將不會(huì)被調(diào)用,而是拿著緩存數(shù)據(jù)直接返回給客戶(hù)端。
@CacheEvict:搭載類(lèi)或者方法上,會(huì)將緩存清除
@CachePut:更新緩存
@Caching:組合操作,要應(yīng)用于方法的多個(gè)緩存操作
@CacheConfig:打在類(lèi)上,共享的一些常見(jiàn)緩存設(shè)置
2.5了解緩存擊穿,穿透,雪崩嗎?怎么處理?
緩存穿透:請(qǐng)求某個(gè)Key對(duì)應(yīng)的數(shù)據(jù)時(shí),在緩存中沒(méi)有命中數(shù)據(jù),在數(shù)據(jù)庫(kù)中也沒(méi)有命中數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)返回空,而Redis也不會(huì)緩存這個(gè)空結(jié)果,這就造成了緩存穿透的問(wèn)題。
解決方案:
一:就是把空對(duì)象緩存起來(lái)。當(dāng)?shù)谝淮螐臄?shù)據(jù)庫(kù)中查詢(xún)出來(lái)的結(jié)果為空時(shí),我們就將這個(gè)空對(duì)象加載到緩存,并設(shè)置合理的過(guò)期時(shí)間,這樣,就能夠在一定程度上保障后端數(shù)據(jù)庫(kù)的安全。
二:使用布隆過(guò)濾器來(lái)判斷數(shù)據(jù)庫(kù)中有沒(méi)有這個(gè)key。
緩存擊穿:緩存中沒(méi)有,數(shù)據(jù)庫(kù)中有的數(shù)據(jù),由于某種原因比如緩存過(guò)期了,同時(shí)并發(fā)用戶(hù)特別多,一時(shí)間都往數(shù)據(jù)庫(kù)中讀取數(shù)據(jù).
解決方案:加互斥鎖,只能允許一個(gè)線程訪問(wèn)數(shù)據(jù)庫(kù);設(shè)置熱點(diǎn)代碼永不過(guò)期。
緩存雪崩:緩存重啟,或者大量key失效,導(dǎo)致大量并發(fā)打到數(shù)據(jù)庫(kù)
解決方案:
緩存數(shù)據(jù)的過(guò)期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過(guò)期現(xiàn)象發(fā)生。
如果緩存數(shù)據(jù)庫(kù)是分布式部署,將熱點(diǎn)數(shù)據(jù)均勻分布在不同搞得緩存數(shù)據(jù)庫(kù)中。
設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過(guò)期。
2.6Redis的主從有什么優(yōu)點(diǎn),和缺點(diǎn)?
優(yōu)點(diǎn)是讀寫(xiě)分離,分擔(dān)了讀的壓力,同時(shí)能起到備份作用,防止數(shù)據(jù)丟失
缺點(diǎn)是不能分擔(dān)寫(xiě)的壓力,主的單點(diǎn)故障沒(méi)有解決,存儲(chǔ)沒(méi)有得到擴(kuò)容
2.7解釋一下Redis的哨兵模式。哨兵的不足?
當(dāng)主服務(wù)器中斷服務(wù)后,可以將一個(gè)從服務(wù)器升級(jí)為主服務(wù)器 ,以便繼續(xù)提供服務(wù)
哨兵就是用來(lái)監(jiān)控主從服務(wù)器,實(shí)現(xiàn)故障恢復(fù)功能的。它會(huì)不斷的檢查主服務(wù)器和從服務(wù)器的健康狀態(tài),當(dāng)某個(gè)服務(wù)器出現(xiàn)問(wèn)題時(shí),可以向管理員發(fā)起通知。如果主服務(wù)器不可用時(shí),會(huì)自動(dòng)選擇一個(gè)從服務(wù)器作為新的主服務(wù)器,并讓其他的從服務(wù)器從新的主服務(wù)器復(fù)制數(shù)據(jù)
哨兵也是主從模式,沒(méi)有解決寫(xiě)的壓力,只減輕了讀的壓力,而且存儲(chǔ)也得不到擴(kuò)容
2.8Redis如何模擬隊(duì)列和棧,用什么命令
list控制同一邊進(jìn),同一邊出就是棧;list控制一邊進(jìn),另一邊出就是隊(duì)列
2.9Redis存儲(chǔ)單個(gè)對(duì)象怎么存,存儲(chǔ)對(duì)象集合怎么存
單個(gè)對(duì)象可以使用String,也可以使用hash
集合對(duì)象可以使用hash,以便可以快速的通過(guò)field來(lái)取值
七、RabbitMQ
1.0RabbitMQ的使用場(chǎng)景
rabbitMQ消息隊(duì)列可以用來(lái)
做任務(wù)的異步處理,提高程序的相應(yīng)時(shí)間,
提高系統(tǒng)穩(wěn)定性,通過(guò)手動(dòng)確認(rèn)機(jī)制,當(dāng)消費(fèi)者出現(xiàn)故障,只要沒(méi)有確認(rèn)簽收,請(qǐng)求的數(shù)據(jù)都不會(huì)丟失可以再次處理
服務(wù)解耦,生產(chǎn)者通過(guò)MQ與消費(fèi)者交互
流量削峰,通過(guò)異步處理,消息傳到MQ直接返回,接著等待排隊(duì)處理,避免了線路擁堵
1.1RabbitMQ如何防止消息丟失
首先,RabbitMQ的消息確認(rèn)機(jī)制,默認(rèn)是自動(dòng)簽收,也就是說(shuō)消息一旦被消費(fèi)者接收,就自動(dòng)簽收,消息就從隊(duì)列里清除了。因此對(duì)于重要的消息,不容丟失的數(shù)據(jù),我們需要設(shè)置在消費(fèi)完成后手動(dòng)簽收。
其次,我們可以將消息持久化,避免消息在消費(fèi)前MQ宕機(jī),網(wǎng)絡(luò)問(wèn)題等造成的消息丟失
1.2RabbitMQ的交換機(jī)有哪幾種
Fanout:廣播,將消息交給所有綁定到交換機(jī)的隊(duì)列
Direct:定向,把消息交給符合指定routing key的隊(duì)列
Topic:通配符,把消息交給符合routing pattern的隊(duì)列
1.3消息是如何從發(fā)送者到達(dá)消費(fèi)者的(RabbitMQ工作流程)
分為消息發(fā)送和消息接收兩個(gè)步驟
消息發(fā)送:生產(chǎn)者和Broker建立TCP連接,創(chuàng)建信道。通過(guò)信道將消息發(fā)送給Broker,由Exchange將消息進(jìn)行轉(zhuǎn)發(fā)到指定的隊(duì)列
消息接收:消費(fèi)者和Broker建立TCP連接 ,創(chuàng)建信道 ,然后監(jiān)聽(tīng)指定的隊(duì)列,當(dāng)有消息到達(dá)隊(duì)列時(shí),Broker默認(rèn)將消息推送給消費(fèi)者,消費(fèi)者就能接收到消息
1.4如何防止消息重復(fù)消費(fèi)
重復(fù)消費(fèi),一般時(shí)由于消費(fèi)者消費(fèi)成功后,在給MQ確認(rèn)簽收的時(shí)候出現(xiàn)了網(wǎng)絡(luò)波動(dòng),MQ沒(méi)有接到確認(rèn),就會(huì)繼續(xù)給消費(fèi)者投遞之前的消息,造成消費(fèi)者接收到了兩條一樣的消息。
我們可以通過(guò)實(shí)現(xiàn)消息的冪等性來(lái)避免這種情況,比如說(shuō)讓生產(chǎn)者給每個(gè)消息攜帶一個(gè)唯一的id,消費(fèi)者獲取消息后根據(jù)這個(gè)id去查詢(xún)數(shù)據(jù)庫(kù),如果不存在就正常消費(fèi),如果存在了就證明該消息被消費(fèi)過(guò),直接丟棄
1.5RabbitMQ消息投遞失敗,怎么處理
我們可以設(shè)置confirm回調(diào)和 returned 回調(diào)
比如說(shuō),可以在發(fā)送消息的時(shí)候,把消息詳情包括交換機(jī)名,路由鍵,都保存到一個(gè)表中,狀態(tài)設(shè)置為發(fā)送中,如果在confirm方法中ack為false,代表發(fā)送到交換機(jī)失敗 ,就把這個(gè)記錄狀態(tài)修改為發(fā)送失敗
然后我們創(chuàng)建一個(gè)定時(shí)任務(wù)定時(shí)掃表,去讀取發(fā)送失敗的數(shù)據(jù)并重新發(fā)送,為了優(yōu)化性能,我們?cè)O(shè)置重試次數(shù)3次,如果3次都失敗了,我們可以采取人工干預(yù)
八、ElasticSearch
Lucene創(chuàng)建索引原理
Lucene是基于倒排索引原理來(lái)實(shí)現(xiàn)的
首先,將原文檔進(jìn)行分詞處理,形成一個(gè)個(gè)單獨(dú)的單詞,
然后取出標(biāo)點(diǎn)符號(hào)以及停詞,形成詞元,
再將詞元做一些語(yǔ)言相關(guān)的處理,比如變成小寫(xiě),轉(zhuǎn)換時(shí)態(tài),單復(fù)數(shù)形式等等,
將得到的詞創(chuàng)建一個(gè)字典,按照字母順序排序,合并相同的詞,最終生成一個(gè)倒排索引文檔
ES的keyword和text區(qū)別
keyword:不分詞,直接建立索引,支持模糊查詢(xún),精確查詢(xún),聚合查詢(xún)
text:分詞后建立索引,支持模糊查詢(xún),精確查詢(xún),不支持聚合查詢(xún)
keyword通常用于通常用于存儲(chǔ)年齡,性別,郵編,郵箱號(hào)碼等等,直接將完整數(shù)據(jù)保存的場(chǎng)景
text通常存儲(chǔ)全文搜索的數(shù)據(jù),例如地址,文章內(nèi)容的保存
ES的優(yōu)勢(shì)
ES是基于Lucene的開(kāi)源搜索引擎,它解決了原生Lucene使用的不足,優(yōu)化了Lucene的調(diào)用方式
分布式的實(shí)時(shí)文件存儲(chǔ),每個(gè)字段都被索引并可被搜索
支持實(shí)時(shí)分析搜索
可以擴(kuò)展到上百臺(tái)服務(wù)器,處理PB級(jí)結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
通過(guò)簡(jiǎn)單的 RESTful API、可以跟各種語(yǔ)言的客戶(hù)端甚至命令行進(jìn)行交互
上手非常容易,只需很少的學(xué)習(xí)就可以在生產(chǎn)環(huán)境中使用
ES為什么那么快(ES用到什么數(shù)據(jù)結(jié)構(gòu))
傳統(tǒng)搜索比如mysql的like關(guān)鍵字查詢(xún),它的搜索方式就是全文掃表,查詢(xún)性能很低
ES是基于Lucene的全文檢索引擎,它采用的是倒排索引結(jié)構(gòu),在存儲(chǔ)時(shí)先對(duì)文檔進(jìn)行分詞,再做一些標(biāo)點(diǎn)符號(hào)去除,大小寫(xiě)時(shí)態(tài)轉(zhuǎn)換等優(yōu)化處理,最后按照字母順序去重排序,形成一個(gè)倒排索引文檔,我們?cè)跈z索時(shí),就可以通過(guò)二分查找的方式找到目標(biāo)值
ES的分層結(jié)構(gòu),index下面是什么
Index:索引庫(kù),包含有一堆相似結(jié)構(gòu)的文檔數(shù)據(jù),類(lèi)比Mysql中的數(shù)據(jù)庫(kù)
Type:類(lèi)型,它是index中的一個(gè)邏輯數(shù)據(jù)分類(lèi),類(lèi)比Mysql中的表
Document:文檔:是ES中的最小數(shù)據(jù)單元,通常用json結(jié)構(gòu)標(biāo)識(shí),類(lèi)比Mysql中的一行數(shù)據(jù)
Field:字段:類(lèi)比Mysql中的一個(gè)列
從ES7.0開(kāi)始,Type被干掉了,從此庫(kù)表合一即一個(gè)Index中只有一個(gè)默認(rèn)的Type
講幾個(gè)ES中的查詢(xún)對(duì)象:比如TermQuery
BooleanQuery:按條件查詢(xún)
must:查詢(xún)條件(模糊查詢(xún))
filter: 過(guò)濾條件(精確查詢(xún))
MatchQuery:匹配關(guān)鍵字查詢(xún)(關(guān)鍵字分詞后)
TermQuery:匹配關(guān)鍵字查詢(xún)(關(guān)鍵詞不分詞)
matchAllQuery:匹配所有文檔查詢(xún)
rangeQuery:查詢(xún)指定范圍內(nèi)的數(shù)據(jù)
你簡(jiǎn)單描述一下DSL語(yǔ)法
DSL是一種以json形式標(biāo)識(shí)的,由ES提供的一種查詢(xún)語(yǔ)言,它由兩部分組成,DSL查詢(xún)和DSL過(guò)濾。
DSL過(guò)濾類(lèi)似于精確查詢(xún),DSL查詢(xún)類(lèi)似于模糊查詢(xún)
你使用過(guò)ES的哪些聚合查詢(xún)?
指標(biāo)聚合,比如求和,求最大值,最小值,平均數(shù)
數(shù)量統(tǒng)計(jì)聚合,計(jì)算滿(mǎn)足條件數(shù)據(jù)的總條數(shù),相當(dāng)于sql中的count
去重聚合,它會(huì)計(jì)算非重復(fù)的數(shù)據(jù)個(gè)數(shù),相當(dāng)于sql中的distinct
桶聚合,它會(huì)將某個(gè)field的每個(gè)唯一值當(dāng)成一個(gè)桶,并計(jì)算每個(gè)桶內(nèi)的文檔個(gè)數(shù),相當(dāng)于sql中的group by
最高權(quán)值聚合,它會(huì)匹配每組前n條數(shù)據(jù),相當(dāng)于sql中的group by后取出前n條
你們ES和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性怎么做的
代碼控制的,數(shù)據(jù)庫(kù)做了寫(xiě)操作,直接更新ES中的數(shù)據(jù),我知道可以通過(guò) Logstash 中數(shù)據(jù)和ES的數(shù)據(jù)自動(dòng)同步。
描述一下ES添加文檔的過(guò)程
(1) 客戶(hù)端請(qǐng)求一個(gè)協(xié)調(diào)節(jié)點(diǎn)coordinating node
(2) 協(xié)調(diào)節(jié)點(diǎn)根據(jù)算法選擇一個(gè)primary shard: 算法 hash(document_id) % (num_of_primary_shards)
(3) 對(duì)應(yīng)的primary shard 所在節(jié)點(diǎn)保存完數(shù)據(jù)后,將數(shù)據(jù)同步到replica node。
(4) 協(xié)調(diào)節(jié)點(diǎn)coordinating node 發(fā)現(xiàn) primary node 和所有 replica node 都搞定之后返回結(jié)果給客戶(hù)端
詳細(xì)描述一下Elasticsearch更新和刪除文檔的過(guò)程
刪除和更新也都是寫(xiě)操作,但是Elasticsearch中的文檔是不可變的,因此不能被刪除或者改動(dòng)以展示其變更; 磁盤(pán)上的每個(gè)段都有一個(gè)相應(yīng)的.del文件。當(dāng)刪除請(qǐng)求發(fā)送后,文檔并沒(méi)有真的被刪除,而是在.del文件中被標(biāo)記為刪除。該文檔依然能匹配查詢(xún),但是會(huì)在結(jié)果中被過(guò)濾掉。當(dāng)段合并時(shí),在.del文件中被標(biāo)記為刪除的文檔將不會(huì)被寫(xiě)入新段。
在新的文檔被創(chuàng)建時(shí),Elasticsearch會(huì)為該文檔指定一個(gè)版本號(hào),當(dāng)執(zhí)行更新時(shí),舊版本的文檔在.del文件中被標(biāo)記為刪除,新版本的文檔被索引到一個(gè)新段。舊版本的文檔依然能匹配查詢(xún),但是會(huì)在結(jié)果中被過(guò)濾掉。
ES有幾種節(jié)點(diǎn)類(lèi)型?他們的作用分別是什么
分為主節(jié)點(diǎn),node.master =true , 數(shù)據(jù)節(jié)點(diǎn)node.data =true , 負(fù)載均衡節(jié)點(diǎn)(node.data =false,node.master=false),
node.master=true,代表該節(jié)點(diǎn)有成為主資格 ,主節(jié)點(diǎn)的主要職責(zé)是和集群操作相關(guān)的內(nèi)容,如創(chuàng)建或刪除索引,跟蹤哪些節(jié)點(diǎn)是群集的一部分,并決定哪些分片分配給相關(guān)的節(jié)點(diǎn)。一般會(huì)把主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)分開(kāi)
node.data=true,數(shù)據(jù)節(jié)點(diǎn)主要是存儲(chǔ)索引數(shù)據(jù)的節(jié)點(diǎn),主要對(duì)文檔進(jìn)行增刪改查操作,聚合操作等,數(shù)據(jù)節(jié)點(diǎn)對(duì)CPU,IO,內(nèi)存要求較高,優(yōu)化節(jié)點(diǎn)的時(shí)候需要做狀態(tài)監(jiān)控,資源不夠時(shí)要做節(jié)點(diǎn)擴(kuò)充
當(dāng)主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)配置都設(shè)置為false的時(shí)候,該節(jié)點(diǎn)只能處理路由請(qǐng)求,處理搜索,分發(fā)索引操作等,從本質(zhì)上來(lái)說(shuō)該客戶(hù)節(jié)點(diǎn)表現(xiàn)為智能負(fù)載平衡器。配置:mode.master=false,mode.data=false
ES集群的三種顏色代表什么
綠色,黃色,紅色,綠色代表集群健康,所有的主備分片都得到分配,如果有備分片沒(méi)有node去分配,集群是黃色,黃色和綠色都是可用狀態(tài),如果有主分片的節(jié)點(diǎn)down機(jī),集群不可寫(xiě)數(shù)據(jù),呈現(xiàn)紅色,代表集群不健康。
你們項(xiàng)目怎么使用ES
我們使用的是spring-boot-start-data-elasticsearch這個(gè)庫(kù)來(lái)操作ES,用在大數(shù)據(jù)的搜索場(chǎng)景,比如商品的發(fā)布,搜索功能。
總結(jié)
以上是生活随笔為你收集整理的6.面试题--redis、rabbitmq、es的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【连载之一】那些公众号不会告诉你的职业真
- 下一篇: 计算机left函数的意思,Excel中L