上個月,Redis舉辦了3場線上會議,分別介紹了即將正式釋出的Redis 7中包括的重要更新的內容,還有Redis完全重寫的RedisJSON 2.0模組,和新發布的Redis Stack模組。除此之外,在此次線上會議中還介紹了現代化的軟體架構與Redis是如何緊密結合在一起,例如Redis與Machine Learning或者人工智慧的結合。下面讓我們來具體看一下在會議中提到的具體內容吧。下面我們來看一個具體的例子:
首先,讓我們來看一下Redis 7提供的新特性
1、Redis Functions: 在Redis 7.0中作為Lua指令碼的升級內容
在2012年釋出的Redis2.6中,Redis引入了Lua指令碼這個概念。Lua指令碼概念的引入使得Redis中的資料與客戶的應用程式結合的更加緊密,但是不可否則,Lua指令碼依然有它的侷限性:Lua指令碼是存在於使用者端應用程式中的,一旦使用者端應用重新啟動,那麼Lua指令碼需要重新載入,這樣就增加了對使用者端應用程式的程式碼量與程式設計師維護程式的成本。為了解決這些問題,Redis 7.0加入了Redis Functions這個概念,Redis Functions可支援持久化,可複製,並且在節點重啟之後可以直接從server端讀取,並且還提供未來多種語言的API支援(目前只支援Lua)。下面我們來看一個具體的例子:
圖一:是一個名字為myscript.lua 的Lua指令碼檔案
我們可以看到當指令碼成功執行,server端的log顯示:Execution started 和Execution ended。圖二:是這個指令碼檔案在使用者端執行的情況
當server被重啟後,這個Lua指令碼如果不重新載入,那麼它不會被執行,會顯示錯誤資訊。
圖三:顯示資訊
那麼下面我們來看一下如果是Redis Functions,執行的情況是什麼樣的。首先讓我們來看一下Lua指令碼和Redis Functions指令碼的共同點和區別。下圖是一個名為mylib.lua的Redis Functions指令碼與之前的Lua指令碼的一個對比。我們可以看到,唯一的不同是在Redis Functions中執行了一條語句:redis.register_function(「hgetset」, hgetset);
圖四:前後對比
我們看到使用者端首先執行: redis-cli –x FUNCTION LOAD Lua mylib 將這個mylib載入進Redis 伺服器端,然後呼叫redis-cli FCALL hgetset 1 myhash myfield 「some other value」 去呼叫這個函數,最後我們可以看到成功的被執行了。
在server被重新啟動之後,如果我們直接執行redis-ci FCALL …. 去呼叫這個函數,mylib中的函數依然可以執行成功,而不需要像Lua指令碼那樣重新載入。
2、ACL Selectors: 對於Redis 6.0 ACL功能的擴充套件(V1),可以支援更豐富和更方便的許可權設定
在Redis 7 之前的ACL功能具有很多限制:例如一個使用者不能對不同的鍵設定不同的許可權(permissions);或者使用者也不能對不同的鍵賦予不同的讀寫許可權。在Redis 7中的ACL V2中,這些方面得到了進一步的改善:新增加了一個selector的概念,這個概念是將一系列的許可權規則放在一起作為一個整體來執行(Selectors are a collection of authorization rules that are evaluated as a group), 並且使用者可以執行命名以root許可權執行或者作為某一個selector來執行(A user can execute a command if either the root permission or any selector authorizes the commands)。另外,在ACL V2中,Redis 新增了使用者對鍵(key based)的許可權控制能力,下面我們來看一個具體的例子:基於Selector的例子,我們可以看到基於MADELYN使用者,它對於itamar_q 是有LPOP操作許可權而沒有LPUSH操作許可權的,但是對於madelyn_q是有LPUSH操作許可權的。
基於key based 許可權的例子
3、在叢集方面
增加了對分片的Pub/Sub支援,並且還增加了對主機名的支援。
4、在底層資料結構中
使用listpacks替換了ziplists,並且使用了RDB 10的格式。
5、對於AOF檔案,使用了多AOF機制
使得在重寫過程中使用更少的記憶體和佔用更低的I/O;第二個特點是在AOF中增加了每個鍵值對所對應的時間戳,為之後的Redis版本提供回滾和恢復提供了很好的支援。
RedisJSON 2.0
RedisJSON 2.0是由RUST完全重寫的,它比上一個版本提供了更強的效能,更好的穩定性和更低的記憶體佔用率。同時,RedisJSON2.0 對檔案中的特定內容提供了JSONPath的語法支援。新的版本具有以下新特點:1.支援檔案中子元素(sub-element)的更新。這種能力基於使用了JSON 資料交換格式(ECMA 404)作為後設資料型別對子元素執行原子化的更新操作,其結果是大大提高的開發者的效率並且加快了應用程式的相應速度2.RediSearch可以支援索引(index),可以在JSON檔案中進行全文查詢3.新版本不但對大多數流行的主流語言(JavaScript, Python, Java C#)和平臺(Spring, ASP.NET, Node.js, DJango)提供支援,而且還對RedisInsight提供良好的GUI和入門指導下面提供一個具體的例子來說明一下以上提到的特點:
更新user = 1 的score部分從5到100
更新user = 1 的內嵌的profile的屬性name為Sue
為user=1的屬性friends陣列增加user:3
如果想了解更多關於RedisJSON2.0的內容,可以檢視連結:
https://redis.com/press/redisjson-2-0-serves-as-fast-flexible-document-database/
Redis Stack在此次RedisDay中,Redis官方几乎花了2個小時全方面的介紹了Redis Stack,並列舉了幾個具體的例子來說明Redis Stack是如何與應用程式結合的。
事實上,Redis Stack一個Redis對於資料模型和處理引擎的擴充套件模組。它支援可查詢的JSON檔案,基於時間序列的資料的操作等功能。並且,Redis Stack還包括了RedisInsight,一個Redis的視覺化工具。
如果想了解更多的關於Redis Stack的內容,可以檢視連結(https://redis.io/docs/stack/)及我們後續關於Redis Stack專題的部落格。
除了以上內容,在這3天的RedisDay中還介紹了一些Redis與人工智慧,機器學習相關的應用與API,有感興趣的各位讀者可以登入Redis網站去觀看相關視訊:
https://redis.com/redisdays/,謝謝您繼續關注我們關於Redis的相關文章。
*注:本文所有圖片和例子都取自於RedisDays中的視訊,感謝Redis 開源社群所有貢獻者對Redis所作的貢獻。