Redis是一個(gè) Key-Value 存儲(chǔ)系統(tǒng)。和 Memcached 類(lèi)似,它支持存儲(chǔ)的 value 類(lèi)型相對(duì)更多,包括 string(字符串)、 list(鏈表)、 set(集合)和 zset(有序集合)。這些數(shù)據(jù)類(lèi)型都支持 push/pop、add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,Redis 支持各種不同方式的排序。與 memcached 一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是 Redis 會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了 master-slave(主從)同步。
Key-Value存儲(chǔ)系統(tǒng)
Key-Value Store 是當(dāng)下比較流行的話(huà)題,尤其在構(gòu)建諸如搜索引擎、IM、P2P、游戲服務(wù)器、SNS 等大型互聯(lián)網(wǎng)應(yīng)用以及提供云計(jì)算服務(wù)的時(shí)候,怎樣保證系統(tǒng)在海量數(shù)據(jù)環(huán)境下的高性能、高可靠性、高擴(kuò)展性、高可用性、低成本成為所有系統(tǒng)架構(gòu)們挖苦心思考慮的重點(diǎn),而
怎樣解決數(shù)據(jù)庫(kù)服務(wù)器的性能瓶頸是最大的挑戰(zhàn)。
Key-Value Store 更加注重對(duì)海量數(shù)據(jù)存取的性能、分布式、擴(kuò)展性支持上,并不需要傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的一些特征,例如:Schema、事務(wù)、完整 SQL 查詢(xún)支持等等,因此在分布式環(huán)境下的性能相對(duì)于傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)有較大的提升。
為什么要選擇Key-Value Store
大規(guī)?;ヂ?lián)網(wǎng)應(yīng)用
一類(lèi)是仍然采用RDBMS,然后通過(guò)對(duì)數(shù)據(jù)庫(kù)的垂直和水平切分將整個(gè)數(shù)據(jù)庫(kù)部署到一個(gè)集群上,缺點(diǎn)在于它是針對(duì)特定應(yīng)用,通用型不足
另一類(lèi)就是google采用的方法,拋棄RDBMS,采用Key-Value形式存儲(chǔ),這樣可以極大增強(qiáng)系統(tǒng)的可擴(kuò)展性。
云存儲(chǔ)
如果說(shuō)上一個(gè)問(wèn)題還有可以替代的解決方案(切割數(shù)據(jù)庫(kù))的話(huà),那么對(duì)于云存儲(chǔ)來(lái)說(shuō),也許 key-value 的 store 就是唯一的解決方案了。云存儲(chǔ)簡(jiǎn)單點(diǎn)說(shuō)就是構(gòu)建一個(gè)大型的存儲(chǔ)平臺(tái)給別人用,這也就意味著在這上面運(yùn)行的應(yīng)用其實(shí)是不可控的。如果其中某個(gè)客戶(hù)的應(yīng)用隨著用戶(hù)的增長(zhǎng)而不斷增長(zhǎng)時(shí),云存儲(chǔ)供應(yīng)商是沒(méi)有辦法通過(guò)數(shù)據(jù)庫(kù)的切割來(lái)達(dá)到 scale 的,因?yàn)檫@個(gè)數(shù)據(jù)是客戶(hù)的,供應(yīng)商不了解這個(gè)數(shù)據(jù)自然就沒(méi)法作出切割。在這種情況下,key-value 的 store 就是唯一的選擇了,因?yàn)檫@種條件下的 scalability 必須是自動(dòng)完成的,不能有人工干預(yù)。這也是為什么幾乎所有的現(xiàn)有的云存儲(chǔ)都是 key-value 形式的,例如 Amazon的 smipleDB,底層實(shí)現(xiàn)就是 key-value,還有 google 的 GoogleAppEngine,采用的是 BigTable的存儲(chǔ)形式。
Key-Value Store最大的特點(diǎn)就是它的可擴(kuò)展性,這也就是它最大的優(yōu)勢(shì)。所謂的可擴(kuò)展性,
在我看來(lái)這里包括了兩方面內(nèi)容。一方面,是指 Key-Value Store 可以支持極大的數(shù)據(jù)的存儲(chǔ),它的分布式的架構(gòu)決定了只要有更多的機(jī)器,就能夠保證存儲(chǔ)更多的數(shù)據(jù)。另一方面,是指它可以支持?jǐn)?shù)量很多的并發(fā)的查詢(xún)。對(duì)于 RDBMS,一般幾百個(gè)并發(fā)的查詢(xún)就可以讓它很吃
力了,而一個(gè) Key-Value Store,可以很輕松的支持上千的并發(fā)查詢(xún)。下面而簡(jiǎn)單的羅列了一些特點(diǎn):
? Key-value store:一個(gè) key-value 數(shù)據(jù)存儲(chǔ)系統(tǒng),只支持一些基本操作,如: SET(key, value) 和 GET(key) 等;
? 分布式:多臺(tái)機(jī)器(nodes)同時(shí)存儲(chǔ)數(shù)據(jù)和狀態(tài),彼此交換消息來(lái)保持?jǐn)?shù)據(jù)一致,可視為一個(gè)完整的存儲(chǔ)系統(tǒng)。
? 數(shù)據(jù)一致:所有機(jī)器上的數(shù)據(jù)都是同步更新的、不用擔(dān)心得到不一致的結(jié)果;
? 冗余:所有機(jī)器(nodes)保存相同的數(shù)據(jù),整個(gè)系統(tǒng)的存儲(chǔ)能力取決于單臺(tái)機(jī)器(node)的能力;
? 容錯(cuò):如果有少數(shù) nodes 出錯(cuò),比如重啟、當(dāng)機(jī)、斷網(wǎng)、網(wǎng)絡(luò)丟包等各種 fault/fail 都不影響整個(gè)系統(tǒng)的運(yùn)行;
? 高可靠性:容錯(cuò)、冗余等保證了數(shù)據(jù)庫(kù)系統(tǒng)的可靠性。
初識(shí)Redis
Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě),支持網(wǎng)絡(luò)、可基于內(nèi)存且可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并且提供多個(gè)語(yǔ)言的API,訪(fǎng)問(wèn)十分便捷。
Redis數(shù)據(jù)類(lèi)型:
作為 Key-value 型數(shù)據(jù)庫(kù),Redis 也提供了鍵(Key)和鍵值(Value)的映射關(guān)系。但是,除
了常規(guī)的數(shù)值或字符串,Redis 的鍵值還可以是以下形式之一:
? Lists (列表)
? Sets (集合)
? Sorted sets (有序集合)
? Hashes (哈希表)
鍵值的數(shù)據(jù)類(lèi)型決定了該鍵值支持的操作。Redis 支持諸如列表、集合或有序集合的交集、并集、查集等高級(jí)原子操作;同時(shí),如果鍵值的類(lèi)型是普通數(shù)字,Redis 則提供自增等原子操作。
Redis持久化:
通常,Redis 將數(shù)據(jù)存儲(chǔ)于內(nèi)存中,或被配置為使用虛擬內(nèi)存。通過(guò)兩種方式可以實(shí)現(xiàn)數(shù)據(jù)持久化:使用截圖的方式,將內(nèi)存中的數(shù)據(jù)不斷寫(xiě)入磁盤(pán);或使用類(lèi)似 MySQL 的日志方式,記錄每次更新的日志。前者性能較高,但是可能會(huì)引起一定程度的數(shù)據(jù)丟失;后者相反。
Redis主從同步:
Redis支持將數(shù)據(jù)同步到多臺(tái)從庫(kù),這種特性對(duì)提高讀取性能非常有益
Redis性能:
相比需要依賴(lài)磁盤(pán)記錄每個(gè)更新的數(shù)據(jù)庫(kù),基于內(nèi)存的特性無(wú)疑給Redis帶來(lái)了非常優(yōu)秀的性能,讀寫(xiě)操作之間有顯著的性能差異
性能測(cè)試結(jié)果:
SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次,服務(wù)器配置如下:
Linux 2.6, Xeon X3320 2.5Ghz.
stackoverflow 網(wǎng)站使用 Redis 做為緩存服務(wù)器。
適用場(chǎng)合:
Redis其實(shí)開(kāi)創(chuàng)了一種新的數(shù)據(jù)存儲(chǔ)思路,使用Redis,我們不用再面對(duì)功能單調(diào)的數(shù)據(jù)庫(kù)時(shí),把精力放在如何把大象放進(jìn)冰箱的問(wèn)題,而是利用Redis提供的靈活多變的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作,為不同的大象構(gòu)建不同的冰箱。
下面是一些Redis常用的場(chǎng)景:
1. 取最新N個(gè)數(shù)據(jù)的操作
比如典型的取你網(wǎng)站的最新文章,通過(guò)下面方式,我們可以將最新的 5000 條評(píng)論的 ID 放在Redis 的 List 集合中,并將超出集合部分從數(shù)據(jù)庫(kù)獲取。使用 LPUSH latest.comments命令,向 list 集合中插入數(shù)據(jù)插入完成后再用 LTRIM latest.comments 0 5000 命令使其永遠(yuǎn)只保存最近 5000 個(gè) ID如果你還有不同的篩選維度,比如某個(gè)分類(lèi)的最新 N 條,那么你可以再建一個(gè)按此分類(lèi)的List,只存 ID 的話(huà),Redis 是非常高效的。
2. 排行榜應(yīng)用,取TOP N操作
這個(gè)需求與上面需求的不同之處在于,前面操作以時(shí)間為權(quán)重,這個(gè)是以某一個(gè)條件為權(quán)重,比如按購(gòu)買(mǎi)的次數(shù)或者頂?shù)拇螖?shù),這時(shí)候就需要 sorted set 出馬,將你要排序的值設(shè)置為sorted set的score,將具體的數(shù)據(jù)設(shè)置為相應(yīng)的value,每次只需要執(zhí)行一條ZADD命令即可。
3. 需要精確設(shè)定過(guò)期時(shí)間的應(yīng)用
比如你可以把上面說(shuō)到的 sorted set 的 score 值設(shè)置成過(guò)期時(shí)間的時(shí)間戳,那么就可以簡(jiǎn)單地通過(guò)過(guò)期時(shí)間排序,定時(shí)清除過(guò)期數(shù)據(jù)了,不僅是清除 Redis 中的過(guò)期數(shù)據(jù),你完全可以把 Redis 里這個(gè)過(guò)期時(shí)間當(dāng)成是對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的索引,用 Redis 來(lái)找出哪些數(shù)據(jù)需要過(guò)期刪除,然后再精準(zhǔn)地從數(shù)據(jù)庫(kù)中刪除相應(yīng)的記錄。
4.計(jì)數(shù)器應(yīng)用
Redis的命令是原子性的,你可以輕松利用INCR、DECR命令來(lái)構(gòu)建計(jì)數(shù)器系統(tǒng)(底層的寫(xiě)入是單線(xiàn)程模型,并發(fā)寫(xiě)會(huì)按到位順序執(zhí)行)
5.Uniq操作,獲取某段時(shí)間所有數(shù)據(jù)去重值
這個(gè)使用Redis的Set數(shù)據(jù)結(jié)構(gòu)最合適,只需要不斷將數(shù)據(jù)往Set中扔就行,set就是集合,會(huì)自動(dòng)去重
6.實(shí)時(shí)系統(tǒng)、發(fā)垃圾系統(tǒng)
通過(guò)上面說(shuō)到的 set 功能,你可以知道一個(gè)終端用戶(hù)是否進(jìn)行了某個(gè)操作,可以找到其操作的集合并進(jìn)行分析統(tǒng)計(jì)對(duì)比等。沒(méi)有做不到,只有想不到。
7.Pub、Sub構(gòu)建實(shí)時(shí)消息系統(tǒng)
Redis 的 Pub/Sub 系統(tǒng)可以構(gòu)建實(shí)時(shí)的消息系統(tǒng),比如很多用 Pub/Sub 構(gòu)建的實(shí)時(shí)聊天系統(tǒng)的例子。
8. 構(gòu)建隊(duì)列系統(tǒng)
使用list可以構(gòu)建隊(duì)列系統(tǒng),使用sorted set 甚至可以構(gòu)建有優(yōu)先級(jí)的隊(duì)列系統(tǒng)。
9. 緩存
性能優(yōu)于Memcached,并且更優(yōu)秀的在于數(shù)據(jù)結(jié)構(gòu)更加多樣化
Redis作者的宣言
宣言中,作者列舉了Redis的7大原則,可以向大家闡明Redis的思想,看了之后我覺(jué)得Redis的作者的確牛叉,Redis這款產(chǎn)品這的是程序猿的福利:
1. Redis 是一個(gè)操作數(shù)據(jù)結(jié)構(gòu)的語(yǔ)言工具,它提供基于 TCP 的協(xié)議以操作豐富的數(shù)據(jù)結(jié)構(gòu)。
在 Redis 中,數(shù)據(jù)結(jié)構(gòu)這個(gè)詞的意義不僅表示在某種數(shù)據(jù)結(jié)構(gòu)上的操作,更包括了結(jié)構(gòu)本身及這些操作的時(shí)間空間復(fù)雜度。
2. Redis 定位于一個(gè)內(nèi)存數(shù)據(jù)庫(kù),正是由于內(nèi)存的快速訪(fǎng)問(wèn)特性,才使得 Redis 能夠有如此高的性能,才使得 Redis 能夠輕松處理大量復(fù)雜的數(shù)據(jù)結(jié)構(gòu),Redis 會(huì)嘗試其它的存儲(chǔ)方面的選擇,但是永遠(yuǎn)不會(huì)改變它是一個(gè)內(nèi)存數(shù)據(jù)庫(kù)的角色。
3. Redis 使用基礎(chǔ)的 API 操作基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu), Redis 的 API 與數(shù)據(jù)結(jié)構(gòu)一樣,都是一些最基礎(chǔ)的元素,你幾乎可以將任何信息交互使用此 API 格式表示。作者調(diào)侃說(shuō),如果有其它非人類(lèi)的智能生物存在,他們也能理解 Redis 的 API。因?yàn)樗侨绱说幕A(chǔ)。(作者大大很有趣)
4. Redis 有著詩(shī)一般優(yōu)美的代碼,經(jīng)常有一些不太了解 Redis 有的人會(huì)建議 Redis 采用一些其它人的代碼,以實(shí)現(xiàn)一些 Redis 未實(shí)現(xiàn)的功能,但這對(duì)我們來(lái)說(shuō)就像是非要給《紅樓夢(mèng)》接上后四十回一樣。
5.Redis 始終避免復(fù)雜化,我們認(rèn)為設(shè)計(jì)一個(gè)系統(tǒng)的本質(zhì),就是與復(fù)雜化作戰(zhàn)。我們不會(huì)為了一個(gè)小功能而往源碼里添加上千行代碼,解決復(fù)雜問(wèn)題的方法就是讓復(fù)雜問(wèn)題永遠(yuǎn)不要提復(fù)雜的問(wèn)題。
6.Redis 支持兩個(gè)層成的 API,第一個(gè)層面包含部分操作 API,但它支持用于分布式環(huán)境下的 Redis。第二個(gè)層面的 API 支持更復(fù)雜的 multi-key 操作。它們各有所長(zhǎng),但是我們不會(huì)推出兩者都支持的 API,但我們希望能夠提供實(shí)例間數(shù)據(jù)遷移的命令,并執(zhí)行 multi-key 操作。
7. 我們以?xún)?yōu)化代碼為樂(lè),我們相信編碼是一件辛苦的工作,唯一對(duì)得起這辛苦的就是去享受它。如果我們?cè)诰幋a中失去了樂(lè)趣,那最好的解決辦法就是停下來(lái)。我們決不會(huì)選擇讓Redis不好玩的開(kāi)發(fā)模式。
實(shí)際MySQL是適合進(jìn)行海量數(shù)據(jù)存儲(chǔ)的,通過(guò)Memcached將熱點(diǎn)數(shù)據(jù)加載到cache,加速訪(fǎng)問(wèn),很多公司都曾經(jīng)使用過(guò)這樣的架構(gòu),但隨著業(yè)務(wù)數(shù)據(jù)量的不斷增加,和訪(fǎng)問(wèn)量的持續(xù)增長(zhǎng),我們遇到了很多問(wèn)題:
MySQL需要不斷進(jìn)行拆庫(kù)拆表,Memcached也需不斷跟著擴(kuò)容,擴(kuò)容和維護(hù)工作占據(jù)大量開(kāi)發(fā)時(shí)間。
Memcached與MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問(wèn)題。
Memcached數(shù)據(jù)命中率低或down機(jī),大量訪(fǎng)問(wèn)直接穿透到DB,MySQL無(wú)法支撐。
跨機(jī)房cache同步問(wèn)題。
眾多NoSQL百花齊放,如何選擇
最近幾年,業(yè)界不斷涌現(xiàn)出很多各種各樣的NoSQL產(chǎn)品,那么如何才能正確地使用好這些產(chǎn)品,最大化地發(fā)揮其長(zhǎng)處,是我們需要深入研究和思考的問(wèn)題,實(shí)際歸根結(jié)底最重要的是了解這些產(chǎn)品的定位,并且了解到每款產(chǎn)品的tradeoffs,在實(shí)際應(yīng)用中做到揚(yáng)長(zhǎng)避短,總體上這些NoSQL主要用于解決以下幾種問(wèn)題
少量數(shù)據(jù)存儲(chǔ),高速讀寫(xiě)訪(fǎng)問(wèn)。此類(lèi)產(chǎn)品通過(guò)數(shù)據(jù)全部in-momery 的方式來(lái)保證高速訪(fǎng)問(wèn),同時(shí)提供數(shù)據(jù)落地的功能,實(shí)際這正是Redis最主要的適用場(chǎng)景。
海量數(shù)據(jù)存儲(chǔ),分布式系統(tǒng)支持,數(shù)據(jù)一致性保證,方便的集群節(jié)點(diǎn)添加/刪除。
這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個(gè)完全無(wú)中心的設(shè)計(jì),節(jié)點(diǎn)之間通過(guò)gossip方式傳遞集群信息,數(shù)據(jù)保證最終一致性,后者是一個(gè)中心化的方案設(shè)計(jì),通過(guò)類(lèi)似一個(gè)分布式鎖服務(wù)來(lái)保證強(qiáng)一致性,數(shù)據(jù)寫(xiě)入先寫(xiě)內(nèi)存和redo log,然后定期compat歸并到磁盤(pán)上,將隨機(jī)寫(xiě)優(yōu)化為順序?qū)懀岣邔?xiě)入性能。
Schema free,auto-sharding等。比如目前常見(jiàn)的一些文檔數(shù)據(jù)庫(kù)都是支持schema-free的,直接存儲(chǔ)json格式數(shù)據(jù),并且支持auto-sharding等功能,比如mongodb。
面對(duì)這些不同類(lèi)型的NoSQL產(chǎn)品,我們需要根據(jù)我們的業(yè)務(wù)場(chǎng)景選擇最合適的產(chǎn)品。
Redis適用場(chǎng)景,如何正確的使用
相關(guān)廠(chǎng)商內(nèi)容
關(guān)于紅包、SSD云盤(pán)等核心技術(shù)集錦!
第二屆全球移動(dòng)技術(shù)大會(huì)全面啟動(dòng),11大專(zhuān)題搶先看
在線(xiàn)直播:阿里開(kāi)源項(xiàng)目最佳實(shí)踐
前面已經(jīng)分析過(guò),Redis最適合所有數(shù)據(jù)in-momory的場(chǎng)景,雖然Redis也提供持久化功能,但實(shí)際更多的是一個(gè)disk-backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別,那么可能大家就會(huì)有疑問(wèn),似乎Redis更像一個(gè)加強(qiáng)版的Memcached,那么何時(shí)使用Memcached,何時(shí)使用Redis呢?
Redis與Memcached的比較
網(wǎng)絡(luò)IO模型
Memcached是多線(xiàn)程,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型,分為監(jiān)聽(tīng)主線(xiàn)程和worker子線(xiàn)程,監(jiān)聽(tīng)線(xiàn)程監(jiān)聽(tīng)網(wǎng)絡(luò)連接,接受請(qǐng)求后,將連接描述字pipe 傳遞給worker線(xiàn)程,進(jìn)行讀寫(xiě)IO, 網(wǎng)絡(luò)層使用libevent封裝的事件庫(kù),多線(xiàn)程模型可以發(fā)揮多核作用,但是引入了cache coherency和鎖的問(wèn)題,比如,Memcached最常用的stats 命令,實(shí)際Memcached所有操作都要對(duì)這個(gè)全局變量加鎖,進(jìn)行計(jì)數(shù)等工作,帶來(lái)了性能損耗。

