## 開發者、客戶、用戶
本文檔中會經常提到如下幾個角色。
開發者是云存儲服務的使用者,因此在文檔中提到的客戶等同于開發者。
用戶則是開發者所推出產品的直接使用者,也是云存儲服務的間接使用者。

## 鍵值對(Key-Value)
鍵值對(Key-Value,簡稱KV)是一個常用的數據結構概念,通常又被稱為字典(Dictionary)或映射(Map)。每個存放到該數據結構中的數據(Value)都對應到一個全局唯一的鍵(Key)。該數據結構的特征是以空間換時間,通過鍵查詢值通常是比較快速的過程。
在存儲系統中,鍵值對是和樹形文件系統(File System,簡稱FS)對應的一個概念。樹形文件系統的特征是以文件夾和文件的方式管理存儲內容。一般人所了解的文件系統類型,比如Windows系統的FAT32和NTFS、Linux系統的EXT3等,都是樹形文件系統的典型實現。
在IT系統演進早期,樹形文件系統比較符合常規使用場景,令用戶可以對大量內容進行有效歸類管理,比如桌面操作系統通常會缺省創建這些文件夾:圖片、視頻、文檔、下載等。但當系統內的節點(即文件和文件夾)數量達到某個級數后,系統性能將急劇下降到不可用的程度,因此文件系統在設計時一般會對文件夾中可包含的子節點數目設置一個上限。
在設計海量存儲系統時,樹形文件系統的兩個缺陷就會凸顯出來:性能限制、無法橫向無限擴展。在這種考慮下,海量存儲系統一般設計為鍵值對方式。鍵可以是一個任意字符串(有些設計中可能會保留一些字符),值就是一個具體文件。寫入文件時,用戶可以自行指定鍵(比如看起來接近于文件系統的格式:`data/imgs/2011/1/1/img001.jpg`),或者讓存儲系統自動生成一個唯一的鍵并返回給上傳端。使用者只需要知道下載出口的域名,而無需了解文件具體會被存放到哪個機房的哪個設備,也無需知道具體存放形式。要讀取時用標準的HTTP GET方式訪問對應的URL即可,如:
~~~
GET http://imgs.qiniu.com/data/imgs/2011/1/1/img001.jpg
~~~
## 資源(Resource)
`資源`是七牛云存儲服務中的邏輯存儲單元。對于每一個賬號,該賬號里存放的每個資源都有唯一的一對`屬主空間`(Bucket)與`鍵名`(Key),作為識別標識。
資源鍵名是一個字符串,大部分情況下接近于Linux文件路徑的風格,比如:`level1/level2/example1.jpg`。但在七牛云存儲中并沒有路徑的概念,因此這個鍵名并不表示目錄`level1/level2/`下的一個名為`example1.jpg`的文件,而是該鍵名就是這樣一個完整的字符串。因此,與Linux文件路徑不同,資源的標識符可以包含任意字符(包括UTF-8編碼形式的Unicode字符)。
使用者可以在上傳資源時為其指定一個方便管理的鍵名,通過設計好的前綴來達到類似于文件目錄的分類和層次效果。比如對于一個網站的資源,我們可以命名如下的資源列表:
~~~
index.html
features/index.html
features/feature1.html
features/feature2.html
imgs/features/feature1.png
imgs/features/feature2.png
about.html
~~~
假設這些資源都位于某個綁定了域名`example.com`的公開空間中,則用戶可以通過組合這樣的URL訪問這些資源:
~~~
http://www.example.com/features/index.html
~~~
或省略掉`index.html`,如下:
~~~
http://www.example.com/features/
~~~
## 空間(Bucket)
`空間`是資源的組織管理單位,一個資源必然位于某個空間中。可以為每個空間設置一系列的屬性,以對資源提供合理的管理動作。
常見的屬性有如下:
* 將空間設置為`公開`或`私有`,以控制空間內資源的訪問權限;
* 設置資源的數據處理樣式(Style),以便于用簡短方式對資源進行處理。
## 數據處理(Fop)
`數據處理`是七牛云存儲提供的一種強大的數據處理機制。開發者可以在上傳或訪問資源時觸發數據處理流程,從而得到資源進行按需變換后的結果。
數據處理的執行非常簡單,就是在資源請求中加上數據處理動作和參數,比如以下的URL對圖片進行縮放,就是調用了一個名為`imageView`的數據處理操作:
~~~
http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView/2/w/200/h/200
~~~
多個數據處理操作可以通過管道(Pipe)進行連接,實現級聯操作,每一級的輸出作為下一級的輸入。比如我們可以在一次請求中完成先對圖片進行縮放,然后再在圖片右下角添加一個透明圖片水印,其中縮放和添加水印分別是一個數據處理操作。
~~~
http://qiniuphotos.qiniudn.com/gogopher.jpg?imageView/2/w/400
|watermark/1/image/aHR0cDovL3d3dy5iMS5xaW5pdWRuLmNvbS9pbWFnZXMvbG9nby0yLnBuZw==
~~~
## 數據處理樣式(Fop Style)
如果覺得`url?<fop1>|<fop2>|<fop3>|<fopN>`這種形式過于冗長,還可以為這些串行的`<fop>`集合定義一個友好別名,之后可以用這個友好的別名來取代冗長的指令和參數。我們稱這個別名為`樣式`。樣式是對一個或一組數據處理操作的命名。
還以上一個Fop處理的URL為例,看起來非常長且難以理解目的。我們可以定義一個名為`watermark`的樣式,對應以上的數據處理操作:
~~~
imageView/2/w/400 |watermark/1/image/aHR0cDovL3d3dy5iMS5xaW5pdWRuLmNvbS9pbWFnZXMvbG9nby0yLnBuZw==?
~~~
,則之后我們可以用如下使用方式進行訪問:
~~~
http://qiniuphotos.qiniudn.com/gogopher.jpg-watermark
~~~
顯然簡潔很多也方便很多(注:上面的 "`-`" 我們稱為數據處理樣式的分隔符)。