1. 程式人生 > >如何使用好Redis?

如何使用好Redis?

Redis的幾個缺點

(一)快取和資料庫雙寫一致性問題

(二)快取雪崩問題

(三)快取擊穿問題

(四)快取的併發競爭問題

單執行緒的redis為什麼這麼快

分析:這個問題其實是對redis內部機制的一個考察。其實根據博主的面試經驗,很多人其實都不知道redis是單執行緒工作模型。所以,這個問題還是應該要複習一下的。
回答:主要是以下三點
(一)純記憶體操作
(二)單執行緒操作,避免了頻繁的上下文切換
(三)採用了非阻塞I/O多路複用機制

redis的資料型別,以及每種資料型別的使用場景

分析:是不是覺得這個問題很基礎,其實我也這麼覺得。然而根據面試經驗發現,至少百分八十的人答不上這個問題。建議,在專案中用到後,再類比記憶,體會更深,不要硬記。基本上,一個合格的程式設計師,五種型別都會用到。
回答:一共五種


(一)String
這個其實沒啥好說的,最常規的set/get操作,value可以是String也可以是數字。一般做一些複雜的計數功能的快取。


(二)hash
這裡value存放的是結構化的物件,比較方便的就是操作其中的某個欄位。博主在做單點登入的時候,就是用這種資料結構儲存使用者資訊,以cookieId作為key,設定30分鐘為快取過期時間,能很好的模擬出類似session的效果。


(三)list
使用List的資料結構,可以做簡單的訊息佇列的功能。另外還有一個就是,可以利用lrange命令,做基於redis的分頁功能,效能極佳,使用者體驗好。本人還用一個場景,很合適---取行情資訊。就也是個生產者和消費者的場景。LIST可以很好的完成排隊,先進先出的原則。


(四)set
因為set堆放的是一堆不重複值的集合。所以可以做全域性去重的功能。為什麼不用JVM自帶的Set進行去重?因為我們的系統一般都是叢集部署,使用JVM自帶的Set,比較麻煩,難道為了一個做一個全域性去重,再起一個公共服務,太麻煩了。


另外,就是利用交集、並集、差集等操作,可以計算共同喜好,全部的喜好,自己獨有的喜好等功能。


(五)sorted set
sorted set多了一個權重引數score,集合中的元素能夠按score進行排列。可以做排行榜應用,取TOP N操作。

redis的過期策略以及記憶體淘汰機制

分析:這個問題其實相當重要,到底redis有沒用到家,這個問題就可以看出來。比如你redis只能存5G資料,可是你寫了10G,那會刪5G的資料。怎麼刪的,這個問題思考過麼?還有,你的資料已經設定了過期時間,但是時間到了,記憶體佔用率還是比較高,有思考過原因麼?


回答:


redis採用的是定期刪除+惰性刪除策略。


為什麼不用定時刪除策略?


定時刪除,用一個定時器來負責監視key,過期則自動刪除。雖然記憶體及時釋放,但是十分消耗CPU資源。在大併發請求下,CPU要將時間應用在處理請求,而不是刪除key,因此沒有采用這一策略.


定期刪除+惰性刪除是如何工作的呢?


定期刪除,redis預設每個100ms檢查,是否有過期的key,有過期key則刪除。需要說明的是,redis不是每個100ms將所有的key檢查一次,而是隨機抽取進行檢查(如果每隔100ms,全部key進行檢查,redis豈不是卡死)。因此,如果只採用定期刪除策略,會導致很多key到時間沒有刪除。


於是,惰性刪除派上用場。也就是說在你獲取某個key的時候,redis會檢查一下,這個key如果設定了過期時間那麼是否過期了?如果過期了此時就會刪除。


採用定期刪除+惰性刪除就沒其他問題了麼?


不是的,如果定期刪除沒刪除key。然後你也沒即時去請求key,也就是說惰性刪除也沒生效。這樣,redis的記憶體會越來越高。那麼就應該採用記憶體淘汰機制。

redis和資料庫雙寫一致性問題

