Redis企業實戰的幾個坑

2022-02-17 05:09:53 字數 3382 閱讀 3018

小夥伴們對redis應該不陌生,redis是系統必備的分布式快取中介軟體,主要用來解決高併發下分擔db資源的負載,從而提公升系統吞吐量。

redis支援多種資料型別,string(字串)、list(列表)、hash(雜湊)、set(集合)、zset(有序集合),不同的型別可以應用到不同的業務需求中。

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集群位址的改變,方案一樣。

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

Sqlite的幾個坑

如果使用 cursoradapter進行適配時,切記開啟的資料庫的表名的主鍵名稱前要加 如果工程中有兩個activity,如果要啟動其中乙個activity,需要在manifest.xml檔案中將intent filter加到該activity下面,如圖要啟動cursoradapteractivit...

js 的幾個坑

about post ids about post ids.split 就算是乙個空值,也會被分割成乙個陣列,可以用alert arr.lenght 測試 如果是 1,2,3 或者 1,2,3,或 都或生產乙個空值。空值的清除 about post ids grep about post ids,f...

windows nginx的幾個坑

今天在windows下弄nginx遇到幾個坑。首先是windows下的安裝。應該參考官網 nginx error openevent global ngx reload 5744 failed 或 nginx error openevent global ngx quit 5744 failed 或...