Redis 4 0鮮為人知的功能將加速您的應用程式

2022-08-25 09:39:11 字數 1726 閱讀 7129

redis 4.0給redis生態帶來了乙個驚人的功能:modules(模組)。modules是redis的一大轉變,它是redis內部自定義資料型別和全速計算的開放環境。但是,儘管對該版本的大多數關注都集中在modules上,但新版本還引入了乙個非常重要的命令,它就是遊戲規則的改變者:unlink。

您可以使用redis-cli連線redis-server執行info命令,去檢視當前redis版本中是否可以使用unlink命令。info響應將告訴您有關伺服器的所有資訊。在第一部分(#server)中,返回結果有一行值為redis_version。如果該值大於4.0,則可以使用unlink命令。並非所有redis提供商都保持最新版本,因此最好在更改**之前檢查redis版本。

讓我們回顧一下redis的關鍵架構功能之一:「單執行緒」。redis在大多數情況下是乙個單執行緒應用程式。它一次只做一件事,這樣可以把這些事做的更快。多執行緒有點複雜,並且引入了鎖和其他可能降低應用程式速度的問題。儘管redis(最高4.0版)通過多執行緒方式執行了少量操作,但它通常在啟動另乙個命令之前先要完成乙個命令。

相比於快速讀寫,您可能會覺得使用del命令去刪除乙個鍵值不需要考慮太多,但是在很多情況下,刪除資料同樣很重要。與redis中的大多數命令一樣,del命令在單個執行緒中執行,如果您獲取乙個幾千位元組的鍵值,花費不到一毫秒的時間,這是您所感知不到的。然而,當您獲取的鍵值大小是兆位元組、100兆位元組或者500兆位元組會發生什麼呢?雜湊、排序、列表等資料結構會隨著時間的推移而新增更多的資料進去,這樣會生成乙個數gb大小的資料集。然後用del命令去刪除大key時會發生什麼呢?由於redis是單執行緒操作的,處理這種請求時整個服務都處於等待中,需要等待該命令執行完成才能執行其它操作。同時,我們考慮更複雜的一種場景,這些鍵中儲存的資料可能已經包含數以千萬個微小請求,因此應用程式或操作員可能無法真正了解刪除這些資料需要花費多長時間。

理智會告訴我們不要在擁有100萬元素的排序集上執行如下這樣的命令:

> zrange some-zset 0 -1

但是,在上面的some-zset集合中執行del命令將花費和上面一樣的時間-中間沒有傳輸開銷,但是它會一直去分配記憶體,而且您會一直卡死在cpu繁忙中。在使用unlink之前,您可能會結合scan命令採用非原子性的方法進行一些少量刪除,去避免這種持續分配記憶體的噩夢。上面無論使用哪種方式,都是讓人無法接受的。

您可能已經猜到了,就是使用unlink命令來替換del!從語法上講,unlink與del相同,但unlink提供了更為理想的解決方案。首先,它將鍵值從整個鍵值空間中刪除。然後,在另乙個執行緒中,它開始**記憶體。從多執行緒的角度來看,這是一種安全的操作,因為它(在主線程中)從鍵空間中刪除了該項,從而使redis其它命令無法訪問。

因此,您是否應該用unlink命令替換**中的所有del命令?當然,在少數情況下,del正是您所需要的。這裡我可以想到兩點:

1、   在multi / exec或pipeline中,在新增和刪除大值時del命令是一種理想選擇。在這種情況下,unlink不會立即釋放空間,並且在處理繁忙的情況下(如果記憶體已滿),您可能會遇到麻煩。

2、   在更緊急的情況下,在無快速響應驅逐資料下您可以寫入資料。

在沒有極端記憶體限制的理想環境中,很難想到不使用unlink的情況。unlink將提供更一致的行為,總體上具有更好的效能,並且**更改非常小(如果可以在客戶端中重新命名命令,則無需更改)。如果unlink適合您的應用程式,請就此將您的del更改為unlink,然後檢視它的效能提高。

Redis 4 0鮮為人知的功能將加速您的應用程式

redis 4.0給redis生態帶來了乙個驚人的功能 modules 模組 modules是redis的一大轉變,它是redis內部自定義資料型別和全速計算的開放環境。但是,儘管對該版本的大多數關注都集中在modules上,但新版本還引入了乙個非常重要的命令,它就是遊戲規則的改變者 unlink。...

redis 4 0新功能介紹

阿里雲redis4.0引擎是以社群4.0為基礎,合入大量阿里雲開發的特性以及bugfix後全新推出的售賣版本。除了擁有redis 2.8引擎所具備的所有優勢之外,還帶來了很多新功能。redis 4.0帶來的lazyfree機制可以避免del,flushdb flushall,rename等命令引起的...

鮮為人知的 Python 語法

所有人 好吧,不是所有人 都知道 python 是一門用途廣泛 易讀 而且容易入門的程式語言。但同時 python 語法也允許我們做一些很奇怪的事情。眾所周知 python 的 lambda 表示式不支援多行 但是可以模擬出多行 的效果。def f x string if x.endswith g ...