亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

壓箱底的干貨!干貨!——Redis面試系列(二)

發布時間:2020-07-12 00:31:26 來源:網絡 閱讀:125 作者:颯拉阿依醬 欄目:編程語言

壓箱底的干貨!干貨!——Redis面試系列(二)
Redis 如何做內存優化?
答:盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數少)使用的內存非常小,所以你應該盡可能的將你的數據模型抽象到一個散列表里面。比如你的 web 系統中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的 key,而是應該把這個用戶的所有信息存儲到一張散列表里面。

Redis 回收進程如何工作的?
答:一個客戶端運行了新的命令,添加了新的數據。Redi 檢查內存使用情況,如果大于 maxmemory 的限制, 則根據設定好的策略進行回收。一個新的命令被執行,等等。所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。

都有哪些辦法可以降低 Redis 的內存使用情況呢?

答:如果你使用的是 32 位的 Redis 實例,可以好好利用 Hash,list,sorted set,set等集合類型數據,因為通常情況下很多小的 Key-Value 可以用更緊湊的方式存放到一起。

Redis 的內存用完了會發生什么?

答:如果達到設置的上限,Redis 的寫命令會返回錯誤信息(但是讀命令還可以正常返回。)或者你可以將 Redis 當緩存來使用配置淘汰機制,當 Redis 達到內存上限時會沖刷掉舊的內容。

一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set 他們最多能存放多少元素?
答:理論上 Redis 可以處理多達 232 的 keys,并且在實際中進行了測試,每個實例至少存放了 2 億 5 千萬的 keys。我們正在測試一些較大的值。任何 list、set、和 sorted set 都可以放 232 個元素。換句話說,Redis 的存儲極限是系統中的可用內存值。

MySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據?
答:Redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。

相關知識:Redis 提供 6 種數據淘汰策略:

volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

Redis 最適合的場景?
1、會話緩存(Session Cache)

最常用的一種使用 Redis 的情景是會話緩存(session cache)。用 Redis 緩存會話比其他存儲(如 Memcached)的優勢在于:Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎? 幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當的使用 Redis 來緩存會話的文檔。甚至廣為人知的商業平臺Magento 也提供 Redis 的插件。

2、全頁緩存(FPC)

除基本的會話 token 之外,Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即使重啟了 Redis 實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似 PHP 本地 FPC。 再次以 Magento 為例,Magento提供一個插件來使用 Redis 作為全頁緩存后端。 此外,對 WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

3、隊列

Reids 在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis能作為一個很好的消息隊列平臺來使用。Redis 作為隊列使用的操作,就類似于本地程序語言(如 Python)對 list 的 push/pop 操作。 如果你快速的在 Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用 Redis 創建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用 Redis 作為 broker,你可以從這里去查看。

4,排行榜/計數器

Redis 在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的 10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可: 當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行: ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一個很好的例子,用 Ruby 實現的,它的排行榜就是使用 Redis 來存儲數據的,你可以在這里看到。

5、發布/訂閱

最后(但肯定不是最不重要的)是 Redis 的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基于發布/訂閱的腳本觸發器,甚至用 Redis 的發布/訂閱功能來建立聊天系統!

假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?
答:使用 keys 指令可以掃出指定模式的 key 列表。

如果這個 redis 正在給線上的業務提供服務,那使用 keys 指令會有什么問題?
這個時候你要回答 redis 關鍵的一個特性:redis 的單線程的。keys 指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長。

如果有大量的 key 需要設置同一時間過期,一般需要注意什么?
答:如果大量的 key 過期時間設置的過于集中,到過期的那個時間點,redis 可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。

使用過 Redis 做異步隊列么,你是怎么用的?
答:一般使用 list 結構作為隊列,rpush 生產消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep 一會再重試。如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有消息的時候,它會阻塞住直到消息到來。如果對方追問能不能生產一次消費多次呢?使用 pub/sub 主題訂閱者模式,可以實現1:N 的消息隊列。

如果對方追問 pub/sub 有什么缺點?
在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 RabbitMQ等。

如果對方追問 redis 如何實現延時隊列?
我估計現在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細。但是你很克制,然后神態自若的回答道:使用 sortedset,拿時間戳作為score,消息內容作為 key 調用 zadd 來生產消息,消費者用 zrangebyscore 指令獲取 N 秒之前的數據輪詢進行處理。到這里,面試官暗地里已經對你豎起了大拇指。但是他不知道的是此刻你卻豎起了中指,在椅子背后。

使用過 Redis 分布式鎖么,它是什么回事?
先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。

這時候對方會告訴你說你回答得不錯,然后接著問如果在 setnx 之后執行 expire之前進程意外 crash 或者要重啟維護了,那會怎么樣?這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得 set 指令有非常復雜的參數,這個應該是可以同時把 setnx 和expire 合成一條指令來用的!對方這時會顯露笑容,心里開始默念:摁,這小子還不錯。

