[轉(zhuǎn)]Cassandra、MongoDB章蚣、CouchDB站欺、Redis、Riak纤垂、HBase比較


CouchDB

Written in: Erlang
Main point: DB consistency, ease of use
License: Apache
Protocol: HTTP/REST
Bi-directional (!) replication,
continuous or ad-hoc,
with conflict detection,
thus, master-master replication. (!)
MVCC – write operations do not block reads
Previous versions of documents are available
Crash-only (reliable) design
Needs compacting from time to time
Views: embedded map/reduce
Formatting views: lists & shows
Server-side document validation possible
Authentication possible
Real-time updates via _changes (!)
Attachment handling
thus, CouchApps (standalone js apps)
jQuery library included

Best used: For accumulating, occasionally changing data, on which pre-defined queries are to be run. Places where versioning is important.
For example: CRM, CMS systems. Master-master replication is an especially interesting feature, allowing easy multi-site deployments.


Redis

Written in: C/C++
Main point: Blazing fast
License: BSD
Protocol: Telnet-like
Disk-backed in-memory database,
but since 2.0, it can swap to disk.
Master-slave replication
Simple keys and values,
but complex operations like ZREVRANGEBYSCORE
INCR & co (good for rate limiting or statistics)
Has sets (also union/diff/inter)
Has lists (also a queue; blocking pop)
Has hashes (objects of multiple fields)
Of all these databases, only Redis does transactions (!)
Values can be set to expire (as in a cache)
Sorted sets (high score table, good for range queries)
Pub/Sub and WATCH on data changes (!)

Best used: For rapidly changing data with a foreseeable database size (should fit mostly in memory).
For example: Stock prices. Analytics. Real-time data collection. Real-time communication.


MongoDB

Written in: C++
Main point: Retains some friendly properties of SQL. (Query, index)
License: AGPL (Drivers: Apache)
Protocol: Custom, binary (BSON)
Master/slave replication
Queries are javascript expressions
Run arbitrary javascript functions server-side
Better update-in-place than CouchDB
Sharding built-in
Uses memory mapped files for data storage
Performance over features
After crash, it needs to repair tables
Better durablity coming in V1.8

Best used: If you need dynamic queries. If you prefer to define indexes, not map/reduce functions. If you need good performance on a big DB. If you wanted CouchDB, but your data changes too much, filling up disks.
For example: For all things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back.


Cassandra

Written in: Java
Main point: Best of BigTable and Dynamo
License: Apache
Protocol: Custom, binary (Thrift)
Tunable trade-offs for distribution and replication (N, R, W)
Querying by column, range of keys
BigTable-like features: columns, column families
Writes are much faster than reads (!)
Map/reduce possible with Apache Hadoop
I admit being a bit biased against it, because of the bloat and complexity it has partly because of Java (configuration, seeing exceptions, etc)

Best used: When you write more than you read (logging). If every component of the system must be in Java. (“No one gets fired for choosing Apache’s stuff.”)
For example: Banking, financial industry (though not necessarily for financial transactions, but these industries are much bigger than that.) Writes are faster than reads, so one natural niche is real time data analysis.


Riak

Written in: Erlang & C, some Javascript
Main point: Fault tolerance
License: Apache
Protocol: HTTP/REST
Tunable trade-offs for distribution and replication (N, R, W)
Pre- and post-commit hooks,
for validation and security.
Built-in full-text search
Map/reduce in javascript or Erlang
Comes in “open source” and “enterprise” editions

Best used: If you want something Cassandra-like (Dynamo-like), but no way you’re gonna deal with the bloat and complexity. If you need very good single-site scalability, availability and fault-tolerance, but you’re ready to pay for multi-site replication.
For example: Point-of-sales data collection. Factory control systems. Places where even seconds of downtime hurt.


HBase

Written in: Java
Main point: Billions of rows X millions of columns
License: Apache
Protocol: HTTP/REST (also Thrift)
Modeled after BigTable
Map/reduce with Hadoop
Query predicate push down via server side scan and get filters
Optimizations for real time queries
A high performance Thrift gateway
HTTP supports XML, Protobuf, and binary
Cascading, hive, and pig source and sink modules
Jruby-based (JIRB) shell
No single point of failure
Rolling restart for configuration changes and minor upgrades
Random access performance is like MySQL

