你知道redis企業實戰存在的問題嗎?

享學課堂特邀做者:老顧

前言

小夥伴們對redis應該不陌生,redis是系統必備的分佈式緩存中間件,主要用來解決高併發下分擔DB資源的負載,從而提高系統吞吐量java

redis支持多種數據類型, String(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),不一樣的類型能夠應用到不一樣的業務需求中。

redis的集羣部署也加強了redis的高可用性,以及對數據的易擴容。web

上面都是 redis知識掌握的重點,這些知識點也是咱們工做的時候,常常用到的,網上介紹的也挺多,老顧就不介紹了。

今天老顧分享redis企業應用,從業務實戰的緯度,看看咱們平時使用redis出現了什麼問題?如何去解決?redis

劃分

如今咱們企業中,作的項目產品確定不止一個;或者一個大的平臺中,會有不少業務線。不一樣的項目和業務線確定是不一樣的團隊進行開發的。那你們都會用到redis,那怎麼去劃分?緩存

獨立redis集羣

這種方案就是不一樣的業務用不一樣的redis集羣,這種方案針對一些小項目或業務線不復雜,以及用到redis緩存範圍不大的話,是對服務器資源的浪費,並且增長了運維的工做量。服務器

固然也有好處,就是 redis資源的獨立性,不干擾;通常會用在大項目中。

公共redis集羣

這種方案就是一些業務共用一個redis集羣,加強了對redis資源的利用率。架構

問題

在通常企業中,不一樣的業務線通常咱們採用的是公共redis集羣,由於業務線都不大,獨立集羣沒有必要。這樣雖然對redis資源充分利用了,但會出現一些問題併發

如何區分業務

多業務間用redis,會出現不少緩存Key,根本無法知道哪些key是屬於哪一個業務的,如:運維

KEY: user:1000、user:book、book、user:like:book、book:user;甚至會出現key衝突分佈式

redis的key在開發的使用是要 合理進行設計規劃的,但兩個不一樣的團隊,技術和管理都不同, 即便有規範文檔,但不一樣的業務團隊間, 規範的執行就不得而知。

如何優雅擴容

咱們在開發web服務時,會用相似jedis客戶端鏈接redis服務器,會在配置文件中加入redis集羣地址。不過當系統遇到redis負載過高,或者redis的數據須要擴容,就須要增長redis服務器。這時就須要從新把配置文件中的redis集羣更改,再重啓應用高併發

上面的方式是否太low了, 都須要從新啓動應用那麼多的應用都須要重啓,是否是很麻煩,並且若是在 沒法區分業務的狀況下, 還不知道重啓哪些業務應用

如何發現異常

由於不一樣的業務,不一樣的團隊,不一樣的開發人員在真實業務場景中,咱們管理者是沒法避免bug存在的,也沒法預測線上會發生什麼樣的問題?如:發現redis集羣有不穩定狀況,cpu負載很是高,那咱們怎麼知道是哪一個業務致使的呢?

這個是很是重要的,由於這個是 公共的redis集羣,一旦這個集羣掛了,會影響整個業務

如何截斷異常

當咱們在生產環境中,發現異常是由哪一個業務產生時,或者是哪一個應用服務器產生的,那如何很快速截斷的讓有問題的業務和應用服務器,先不讓他們訪問咱們公共redis集羣,等排查出緣由在恢復他們的訪問權限。

解決方案

小夥伴看到這裏,感受怎麼樣?是否是工做中,沒有想過這些問題,工做中就直接按照網上的介紹先拿來用了。

如今是否是內心在想,怎麼去解決上面的問題?

老顧這裏介紹一下解決思路,具體整個代碼等老顧的開源項目rb-cache上線後,會分享給你們。

區分業務

這個問題解決相對比較簡單,就是對咱們現有的客戶端工具,進行二次封裝

上圖就是定義一個二次封裝接口

其實原理就是強制在方法中,要開發人員賦予業務區分,每一個業務都是在開發前,管理人員定下來的,這個管理就比較簡單了。

若是項目管理中,對業務的劃分 比較合理的話,能夠在外面再 封裝一個簡單的方法,把business業務放在配置文件中,這樣就不須要每次都要傳business這個參數了。

優雅擴容

解決這個問題,其實原理比較簡單,就是程序若是可以知道redis集羣地址產生了變化,從新設置一下jedis客戶端的鏈接配置。如今的問題就是如何知道redis集羣地址發生了改變?

咱們能夠採用把redis的集羣地址配置在zookeeper中,應用在啓動的時候,獲取zk上的集羣地址的值,進行初始化。若是想要改變集羣地址,要在zk上面進行設置。

zk重要的特性就 是監聽特性節點發生變化,就會馬上把變化發送給應用,從而應用獲取到值, 從新設置jedis客戶端鏈接

發現異常

發現異常這個問題,其實就是一個監控的問題,咱們須要把各個客戶端使用redis的狀況進行監控。怎麼監控?

須要一個監控工具,這個監控工具網上有幾個,推薦使用小米的open-falcon,自行搭建改監控系統,搭建比較複雜,但功能比較強大,不少公司都在使用。

固然小夥伴們能夠用別的監控工具,只要數據上報協議,和監控報表輸出功能便可,固然也要有報警的功能,及時給運維人員報告

再使用Aop攔截redis操做類,攔截redis操做,把相關數據進行封裝。每隔1分鐘把這些數據上報到open-falcon平臺中。具體監控什麼數據,由業務決定,通常要把設置的key,業務,操做時長,哪一個客戶端IP發起的,都須要監控。

在能夠設置相關的 報警規則,如:某個key一直被調用,在一段時間內 操做次數過高。這樣就能夠方便排查 哪些key致使cpu負載過高,就能夠去看一下 設置這個key的代碼,有沒有什麼問題?是否是死循環等問題?

截斷異常

在上面的發現異常的基礎上面,若是發現某些業務應用,不正常,就能夠當即發起截斷該客戶端的請求,這樣能夠保證其餘業務不受影響。這裏咱們使用客戶端方式去實現截斷。原理也很簡單,在redis二次封裝的類中,咱們須要判斷本機是否在黑名單中,若是存在,則沒法操做方法,或報異常。

如何知道黑名單的變化,跟優雅擴容那個redis集羣地址的改變,方案同樣。

總結

在企業應用中,小夥伴們要常常去思考,業務進行中,如何方便管理,及時發現問題,是很是重要的。這也是不少管理者常常忽略的,都只是先把功能完成了,而不顧管理和監控。但願這篇文章可以幫助你們,從另外一個緯度發現問題。謝謝!!!

END

歡迎長按下圖關注公衆號:享學課堂online!

公衆號後臺回覆【java】,獲取精選準備的架構學習資料(視頻+文檔+架構筆記)

相關文章
相關標籤/搜索