Databases
Redis擁有與關係型資料庫一樣的基礎概念。典型的使用場景就是將一個應用的所有資料歸在一起,以與其他應用的資料區分開。
Redis中的資料庫用數字作為標示符,預設資料庫的標示為0。使用下面的命令選擇具體的資料庫:
select <number of a database>
Commands, Keys and Values
在Redis中,key可以包含strings, hashes, lists, sets, sorted sets, bitmaps以及hyperloglogs。但就目前來說,知道key看起來像 “users:leto” 就夠了。其中leto是使用者名稱,冒號沒有任何特殊含義,但就Redis而言,使用分隔符是一種常見的組織key的方式。
value可以是任何東西,字串、數字、或序列化後的物件(例如:xml、json或其他格式)。多數情況下,Redis會把它們當位元組陣列對待,而不會關心它們具體是什麼。
往Redis存入一個鍵值對:
set <key> <value>
# 示例
set users:leto `{"name": "leto", "planet": "dune", "likes": ["spice"]}`
根據key讀取值:
get users:leto
Querying
Redis不支援對值進行查詢,比如查詢居住在dune星球上的使用者。因為Redis從不需要去讀取或理解儲存的值,所以值才可以是任何東西。記住這點有助於我們在這個新世界中將心思放在考慮如何建模上。
Memory and Persistence
Redis是記憶體持久儲存(in-memory persistent store)。說到持久化,預設情況下,Redis根據有多少key已經變化來決定是否需要對資料庫做快照並儲存至磁碟。你可以為它配置這樣的快照策略:如果X個key發生了變化,就每Y秒儲存一次資料庫。預設策略為,如果1000個或更多的key發生了變化,就每60秒儲存一次快照;如果9個或更少的key發生變化,就每15分鐘做一次。
除了定時快照儲存,Redis還可以執行在append模式(append mode)。任何時候,只要key發生了變化,磁碟上一個只可追加的(append-only)檔案就會被更新。在一些情況下,丟失60秒的資料以換得效能是可接受的,因為可能會發生硬體或軟體失敗。但在一些情況下,這樣的丟失又是不可接受的。Redis給我們提供了這些選擇。第三種選擇就是讓slave節點去做持久化工作。
說到記憶體,Redis將所有資料保持在記憶體中。這就意味著執行Redis的成本比較高,畢竟RAM仍然是伺服器硬體中最昂貴的部分。
一些開發者已經對資料會佔用多小的空間失去了感覺,莎士比亞的所有作品大概佔用5.5M,壓縮後降至2。至於可伸縮性(scaling),其他方案趨向受限於IO或CPU(IO- or CPU-bound)。哪個限制 (RAM or IO) 將需要你擴充套件出更多的機器實際上取決於你資料的型別和你正在任何儲存和查詢它。除非你正在儲存大的多媒體檔案,否則儲存資料在記憶體中很可能不是什麼問題。對於那些這一點確實是個問題的應用,你可能需要使用IO-bound的方案,而非memory-bound。
此外,還可考慮對儲存資料進行壓縮或解壓縮,以處理時間換取RAM。
Redis雖然支援虛擬記憶體,但是這個特性被Redis開發者看做是一個失敗,不贊成使用該特性。