Best used: If you’re in love with BigTable. :) And when you need random, realtime read/write access to your Big Data.
For example: Facebook Messaging Database (more general example coming soon)


原文鏈接:Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison

導(dǎo)讀:Kristóf Kovács 是一位軟件架構(gòu)師和咨詢顧問(wèn)矾策,他最近發(fā)布了一片對(duì)比各種類型NoSQL數(shù)據(jù)庫(kù)的文章。文章由敏捷翻譯 – 唐尤華編譯峭沦。如需轉(zhuǎn)載贾虽,請(qǐng)參見文后聲明。

雖然SQL數(shù)據(jù)庫(kù)是非常有用的工具吼鱼,但經(jīng)歷了15年的一支獨(dú)秀之后壟斷即將被打破蓬豁。這只是時(shí)間問(wèn)題:被迫使用關(guān)系數(shù)據(jù)庫(kù),但最終發(fā)現(xiàn)不能適應(yīng)需求的情況不勝枚舉菇肃。

但是NoSQL數(shù)據(jù)庫(kù)之間的不同地粪,遠(yuǎn)超過(guò)兩 SQL數(shù)據(jù)庫(kù)之間的差別。這意味著軟件架構(gòu)師更應(yīng)該在項(xiàng)目開始時(shí)就選擇好一個(gè)適合的 NoSQL數(shù)據(jù)庫(kù)琐谤。針對(duì)這種情況蟆技,這里對(duì) Cassandra、 Mongodb斗忌、CouchDB质礼、Redis、 Riak织阳、 Membase眶蕉、Neo4j和HBase進(jìn)行了比較:

(編注1:NoSQL:是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ)∵蠖悖現(xiàn)今的計(jì)算機(jī)體系結(jié)構(gòu)在數(shù)據(jù)存儲(chǔ)方面要求具 備龐大的水平擴(kuò) 展性造挽,而NoSQL致力于改變這一現(xiàn)狀碱璃。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型數(shù)據(jù)庫(kù)。 參見NoSQL詞條刽宪。)


1. CouchDB
所用語(yǔ)言: Erlang
特點(diǎn):DB一致性厘贼,易于使用
使用許可: Apache
協(xié)議: HTTP/REST
雙向數(shù)據(jù)復(fù)制界酒,
持續(xù)進(jìn)行或臨時(shí)處理圣拄,
處理時(shí)帶沖突檢查,
因此毁欣,采用的是master-master復(fù)制(見編注2)
MVCC – 寫操作不阻塞讀操作
可保存文件之前的版本
Crash-only(可靠的)設(shè)計(jì)
需要不時(shí)地進(jìn)行數(shù)據(jù)壓縮
視圖:嵌入式 映射/減少
格式化視圖:列表顯示
支持進(jìn)行服務(wù)器端文檔驗(yàn)證
支持認(rèn)證
根據(jù)變化實(shí)時(shí)更新
支持附件處理
因此庇谆, CouchApps(獨(dú)立的 js應(yīng)用程序)
需要 jQuery程序庫(kù)

最佳應(yīng)用場(chǎng)景:適用于數(shù)據(jù)變化較少,執(zhí)行預(yù)定義查詢凭疮,進(jìn)行數(shù)據(jù)統(tǒng)計(jì)的應(yīng)用程序饭耳。適用于需要提供數(shù)據(jù)版本支持的應(yīng)用程序。

例如: CRM执解、CMS系統(tǒng)寞肖。 master-master復(fù)制對(duì)于多站點(diǎn)部署是非常有用的。

(編注2:master-master復(fù)制:是一種數(shù)據(jù)庫(kù)同步方法衰腌,允許數(shù)據(jù)在一組計(jì)算機(jī)之間共享數(shù)據(jù)新蟆,并且可以通過(guò)小組中任意成員在組內(nèi)進(jìn)行數(shù)據(jù)更新。)


