在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 大數(shù)據(jù)/ 從入門到精通(上)
使用 Redis 實現(xiàn) Twitter(上)
集群(下)
使用 Redis 實現(xiàn) Twitter(下)
使用 Redis 作為 LRU 緩存
高可用(上)
高可用客戶端指引
集群(中)
高可用(下)
持久化
Redis 介紹
集中插入
集群(上)
從入門到精通(上)
從入門到精通(下)
從入門到精通(中)
分片
數(shù)據(jù)類型初探
復(fù)制

從入門到精通(上)

Redis 不是一個無格式 (plain) 的鍵值存儲,而是一個支持各種不同類型值的數(shù)據(jù)結(jié)構(gòu)服務(wù)器。這就是說,傳統(tǒng)鍵值存儲是關(guān)聯(lián)字符串值到字符串鍵,但是 Redis 的值不僅僅局限于簡單字符串,還可以持有更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。下面列的是 Redis 支持的所有數(shù)據(jù)結(jié)構(gòu),后面將逐一介紹:

  • 二進制安全 (binary-safe) 的字符串。
  • 列表:按照插入順序排序的字符串元素 (element) 的集合 (collection)。通常是鏈表。
  • 集合:唯一的,無序的字符串元素集合。
  • 有序集合:和集合類似,但是每個字符串元素關(guān)聯(lián)了一個稱為分數(shù) (score) 的浮點數(shù)。元素總是按照分數(shù)排序,所以可以檢索一個范圍的元素 (例如,給我前 10,或者后 10 個元素)。
  • 哈希:由字段 (field) 及其關(guān)聯(lián)的值組成的映射。字段和值都是字符串類型。這非常類似于 Ruby 或 Python 中的哈希 / 散列。
  • 位數(shù)組 (位圖):使用特殊的命令,把字符串當(dāng)做位數(shù)組來處理:你可以設(shè)置或者清除單個位值,統(tǒng)計全部置位為 1 的位個數(shù),尋找第一個復(fù)位或者置位的位,等等。
  • 超重對數(shù) (HyperLogLog):這是一個用于估算集合的基數(shù) (cardinality,也稱勢,譯者注) 的概率性數(shù)據(jù)結(jié)構(gòu)。不要害怕,它比看起來要簡單,稍后為你揭曉。

理解這些數(shù)據(jù)結(jié)構(gòu)是如何工作的,以及從命令參考手冊中選擇什么命令來解決實際問題,并不總是一件繁瑣的事情,本文檔就是學(xué)習(xí) Redis 數(shù)據(jù)結(jié)構(gòu)及其最常用模式的速成班。

后面的所有例子我們都是使用 redis-cli 工具,這是一個簡單而又方便的命令行工具,用于發(fā)送命令給 Redis 服務(wù)器。

Redis 鍵 (Keys)

Redis 鍵是二進制安全的,這意味著你可以使用任何二進制序列作為鍵,從像”foo” 這樣的字符串到一個 JPEG 文件的內(nèi)容??兆址彩呛戏ǖ逆I。

關(guān)于鍵的其他一些規(guī)則:

  • 不要使用太長的鍵,例如,不要使用一個 1024 字節(jié)的鍵,不僅是因為內(nèi)存占用,而且在數(shù)據(jù)集中查找鍵時需要多次耗時的鍵比較。即使手頭需要匹配一個很大值的存在性,對其進行哈希 (例如使用 SHA1) 是個不錯的主意,尤其是從內(nèi)存和帶寬的角度。
  • 不要使用太短的鍵。用”u1000flw” 取代”user:1000:followers” 作為鍵并沒有什么實際意義,后者更具有可讀性,相對于鍵對象本身以及值對象來說,增加的空間微乎其微。然而不可否認,短的鍵會消耗少的內(nèi)存,你的任務(wù)就是要找到平衡點。
  • 堅持一種模式 (schema)。例如,”object-type:id” 就不錯,就像”user:1000”。點或者橫線常用來連接多單詞字段,如”comment:1234:reply.to”,或者”comment:1234:reply-to”。
  • 鍵的最大大小是 512MB。

Redis 字符串 (Strings)

Redis 字符串是可以關(guān)聯(lián)給 redis 鍵的最簡單值類型。字符串是 Memcached 的唯一數(shù)據(jù)類型,所以新手使用起來也是很自然的。

由于 Redis 的鍵也是字符串,當(dāng)我們使用字符串作為值的時候,我們是將一個字符串映射給另一個字符串。字符串?dāng)?shù)據(jù)類型適用于很多場景,例如,緩存 HTML 片段或者頁面。

讓我們用 redis-cli 來玩玩字符串類型 (接下來的例子都是使用 redis-cli)。

> set mykey somevalue  
OK  
> get mykey  
"somevalue"  

你可以看到,我們使用 SET 和 GET 命令設(shè)置和檢索字符串值。注意,如果鍵已經(jīng)存在,SET 會替換掉該鍵已經(jīng)存在的值,哪怕這個鍵關(guān)聯(lián)的是一個非字符串類型的值。SET 執(zhí)行的是賦值操作。