(Memcached網(wǎng)絡(luò)IO模型)
Redis使用單線(xiàn)程的IO復(fù)用模型,自己封裝了一個(gè)簡(jiǎn)單的AeEvent事件處理框架,主要實(shí)現(xiàn)了epoll、kqueue和select,對(duì)于單純只有IO操作來(lái)說(shuō),單線(xiàn)程可以將速度優(yōu)勢(shì)發(fā)揮到最大,但是Redis也提供了一些簡(jiǎn)單的計(jì)算功能,比如排序、聚合等,對(duì)于這些操作,單線(xiàn)程模型實(shí)際會(huì)嚴(yán)重影響整體吞吐量,CPU計(jì)算過(guò)程中,整個(gè)IO調(diào)度都是被阻塞住的。
內(nèi)存管理方面
Memcached使用預(yù)分配的內(nèi)存池的方式,使用slab和大小不同的chunk來(lái)管理內(nèi)存,Item根據(jù)大小選擇合適的chunk存儲(chǔ),內(nèi)存池的方式可以省去申請(qǐng)/釋放內(nèi)存的開(kāi)銷(xiāo),并且能減小內(nèi)存碎片產(chǎn)生,但這種方式也會(huì)帶來(lái)一定程度上的空間浪費(fèi),并且在內(nèi)存仍然有很大空間時(shí),新的數(shù)據(jù)也可能會(huì)被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis使用現(xiàn)場(chǎng)申請(qǐng)內(nèi)存的方式來(lái)存儲(chǔ)數(shù)據(jù),并且很少使用free-list等方式來(lái)優(yōu)化內(nèi)存分配,會(huì)在一定程度上存在內(nèi)存碎片,Redis跟據(jù)存儲(chǔ)命令參數(shù),會(huì)把帶過(guò)期時(shí)間的數(shù)據(jù)單獨(dú)存放在一起,并把它們稱(chēng)為臨時(shí)數(shù)據(jù),非臨時(shí)數(shù)據(jù)是永遠(yuǎn)不會(huì)被剔除的,即便物理內(nèi)存不夠,導(dǎo)致swap也不會(huì)剔除任何非臨時(shí)數(shù)據(jù)(但會(huì)嘗試剔除部分臨時(shí)數(shù)據(jù)),這點(diǎn)上Redis更適合作為存儲(chǔ)而不是cache。
數(shù)據(jù)一致性問(wèn)題
Memcached提供了cas命令,可以保證多個(gè)并發(fā)訪(fǎng)問(wèn)操作同一份數(shù)據(jù)的一致性問(wèn)題。 Redis沒(méi)有提供cas 命令,并不能保證這點(diǎn),不過(guò)Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會(huì)被任何操作打斷。
存儲(chǔ)方式及其它方面
Memcached基本只支持簡(jiǎn)單的key-value存儲(chǔ),不支持枚舉,不支持持久化和復(fù)制等功能
Redis除key/value之外,還支持list,set,sorted set,hash等眾多數(shù)據(jù)結(jié)構(gòu),提供了KEYS
進(jìn)行枚舉操作,但不能在線(xiàn)上使用,如果需要枚舉線(xiàn)上數(shù)據(jù),Redis提供了工具可以直接掃描其dump文件,枚舉出所有數(shù)據(jù),Redis還同時(shí)提供了持久化和復(fù)制等功能。
關(guān)于不同語(yǔ)言的客戶(hù)端支持
在不同語(yǔ)言的客戶(hù)端方面,Memcached和Redis都有豐富的第三方客戶(hù)端可供選擇,不過(guò)因?yàn)镸emcached發(fā)展的時(shí)間更久一些,目前看在客戶(hù)端支持方面,Memcached的很多客戶(hù)端更加成熟穩(wěn)定,而Redis由于其協(xié)議本身就比Memcached復(fù)雜,加上作者不斷增加新的功能等,對(duì)應(yīng)第三方客戶(hù)端跟進(jìn)速度可能會(huì)趕不上,有時(shí)可能需要自己在第三方客戶(hù)端基礎(chǔ)上做些修改才能更好的使用。
根據(jù)以上比較不難看出,當(dāng)我們不希望數(shù)據(jù)被踢出,或者需要除key/value之外的更多數(shù)據(jù)類(lèi)型時(shí),或者需要落地功能時(shí),使用Redis比使用Memcached更合適。
關(guān)于Redis的一些周邊功能
Redis除了作為存儲(chǔ)之外還提供了一些其它方面的功能,比如聚合計(jì)算、pubsub、scripting等,對(duì)于此類(lèi)功能需要了解其實(shí)現(xiàn)原理,清楚地了解到它的局限性后,才能正確的使用,比如pubsub功能,這個(gè)實(shí)際是沒(méi)有任何持久化支持的,消費(fèi)方連接閃斷或重連之間過(guò)來(lái)的消息是會(huì)全部丟失的,又比如聚合計(jì)算和scripting等功能受Redis單線(xiàn)程模型所限,是不可能達(dá)到很高的吞吐量的,需要謹(jǐn)慎使用。
總的來(lái)說(shuō)Redis作者是一位非常勤奮的開(kāi)發(fā)者,可以經(jīng)??吹阶髡咴趪L試著各種不同的新鮮想法和思路,針對(duì)這些方面的功能就要求我們需要深入了解后再使用。
總結(jié):
Redis使用最佳方式是全部數(shù)據(jù)in-memory。
Redis更多場(chǎng)景是作為Memcached的替代者來(lái)使用。
當(dāng)需要除key/value之外的更多數(shù)據(jù)類(lèi)型支持時(shí),使用Redis更合適。
當(dāng)存儲(chǔ)的數(shù)據(jù)不能被剔除時(shí),使用Redis更合適。
后續(xù)關(guān)于Redis文章計(jì)劃:
Redis數(shù)據(jù)類(lèi)型與容量規(guī)劃。
如何根據(jù)業(yè)務(wù)場(chǎng)景搭建穩(wěn)定,可靠,可擴(kuò)展的Redis集群。
Redis參數(shù),代碼優(yōu)化及二次開(kāi)發(fā)基礎(chǔ)實(shí)踐。