2.Redis
所用語(yǔ)言:C/C++
特點(diǎn):運(yùn)行異秤胰铮快
使用許可: BSD
協(xié)議:類 Telnet
有硬盤存儲(chǔ)支持的內(nèi)存數(shù)據(jù)庫(kù)琼稻,
但自2.0版本以后可以將數(shù)據(jù)交換到硬盤(注意, 2.4以后版本不支持該特性H那簟)
Master-slave復(fù)制(見編注3)
雖然采用簡(jiǎn)單數(shù)據(jù)或以鍵值索引的哈希表帕翻,但也支持復(fù)雜操作,例如 ZREVRANGEBYSCORE萝风。
INCR & co (適合計(jì)算極限值或統(tǒng)計(jì)數(shù)據(jù))
支持 sets(同時(shí)也支持 union/diff/inter)
支持列表(同時(shí)也支持隊(duì)列嘀掸;阻塞式 pop操作)
支持哈希表(帶有多個(gè)域的對(duì)象)
支持排序 sets(高得分表,適用于范圍查詢)
Redis支持事務(wù)
支持將數(shù)據(jù)設(shè)置成過(guò)期數(shù)據(jù)(類似快速緩沖區(qū)設(shè)計(jì))
Pub/Sub允許用戶實(shí)現(xiàn)消息機(jī)制

最佳應(yīng)用場(chǎng)景:適用于數(shù)據(jù)變化快且數(shù)據(jù)庫(kù)大小可遇見(適合內(nèi)存容量)的應(yīng)用程序规惰。

例如:股票價(jià)格睬塌、數(shù)據(jù)分析、實(shí)時(shí)數(shù)據(jù)搜集卿拴、實(shí)時(shí)通訊衫仑。

(編注3:Master-slave復(fù)制:如果同一時(shí)刻只有一臺(tái)服務(wù)器處理所有的復(fù)制請(qǐng)求,這被稱為 Master-slave復(fù)制堕花,通常應(yīng)用在需要提供高可用性的服務(wù)器集群文狱。)


3.MongoDB
所用語(yǔ)言:C++
特點(diǎn):保留了SQL一些友好的特性(查詢,索引)缘挽。
使用許可: AGPL(發(fā)起者: Apache)
協(xié)議: Custom, binary( BSON)
Master/slave復(fù)制(支持自動(dòng)錯(cuò)誤恢復(fù)瞄崇,使用 sets 復(fù)制)
內(nèi)建分片機(jī)制
支持 javascript表達(dá)式查詢
可在服務(wù)器端執(zhí)行任意的 javascript函數(shù)
update-in-place支持比CouchDB更好
在數(shù)據(jù)存儲(chǔ)時(shí)采用內(nèi)存到文件映射
對(duì)性能的關(guān)注超過(guò)對(duì)功能的要求
建議最好打開日志功能(參數(shù) –journal)
在32位操作系統(tǒng)上呻粹,數(shù)據(jù)庫(kù)大小限制在約2.5Gb
空數(shù)據(jù)庫(kù)大約占 192Mb
采用 GridFS存儲(chǔ)大數(shù)據(jù)或元數(shù)據(jù)(不是真正的文件系統(tǒng))

最佳應(yīng)用場(chǎng)景:適用于需要?jiǎng)討B(tài)查詢支持;需要使用索引而不是 map/reduce功能苏研;需要對(duì)大數(shù)據(jù)庫(kù)有性能要求等浊;需要使用 CouchDB但因?yàn)閿?shù)據(jù)改變太頻繁而占滿內(nèi)存的應(yīng)用程序。

例如:你本打算采用 mysql或 PostgreSQL摹蘑,但因?yàn)樗鼈儽旧碜詭У念A(yù)定義欄讓你望而卻步筹燕。


4. Riak
所用語(yǔ)言:Erlang和C,以及一些Javascript
特點(diǎn):具備容錯(cuò)能力
使用許可: Apache
協(xié)議: HTTP/REST或者 custom binary
可調(diào)節(jié)的分發(fā)及復(fù)制(N, R, W)
用 JavaScript or Erlang在操作前或操作后進(jìn)行驗(yàn)證和安全支持衅鹿。
使用JavaScript或Erlang進(jìn)行 Map/reduce
連接及連接遍歷:可作為圖形數(shù)據(jù)庫(kù)使用
索引:輸入元數(shù)據(jù)進(jìn)行搜索(1.0版本即將支持)
大數(shù)據(jù)對(duì)象支持( Luwak)
提供“開源”和“企業(yè)”兩個(gè)版本
全文本搜索撒踪,索引,通過(guò) Riak搜索服務(wù)器查詢( beta版)
支持Masterless多站點(diǎn)復(fù)制及商業(yè)許可的 SNMP監(jiān)控