值可以是任何類型的字符串 (包括二進制數(shù)據(jù)),例如,你可以存儲一個 JPEG 圖像。值不能大于 512MB。

SET 命令還有一些以額外的參數(shù)形式提供有意思的選項。例如,如果我要求如果鍵存在 (或剛好相反) 則執(zhí)行失敗,也就是說健存在才成功:

> set mykey newval nx  
(nil)  
> set mykey newval xx  
OK  

盡管字符串是 Redis 最基本的值類型,你仍可以執(zhí)行很多有趣的操作。例如,原子性增長:

> set counter 100  
OK  
> incr counter  
(integer) 101  
> incr counter  
(integer) 102  
> incrby counter 50  
(integer) 152  

INCR 命令將字符串值解析為整數(shù),并增加一,最后賦值后作為新值。還有一些類似的命令 INCRBY,DECR 和 DECRBY。它們以略微不同的方式執(zhí)行,但其內(nèi)部都是一樣的命令。

為什么說 INCR 命令是原子的?因為即使多個 客戶端對同一個鍵發(fā)送 INCR 命令也不會造成競爭條件 (race condition)。例如,一定不會發(fā)生客戶端 1 和客戶端 2 同時讀到”10”,都增加到 11,然后設(shè)置新值為 11。最后的結(jié)果將會一直是 12,讀 - 增加 - 寫操作在執(zhí)行時,其他客戶端此時不會執(zhí)行相關(guān)命令。

有許多操作字符串的命令。例如,GETSET 命令給鍵設(shè)置一個新值,同時返回舊值。你可以使用這個命令,例如,如果你有一個系統(tǒng),每當(dāng)收到一個訪問請求就使用 INRC 來增加一個鍵。你想每隔一個小時收集一次這個信息,而不想漏掉任何一個增長。你可以使用 GETSET,將新值賦值為 0,人后讀取其舊值。

在一個命令中一次設(shè)置或者檢索多個鍵有利于減少延遲。為此有了 MSET 和 MGET 命令:

> mset a 10 b 20 c 30  
OK  
> mget a b c  
1) "10"  
2) "20"  
3) "30"  

當(dāng)使用 MSET 時,Redis 返回一個值數(shù)組。

改變和查詢鍵空間 (key space)

有一些命令并不定義在特定的類型上,但是對鍵空間的交互很有用,因此他們能作用在任意鍵上。

例如,EXISTS 命令返回 1 或者 0,來表示鍵在數(shù)據(jù)庫中是否存在。另外,DEL 命令刪除鍵及其關(guān)聯(lián)的值,無論值是什么。

> set mykey hello  
OK  
> exists mykey  
(integer) 1  
> del mykey  
(integer) 1  
> exists mykey  
(integer) 0  

從上面的例子中我們還可以看到,DEL 命令本身也會返回 1 或者 0,無論鍵是(存在)否(不存在)刪除。

有許多鍵空間相關(guān)的命令,但是上面兩個命令與 TYPE 命令關(guān)系緊密,TYPE 命令返回某個鍵的值的類型。

> set mykey x  
OK  
> type mykey  
string  
> del mykey  
(integer) 1  
> type mykey  
none  

Redis 過期 (expires):有限生存時間的鍵

在我們繼續(xù)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)之前,我們先拋出一個與類型無關(guān)的特性, 稱為 Redis 過期 。你可以給鍵設(shè)置超時,也就是一個有限的生存時間。當(dāng)生存時間到了,鍵就會自動被銷毀,就像用戶調(diào)用 DEL 命令一樣。

快速過一下 Redis 過期的信息:

  • 過期時間可以設(shè)置為秒或者毫秒精度。
  • 過期時間分辨率總是 1 毫秒。
  • 過期信息被復(fù)制和持久化到磁盤,當(dāng) Redis 停止時時間仍然在計算 (也就是說 Redis 保存了過期時間)。

設(shè)置過期非常簡單:

> set key some-value  
OK  
> expire key 5  
(integer) 1  
> get key (immediately)  
"some-value"  
> get key (after some time)  
(nil)  

鍵在兩次 GET 調(diào)用期間消失了,因為第二次調(diào)用推遲了超過 5 秒。在上面的例子中,我們使用 EXPIRE 命令設(shè)置過期 (也可以為一個已經(jīng)設(shè)置過期時間的鍵設(shè)置不同的過期時間,就像 PERSIST 命令可以刪除過期時間使鍵永遠存在)。當(dāng)然我們也可以使用其他 Redis 命令來創(chuàng)建帶過期時間的鍵。例如使用 SET 選項:

> set key 100 ex 10  
OK  
> ttl key  
(integer) 9  

上面的例子中設(shè)置 10 秒過期的鍵,值為字符串 100。然后使用 TTL 命令檢查鍵的生存剩余時間。

為了使用毫秒來設(shè)置和檢查過期,請查看 PEXPIRE 和 PTTL 命令,以及 SET 命令的全部選項。