分析:一致性問題是分散式常見問題,還可以再分為最終一致性和強一致性。資料庫和快取雙寫,就必然會存在不一致的問題。答這個問題,先明白一個前提。就是如果對資料有強一致性要求,不能放快取。我們所做的一切,只能保證最終一致性。另外,我們所做的方案其實從根本上來說,只能說降低不一致發生的概率,無法完全避免。因此,有強一致性要求的資料,不能放快取。

首先,採取正確更新策略,先更新資料庫,再刪快取。其次,因為可能存在刪除快取失敗的問題,提供一個補償措施即可,例如利用訊息佇列。

如何應對快取穿透和快取雪崩問題

分析:這兩個問題,說句實在話,一般中小型傳統軟體企業,很難碰到這個問題。如果有大併發的專案,流量有幾百萬左右。這兩個問題一定要深刻考慮。

回答:如下所示

快取穿透,即黑客故意去請求快取中不存在的資料,導致所有的請求都懟到資料庫上,從而資料庫連線異常。

解決方案:

(一)利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了,再去請求資料庫。沒得到鎖,則休眠一段時間重試

(二)採用非同步更新策略,無論key是否取到值,都直接返回。value值中維護一個快取失效時間,快取如果過期,非同步起一個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。

(三)提供一個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的Key是否合法有效。如果不合法,則直接返回。

快取雪崩,即快取同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,從而導致資料庫連線異常。

解決方案:

(一)給快取的失效時間,加上一個隨機值,避免集體失效。

(二)使用互斥鎖,但是該方案吞吐量明顯下降了。

(三)雙快取。我們有兩個快取,快取A和快取B。快取A的失效時間為20分鐘,快取B不設失效時間。自己做快取預熱操作。然後細分以下幾個小點

  • I 從快取A讀資料庫,有則直接返回

  • II A沒有資料,直接從B讀資料,直接返回,並且非同步啟動一個更新執行緒。

  • III 更新執行緒同時更新快取A和快取B。

相關推薦

linux安裝redis,如何在window端訪問?

   注:看本文章的話一定得靜下心來一步一步跟著走,絕對可以配置好的,相信自己。 1.確保自己安裝好了redis,沒安裝好的請移步到我的文章:linux安裝redis:https://www.cnblogs.com/fh-fendou/p/9897556.html 2.我們需要給re

linux安裝redis 接下來如何使用

1、首先為了方便管理,將Redis檔案中的conf配置檔案和常用命令移動到統一檔案中。(1)建立bin和redis.conf檔案,複製程式碼“mkdir -p/usr/local/redis/bin;mkdir -p/usr/local/redis/ect”;(2)執行Lin

如何使用Redis

Redis的幾個缺點 (一)快取和資料庫雙寫一致性問題 (二)快取雪崩問題 (三)快取擊穿問題 (四)快取的併發競爭問題 單執行緒的redis為什麼這麼快 分析:這個問題其實是對redis內部機制的一個考察。其實根據博主的面試經驗,很多人其實都不知道redis是單

如何用redis pipeline

編者注:pipeline是Redis的一個提高吞吐量的機制,適用於多key讀寫場景,比如同時讀取多個key的value,或者更新多個key的value。工作過程中發現挺多小夥伴都對pipeline多少有些瞭解,但是更深入的理解或者說有哪些坑就不知道了,下面咱們就一起分析下redis pipeline機制,揭

教你如何使用理解 懶 Redis 是更Redis

大量 rep 遊標 聚合數據 memcached 是個 智能 選擇 sadd 前言大家都知道 Redis 是單線程的。真正的內行會告訴你,實際上 Redis 並不是完全單線程,因為在執行磁盤上的特定慢操作時會有多線程。目前為止多線程操作絕大部分集中在 I/O 上以至於在不同

redis-看看就的基礎

概要: redis是什麼?能幹什麼?去哪裡下?怎麼用? -------------------------------------------------------------------------------------------- NoSQL資料庫 Redi

SpringBoot使用已封裝Redis

一 json工具類 package com.imooc.utils; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterx

用的Redis管理及監控工具,使用後可大大提高你的工作效率!

        Redis做為現在web應用開發的黃金搭擔組合,大量的被應用,廣泛用於儲存session資訊,許可權資訊,交易作業等熱資料。做為一名有10年以上JAVA開發經驗的程式設計師,工作中專案也是廣泛使用了Redis,工作中也遇