最佳應(yīng)用場(chǎng)景:適用于想使用類似 Cassandra(類似Dynamo)數(shù)據(jù)庫(kù)但無(wú)法處理 bloat及復(fù)雜性的情況大渤。適用于你打算做多站點(diǎn)復(fù)制制妄,但又需要對(duì)單個(gè)站點(diǎn)的擴(kuò)展性,可用性及出錯(cuò)處理有要求的情況泵三。

例如:銷售數(shù)據(jù)搜集耕捞,工廠控制系統(tǒng);對(duì)宕機(jī)時(shí)間有嚴(yán)格要求烫幕;可以作為易于更新的 web服務(wù)器使用俺抽。


5. Membase
所用語(yǔ)言: Erlang和C
特點(diǎn):兼容 Memcache,但同時(shí)兼具持久化和支持集群
使用許可: Apache 2.0
協(xié)議:分布式緩存及擴(kuò)展
非澄诚迹快速(200k+/秒)凌埂,通過(guò)鍵值索引數(shù)據(jù)
可持久化存儲(chǔ)到硬盤
所有節(jié)點(diǎn)都是唯一的( master-master復(fù)制)
在內(nèi)存中同樣支持類似分布式緩存的緩存單元
寫數(shù)據(jù)時(shí)通過(guò)去除重復(fù)數(shù)據(jù)來(lái)減少 IO
提供非常好的集群管理 web界面
更新軟件時(shí)軟無(wú)需停止數(shù)據(jù)庫(kù)服務(wù)
支持連接池和多路復(fù)用的連接代理

最佳應(yīng)用場(chǎng)景:適用于需要低延遲數(shù)據(jù)訪問(wèn),高并發(fā)支持以及高可用性的應(yīng)用程序

例如:低延遲數(shù)據(jù)訪問(wèn)比如以廣告為目標(biāo)的應(yīng)用诗芜,高并發(fā)的 web 應(yīng)用比如網(wǎng)絡(luò)游戲(例如 Zynga)


6. Neo4j
所用語(yǔ)言: Java
特點(diǎn):基于關(guān)系的圖形數(shù)據(jù)庫(kù)
使用許可: GPL瞳抓,其中一些特性使用 AGPL/商業(yè)許可
協(xié)議: HTTP/REST(或嵌入在 Java中)
可獨(dú)立使用或嵌入到 Java應(yīng)用程序
圖形的節(jié)點(diǎn)和邊都可以帶有元數(shù)據(jù)
很好的自帶web管理功能
使用多種算法支持路徑搜索
使用鍵值和關(guān)系進(jìn)行索引
為讀操作進(jìn)行優(yōu)化
支持事務(wù)(用 Java api)
使用 Gremlin圖形遍歷語(yǔ)言
支持 Groovy腳本
支持在線備份,高級(jí)監(jiān)控及高可靠性支持使用 AGPL/商業(yè)許可

最佳應(yīng)用場(chǎng)景:適用于圖形一類數(shù)據(jù)伏恐。這是 Neo4j與其他nosql數(shù)據(jù)庫(kù)的最顯著區(qū)別

例如:社會(huì)關(guān)系孩哑,公共交通網(wǎng)絡(luò),地圖及網(wǎng)絡(luò)拓譜


7. Cassandra
所用語(yǔ)言: Java
特點(diǎn):對(duì)大型表格和 Dynamo支持得最好
使用許可: Apache
協(xié)議: Custom, binary (節(jié)約型)
可調(diào)節(jié)的分發(fā)及復(fù)制(N, R, W)
支持以某個(gè)范圍的鍵值通過(guò)列查詢
類似大表格的功能:列翠桦,某個(gè)特性的列集合
寫操作比讀操作更快
基于 Apache分布式平臺(tái)盡可能地 Map/reduce
我承認(rèn)對(duì) Cassandra有偏見横蜒,一部分是因?yàn)樗旧淼挠纺[和復(fù)雜性,也因?yàn)?Java的問(wèn)題(配置销凑,出現(xiàn)異常丛晌,等等)

