Redis 是一個用 C 寫成的鍵值資料庫,顧名思義:儲存「鍵(Key)」與「值(Value)」的資料庫。
可以將 Redis 想像成一個巨大的 Hashmap,但它具有:資料持久化(服務關閉後,資料不會消失)以及能夠在不同的服務之間共享資料(無論是不是在同一台主機上)的特性。
Redis 的效能非常優異,這得益於它的開發者有著深厚的 C 語言功力與出色的資料結構及演算法實作。
我曾經在 2022 年撰文 Redis 字串研究,由此可以一窺 Redis 開發者對資料結構的設計具有獨到的見解。
不過 Redis 在效能上也並非一騎絕塵:這邊以 Valkey 與 Garnet 為例。
Valkey 是一個知名的 Redis 分支。當時在 Redis 8 發佈時更改了授權條款,以致於社群基於 7.2.4 分支開發,並獲得 Linux 基金會的支持。
Valkey 在 Redis 效能的基礎上再更進一步,可以從 Performance Optimization Methodology for Valkey - Part 1 等系列文章中看到一些 Valkey 對 Redis 的最佳化手段。
Garnet 則是微軟研究院的開源產物,它用一種截然不同的思路:用 C# 做出一個相容於 Redis 的服務--這其實很反直覺,因為絕大多數人都會認為相對低階的 C 語言應該比高階的 C# 擁有更好的效能。
我個人傾向於認為這個是微軟的「火力展示」,在 Faster: A Concurrent Key-Value Store with In-Place Updates 這篇論文提到他們如何用 C# 打造一個高效能的鍵值資料結構 Faster,而這個正是 Garnet 的基礎之一。
藉由選用更高效能的資料結構與演算法,再加上足夠優秀的編譯器,完全可以達成用高階語言勝過低階語言效能的目標。
從近年的 Redis 版本特性來看,Redis 並不想只做一個單純的鍵值資料庫。
為了營利,Redis 提供許多閉源的進階付費功能;而開源版本的也為了追逐 AI 這塊大餅而加入了許多功能:例如在 Redis 8 加入的 Vector Sets 很明顯地是為了服務機器學習。
註:這邊說明一下,技術沒有對錯,只有選擇的道路不同。我並不完全認可 Redis 的技術路線,但是完全能夠理解他們的決策。