使用Redis之前5個必須了解的事情

2022-07-20 04:54:09 字數 2193 閱讀 9837

摘要:對比傳統關係型資料庫,雖然基於redis的應用程式開發有著很多相同之處,但是有一些關鍵區別在應用程式設計時卻必須銘記在心,比如基於記憶體的單執行緒特性。

使用redis開發應用程式是乙個很愉快的過程,但是就像其他技術一樣,基於redis的應用程式設計你同樣需要牢記幾點。在之前,你可能已經對關係型資料庫開發的那一整個套路了然如胸,而基於redis的應用程式開發也有許多相似的地方,但是你必須牢記以下兩點——redis是個記憶體資料庫,同時它是單執行緒的。因此,在使用redis時,你需要注意以下幾點:

1. 掌控儲存在redis中的所有鍵

資料庫的主要功能是儲存資料,但是對於開發者來說,因為應用程式需求或者資料使用方法的改變,忽略儲存在資料庫中的某些資料是非常正常的,在redis中同樣如此。你可能忽視期滿某些鍵,也可能因為應用程式的某個模組棄用而忘掉這些資料。

無論哪種情況,redis都儲存了一些不再使用的資料,平白無故的占用了一些空間。redis的弱結構資料模式讓集中儲存的內容很難被弄清,除非你為鍵使用一套非常成熟的命名法則。使用合適的命名方法會簡化你的資料庫管理,當你通過你的應用程式或者服務做鍵的命名空間時(通常情況下是使用冒號來劃分鍵名),你就可以在資料遷移、轉換或者刪除時輕鬆的識別。

redis另乙個常見用例是作為熱資料項作的第二資料儲存,大部分的資料被儲存在其他的資料庫中,比如postgresql或mongodb。在這些用例中,當資料從主儲存移除時,開發者經常會忘記刪除redis中對應的資料。這種存在跨資料儲存的情況下,通常需要做級聯刪除,這種情況下,可以通過在redis配置儲存特定資料項的所有識別符來實現,從而保證資料在主資料庫被刪除後,系統會呼叫乙個清理程式來刪除所有相關副本和資訊。

2. 控制所有鍵名的長度

在上文我們說過要使用合適的命名規則,並且新增字首來識別資料走向,因此這一條看起來似乎與之違背。但是,請別忘記,redis是個記憶體資料庫,鍵越短你需要的空間就越少。理所當然,當資料庫中擁有數百萬或者數十億鍵時,鍵名的長度將影響重大。

舉個例子:在乙個32位的redis伺服器上,如果儲存一百萬個鍵,每個值的長度是32-character,那麼在使用6-character長度鍵名時,將會消耗大約96mb的空間,但是如果使用12-character長度的鍵名時,空間消耗則會提公升至111mb左右。隨著鍵的增多,15%的額外開銷將產生重大的影響。

3. 使用合適的資料結構

取代將資料儲存為數千(或者數百萬)獨立的字串,可以考慮使用雜湊資料結構將相關資料進行分組。雜湊表是非常有效率的,並且可以減少你的記憶體使用;同時,雜湊還更有益於細節抽象和**可讀。

合適時候,使用list代替set。如果你不需要使用set特性,list在使用更少記憶體的情況下可以提供比set更快的速度。

sorted sets是最昂貴的資料結構,不管是記憶體消耗還是基本操作的複雜性。如果你只是需要乙個查詢記錄的途徑,並不在意排序這樣的屬性,那麼輕建議使用雜湊表。

redis中乙個經常被忽視的功能就是bitmaps或者bitsets(v2.2之後)。bitsets允許你在redis值上執行多個bit-level操作,比如一些輕量級的分析。

4. 使用scan時別使用鍵

從redis v2.8開始,scan命令已經可用,它允許使用游標從keyspace中檢索鍵。對比keys命令,雖然scan無法一次性返回所有匹配結果,但是卻規避了阻塞系統這個高風險,從而也讓一些操作可以放在主節點上執行。

需要注意的是,scan 命令是乙個基於游標的迭代器。scan 命令每次被呼叫之後, 都會向使用者返回乙個新的游標,使用者在下次迭代時需要使用這個新游標作為 scan 命令的游標引數, 以此來延續之前的迭代過程。同時,使用scan,使用者還可以使用keyname模式和count選項對命令進行調整。

scan相關命令還包括sscan 命令、hscan 命令和 zscan 命令,分別用於集合、雜湊鍵及有續集等。

5. 使用伺服器端lua指令碼

在redis使用過程中,lua指令碼的支援無疑給開發者提供乙個非常友好的開發環境,從而大幅度解放使用者的創造力。如果使用得當,lua指令碼可以給效能和資源消耗帶來非常大的改善。取代將資料傳送給cpu,指令碼允許你在最接近資料的地方執行邏輯,從而減少網路延時和資料的冗餘傳輸。

在redis中,lua乙個非常經典的用例就是資料過濾或者將資料聚合到應用程式。通過將處理工作流封裝到乙個指令碼中,你只需要呼叫它就可以在更短的時間內使用很少的資源來獲取乙個更小的答案。

學習HTML之前必須了解的基礎

帖子包含非法片語,不能發布 一 網路基礎部分 1.1瀏覽器與伺服器 瀏覽器是指可以顯示網頁伺服器或者檔案系統的html檔案 標準通用標記語言的乙個應用 內容,並讓使用者與這些檔案互動的一種軟體。瀏覽器在訪問頁面時通過瀏覽器的核心解析頁面。瀏覽器的核心大致有這麼幾種 ie的trident核心,fire...

A B 測試之前必須要了解的 10 件事

如今,轉化率優化 cro 已是營銷人員必須具備的技能,並且與 roi 直接掛鉤。但是在優化網頁的轉化率方面又有太多因素要考量,如果你已經不堪其憂,請專心做一件事 a b 測試。a b測試,即你設計的頁面有兩個版本 a和b a為現行的設計,b是新的設計。比較這兩個版本之間你所關心的資料 化率,業績,跳...

Redis 的 5 個常見使用場景

最常用的一種使用redis的情景是會話快取 session cache 用redis快取會話比其他儲存 如memcached 的優勢在於 redis提供持久化。當維護乙個不是嚴格要求一致性的快取時,如果使用者的購物車資訊全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?幸運的是,隨著 redis...