最佳應(yīng)用場(chǎng)景:當(dāng)使用寫操作多過(guò)讀操作(記錄日志)如果每個(gè)系統(tǒng)組建都必須用 Java編寫(沒(méi)有人因?yàn)檫x用 Apache的軟件被解雇)

例如:銀行業(yè),金融業(yè)(雖然對(duì)于金融交易不是必須的斗幼,但這些產(chǎn)業(yè)對(duì)數(shù)據(jù)庫(kù)的要求會(huì)比它們更大)寫比讀更快澎蛛,所以一個(gè)自然的特性就是實(shí)時(shí)數(shù)據(jù)分析


8. Hbase
(配合 ghshephard使用)
所用語(yǔ)言: Java
特點(diǎn):支持?jǐn)?shù)十億行X上百萬(wàn)列
使用許可: Apache
協(xié)議:HTTP/REST (支持 Thrift,見編注4)
在 BigTable之后建模
采用分布式架構(gòu) Map/reduce
對(duì)實(shí)時(shí)查詢進(jìn)行優(yōu)化
高性能 Thrift網(wǎng)關(guān)
通過(guò)在server端掃描及過(guò)濾實(shí)現(xiàn)對(duì)查詢操作預(yù)判
支持 XML, Protobuf, 和binary的HTTP
Cascading, hive, and pig source and sink modules
基于 Jruby( JIRB)的shell
對(duì)配置改變和較小的升級(jí)都會(huì)重新回滾
不會(huì)出現(xiàn)單點(diǎn)故障
堪比MySQL的隨機(jī)訪問(wèn)性能

最佳應(yīng)用場(chǎng)景:適用于偏好BigTable:)并且需要對(duì)大數(shù)據(jù)進(jìn)行隨機(jī)蜕窿、實(shí)時(shí)訪問(wèn)的場(chǎng)合谋逻。

例如: Facebook消息數(shù)據(jù)庫(kù)(更多通用的用例即將出現(xiàn))

編注4:Thrift 是一種接口定義語(yǔ)言呆馁,為多種其他語(yǔ)言提供定義和創(chuàng)建服務(wù),由Facebook開發(fā)并開源毁兆。

當(dāng)然浙滤,所有的系統(tǒng)都不只具有上面列出的這些特性。這里我僅僅根據(jù)自己的觀點(diǎn)列出一些我認(rèn)為的重要特性气堕。與此同時(shí)纺腊,技術(shù)進(jìn)步是飛速的,所以上述的內(nèi)容肯定需要不斷更新送巡。我會(huì)盡我所能地更新這個(gè)列表摹菠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盒卸,一起剝皮案震驚了整個(gè)濱河市骗爆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔽介,老刑警劉巖摘投,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虹蓄,居然都是意外死亡犀呼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門薇组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)外臂,“玉大人,你說(shuō)我怎么就攤上這事律胀∷喂猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵炭菌,是天一觀的道長(zhǎng)罪佳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)黑低,這世上最難降的妖魔是什么赘艳? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮克握,結(jié)果婚禮上蕾管,老公的妹妹穿的比我還像新娘。我一直安慰自己菩暗,他們只是感情好掰曾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勋眯,像睡著了一般婴梧。 火紅的嫁衣襯著肌膚如雪下梢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天塞蹭,我揣著相機(jī)與錄音孽江,去河邊找鬼。 笑死番电,一個(gè)胖子當(dāng)著我的面吹牛岗屏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漱办,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼这刷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了娩井?” 一聲冷哼從身側(cè)響起暇屋,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洞辣,沒(méi)想到半個(gè)月后咐刨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬霜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年定鸟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片著瓶。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡联予,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出材原,到底是詐尸還是另有隱情沸久,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布华糖,位于F島的核電站麦向,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏客叉。R本人自食惡果不足惜诵竭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兼搏。 院中可真熱鬧卵慰,春花似錦、人聲如沸佛呻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吓著。三九已至鲤嫡,卻和暖如春送挑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暖眼。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工惕耕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诫肠。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓司澎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親栋豫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挤安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容