Redis的應用場景
總結一:

計數器

可以對 String 進行自增自減運算,從而實現計數器功能。

Redis 這種內存型數據庫的讀寫性能非常高,很適合存儲頻繁讀寫的計數量。

緩存

將熱點數據放到內存中,設置內存的最大使用量以及淘汰策略來保證緩存的命中率。

會話緩存

可以使用 Redis 來統一存儲多臺應用服務器的會話信息。

當應用服務器不再存儲用戶的會話信息,也就不再具有狀態,一個用戶可以請求任意一個應用服務器,從而更容易實現高可用性以及可伸縮性。

全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。

以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存后端。此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

查找表

例如 DNS 記錄就很適合使用 Redis 進行存儲。

查找表和緩存類似,也是利用了 Redis 快速的查找特性。但是查找表的內容不能失效,而緩存的內容可以失效,因為緩存不作為可靠的數據來源。

消息隊列(發布/訂閱功能)

List 是一個雙向鏈表,可以通過 lpush 和 rpop 寫入和讀取消息

不過最好使用 Kafka、RabbitMQ 等消息中間件。

分布式鎖實現

在分布式場景下,無法使用單機環境下的鎖來對多個節點上的進程進行同步。

可以使用 Redis 自帶的 SETNX 命令實現分布式鎖,除此之外,還可以使用官方提供的 RedLock 分布式鎖實現。

其它

Set 可以實現交集、并集等操作,從而實現共同好友等功能。

ZSet 可以實現有序性操作,從而實現排行榜等功能。

總結二:

Redis相比其他緩存,有一個非常大的優勢,就是支持多種數據類型。

數據類型說明string字符串,最簡單的k-v存儲hashhash格式,value為field和value,適合ID-Detail這樣的場景。list簡單的list,順序列表,支持首位或者末尾插入數據set無序list,查找速度快,適合交集、并集、差集處理sorted set有序的set

其實,通過上面的數據類型的特性,基本就能想到合適的應用場景了。

string——適合最簡單的k-v存儲,類似于memcached的存儲結構,短信驗證碼,配置信息等,就用這種類型來存儲。

hash——一般key為ID或者唯一標示,value對應的就是詳情了。如商品詳情,個人信息詳情,新聞詳情等。

list——因為list是有序的,比較適合存儲一些有序且數據相對固定的數據。如省市區表、字典表等。因為list是有序的,適合根據寫入的時間來排序,如:最新的***,消息隊列等。

set——可以簡單的理解為ID-List的模式,如微博中一個人有哪些好友,set最牛的地方在于,可以對兩個set提供交集、并集、差集操作。例如:查找兩個人共同的好友等。

Sorted Set——是set的增強版本,增加了一個score參數,自動會根據score的值進行排序。比較適合類似于top 10等不根據插入的時間來排序的數據。

如上所述,雖然Redis不像關系數據庫那么復雜的數據結構,但是,也能適合很多場景,比一般的緩存數據結構要多。了解每種數據結構適合的業務場景,不僅有利于提升開發效率,也能有效利用Redis的性能。

為什么要用 Redis /為什么要用緩存
主要從“高性能”和“高并發”這兩點來看待這個問題。

高性能:

假如用戶第一次訪問數據庫中的某些數據。這個過程會比較慢,因為是從硬盤上讀取的。將該用戶訪問的數據存在數緩存中,這樣下一次再訪問這些數據的時候就可以直接從緩存中獲取了。操作緩存就是直接操作內存,所以速度相當快。如果數據庫中的對應數據改變的之后,同步改變緩存中相應的數據即可!

壓箱底的干貨!干貨!——Redis面試系列(二)

高并發:

直接操作緩存能夠承受的請求是遠遠大于直接訪問數據庫的,所以我們可以考慮把數據庫中的部分數據轉移到緩存中去,這樣用戶的一部分請求會直接到緩存這里而不用經過數據庫。

壓箱底的干貨!干貨!——Redis面試系列(二)

更多面試資料免費獲取:

QQ獲取

搜索Q群號:668470172

不常用QQ的小伙伴可以微信獲取(記得備注一下加群渠道哦~)

輸入賬號:13272413561

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴化市| 南投市| 景德镇市| 吉安县| 阿巴嘎旗| 辽源市| 高平市| 革吉县| 阳西县| 肥乡县| 普宁市| 海淀区| 青川县| 隆化县| 安阳县| 泸西县| 怀柔区| 保定市| 虎林市| 嵊泗县| 商水县| 滨州市| 兖州市| 若尔盖县| 竹北市| 称多县| 留坝县| 瑞丽市| 临高县| 邵东县| 沙洋县| 杭锦后旗| 巴里| 施甸县| 宿州市| 门头沟区| 尖扎县| 永仁县| 彰武县| 高州市| 阿合奇县|