用的Redis管理及監控工具treeNMS,可大大提高你的工作效率!

        Redis做為現在web應用開發的黃金搭擔組合,大量的被應用,廣泛用於儲存session資訊,許可權資訊,交易作業等熱資料。做為一名有10年以上JAVA開發經驗的程式設計師,工作中專案也是廣泛使用了Redis,工作中也遇到了Redis的資料視覺化不便、Red

redis中快取的資料與資料庫資料一致性的方案()

方式1:資料庫儲存資料,redis不persistredis啟動後,從資料庫載入資料不要求強一致實時性的讀請求,都由redis處理要求強一致實時性的讀請求,由資料庫處理寫請求有2種處理方式,由資料庫處理- 應用先寫道資料庫,然後更新redis- 應用先寫道資料庫,然後其它da

全面深入理解Redis與Memcached(深度文)

說到redis就會聯想到memcached,反之亦然。瞭解過兩者的同學有那麼個大致的印象:redis與memcached相比,比僅支援簡單的key-value資料型別,同時還提供list,set,zset,hash等資料結構的儲存;redis支援資料的備份,即master-s

推薦一款用的redis客戶端工具

推薦一款好用的redis客戶端工具 redis官方客戶端(redis-cli)每次都要指定連線IP與埠,連線成功後還要執行auth

學習Redis一陣了,我對它有了一些新的看法

> 前言 本篇文章不是一篇具體的教程,我打算記錄一下自己對Redis的一些思考。說來慚愧,我剛接觸Redis的時候只是簡單地使用了一下,背了一些面試題,就在簡歷上寫下了Redis這個技能點。 我們能在網路上輕易地找到關於Redis具體知識點的講解,但很少有文字說明為什麼會有這項技術,我希望通過本文總結一下

開源 5 款超用的資料庫 GUI 帶你玩轉 MongoDB、Redis、SQL 資料庫

![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200716122604295-223398174.jpg) 作者:HelloGitHub-**小魚乾** 工欲善其事必先利其器,想要玩溜資料庫,不妨去試試本文安利的 5 款開源的資料

阿里面試官:HashMap 熟悉吧?的,那就來聊聊 Redis 字典吧!

最近,小黑哥的一個朋友出去面試,回來跟小黑哥抱怨,面試官不按套路出牌,直接打亂了他的節奏。 事情是這樣的,前面面試問了幾個 Java 的相關問題,我朋友回答還不錯,接下來面試官就問了一句:看來 Java 基礎還不錯,Java HashMap 你熟悉吧? 我朋友回答。工作經常用,有看過原始碼。 我朋友本來

Redis和phpredis安裝

redis1,安裝環境centos 7.3/php 5.6.29安裝步驟:一,先安裝redis,到官網下載redis ( https://redis.io/download)二,按照官方文檔操作,最後執行make test (如果報缺少tcl的問題,安裝對應包即可)三,安裝phpredis(模塊插件)安裝PH

CSRF攻擊與防禦(寫得非常

得到 cookie信息 req ret 沒有 不同的 sof 協議 表單 轉載地址:http://www.phpddt.com/reprint/csrf.html CSRF概念:CSRF跨站點請求偽造(Cross—Site Request Forger

redis配置詳細解析

keep turn name sort out 配置文件 trac lte eid # redis 配置文件示例 # 當你需要為某個配置項指定內存大小的時候,必須要帶上單位, # 通常的格式就是 1k 5gb 4m 等: # # 1k => 1000 bytes

Redis的安裝及學習

mongod 無效 擴展 管理 數據持久化 windows string類型 實例 配置 最近因為做Chatbot項目需要對於NoSQL數據庫進行研究,調研範圍包括MongoDB和Redis。本文將介紹Redis在Windows環境的安裝及如何利用python來操作Redi

幾個很的OJ網站

acc 應該 ica class dev tco 友好 題目 如果 很友好的OJ網站(OJ是open judge,在線評測) POJ 北京大學ACM ZOJ 浙江大學ACM WOJ 武漢大學ACM(一個題目提交通過後,可以查看通過該題的所有代碼) 唯一不好的地方是