導航:首頁 > 編程語言 > redis一致性hashphp

redis一致性hashphp

發布時間:2024-10-19 07:36:23

❶ Redis - 集群Hash槽分配

常見的Redis集群架構是三主三從的結構,為了保證數據分片,redis採用了Hash槽的概念,即:

常見的三主三從結構,將solt平均分到三個節點上

如果存入一個值,按照redis cluster哈希槽的 演算法 : CRC16('key')384 = 6782。 那麼就會把這個key 的存儲分配到 B 上了。同樣,當我連接(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取數據

新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,會變成這樣:

同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。

Redis的Hash槽分配不是 一致性Hash ,一致性Hash是成一個hash環,當節點加入或者失效的時候,在環上順時針找到對應節點。而Redis集群屬於手動分配 線性Hash槽 ,需要手動指定,並且盡量做到各個節點solt平均分配。
而至於為什麼Redis沒有採用一致性Hash,因為如果一個節點失效,把數據轉移到下一個節點,容易造成緩存雪崩,而採用hash槽+副本節點失效的時候從節點自動接替,不易造成雪崩。

❷ 三分鍾讀懂redis資料庫

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

1. 使用Redis有哪些好處?

(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1)

(2) 支持豐富數據類型,支持string,list,set,sorted set,hash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

2. redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字元串,redis作為其替代者,支持更為豐富的數據類型

(2) redis的速度比memcached快很多

(3) redis可以持久化其數據

3. redis常見性能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次

(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個區域網內

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

4. MySQL里有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據

相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:

voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

相關推薦:《Python視頻教程》

5. Memcache與Redis的區別都有哪些?

1)、存儲方式

Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。

Redis有部份存在硬碟上,這樣能保證數據的持久性。

2)、數據支持類型

Memcache對數據類型支持相對簡單。

Redis有復雜的數據類型。

3),value大小

redis最大可以達到1GB,而memcache只有1MB

6. Redis 常見的性能問題都有哪些?如何解決?

1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。

2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啟用內存快照做持久化,如果數據比較關鍵,某個Slave開啟AOF備份數據,策略為每秒同步一次。

3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。

4). Redis主從復制的性能問題,為了主從復制的速度和連接的穩定性,Slave和Master最好在同一個區域網內

7. redis 最適合的場景

Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

2.Redis支持數據的備份,即master-slave模式的數據備份。

3.Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

(1)會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。

(2)全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似php本地FPC。

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度載入你曾瀏覽過的頁面。

(3)隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

如果你快速的在Google中搜索「Redis queues」,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後台就是使用Redis作為broker,你可以從這里去查看。

(4)排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為「user_scores」,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。

(5)發布/訂閱

最後(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網路連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

❸ redis集群使用一致性hash嗎

使用。

設定一個圓環上 0-2^3̂2-1 的點,每個點對應一個緩存區,每個鍵值對存儲的位置也經哈希計算後對應到環上節點。但現實中不可能有如此多的節點,所以倘若鍵值對經哈希計算後對應的位置沒有節點,那麼順時針找一個節點存儲它。

1、考慮增加伺服器節點的情況,該節點順時針方向的數據仍然被存儲到順時針方向的節點上,但它逆時針方向的數據被存儲到它自己。這時候只有部分數據會失效,被映射到新的緩存區。

2、考慮節點減少的情況。該缺失節點順時針方向上的數據仍然被存儲到其順時針方向上的節點,設為 beta,其逆時針方向上的數據會被存儲到 beta 上。同樣,只有有部分數據失效,被重新映射到新的伺服器節點。

(3)redis一致性hashphp擴展閱讀:

一致性哈希演算法

這種方法可以應對節點失效的情況,當某個分布式集群節點宕機,服務請求可以通過hash演算法重新分配到其他可用的伺服器上。避免了無法處理請求的狀況出現 。

但這種方法的缺陷也很明顯,如果伺服器中保存有服務請求對應的數據,那麼如果重新計算請求的hash值,會造成大量的請求被重定位到不同的伺服器而造成請求所要使用的數據失效,這種情況在分布式系統中是非常糟糕的。

一個設計良好的分布式系統應該具有良好的單調性,即伺服器的添加與移除不會造成大量的哈希重定位,而一致性哈希恰好可以解決這個問題。

java去公司工作用到的是哪方面的知識

小公司做小項目一般都用SSH+jsp大公司做項目都是根據不同的項目 採取不同的框架技術,比如銀行大部分都用 EJB等

第一:先學習Java的核心庫(JavaSE)

JavaSE的內容包括:環境搭建、基礎語法、面向對象、數組、集合、常用類、IO流、反射機制、網路編程……..

第二:MySQL資料庫

搞定一門資料庫相關的課程,例如:MySQL、Oracle,搞定一個就可以了,目前互聯網公司,例如:京東、阿里等,他們都在使用MySQL,所以建議大家學習MySQL資料庫,小巧輕盈,免費,由於互聯網公司的項目訪問量比較大,所以一般會搭建資料庫的集群,可以一個資料庫不夠,所以需要搭建資料庫集群,為了應付高並發。(搭建的比較多的時候,免費就很重要了。)

第三:WEB前端

以後從事Java開發,從事JavaEE開發,主要開發的系統結構是B/S結構的,B指的是Browser,S指的是Server。要開發這種系統,B端要會,S端也要精通。WEB前端的學習就是學習B端技術。包括:HTML 、CSS、JavaScript(JS)、jQuery框架(底層對JS進行了封裝)…

第四:WEB後端(JavaWEB)

WEB後端其實可以是很多種不同的編程語言,例如:PHP、C、C++、Java,他們都可以進行WEB後端的開發,我們既然選擇了比較火爆的Java,那麼我們學習的後端一定是基於Java語言實現的,包括:Servlet、Filter、Jsp、EL、JSTL、MVC架構模式、資料庫連接池(阿里巴巴的Druid連接池)、代理模式(動態代理)。另外後端學習了之後,還要學習一個非同步編程技術AJAX。(完成網頁的局部刷新,AJAX其實不屬於後端,是前端瀏覽器上的程序。)

學習到這里為止,表示Java基本/基礎的技術已經學完了。但是這些最基層的技術在實際的開發中不會使用的,一般為了開發效率,都會使用大量的提前封裝好的框架。

第五:最好能夠停留下來,做一個項目。

這個項目最好能將之前所學全部串起來。(對以前的知識點進行鞏固。)

這個項目最好是基於:Servlet + Jsp+AJAX+jQuery+MySQL….

在這個項目的開發過程中:大家一定要記住,目前比較好的項目自動構建工具:Maven是一定要精通的。還有一個就是團隊協作開發:Git/SVN是一定要會用的。(目前使用Git比較多一些。)

第六:學習高級框架

Spring、SpringMVC、MyBatis(持久層框架,這個框架互聯網公司使用比較多,因為互聯網項目需要進行SQL優化,MyBatis的SQL優化很方便,所以大部分都是使用MyBatis)

Struts2(很少使用了,使用這個的肯定是很老的項目)、Hibernate(傳統企業,還有政府等可能會使用Hibernate。)

SpringBoot(新項目大部分使用的都是boot了。所以在項目中遇到還在使用SSM的一般都是遺留項目。)

當你走到這里之後,基本上你可以出山了。(去找工作,8K的薪資應該問題不大,但前提是你學的好。學習的深度夠了,廣度夠了。)

第七:最好能有一個大型項目是使用框架來完成的。

SpringBoot做一個項目。

Spring SpringMVC MyBatis做一個項目。

這個項目最好是找幾個人搭夥做一下。體驗一下團隊協作。(尤其是使用一些協作的工具。怎麼溝通,怎麼寫日報,怎麼開會,怎麼使用Git,等等….)

第八:如果你的薪資想達到15K的話,你可能需要還要學習一些分布式相關的一些技術。

能夠應付高並發的一些技術,例如:分布式框架Dubbo、SpringCloud、MQ、Nginx、Redis…..

java的知識體系構架

....祝 工作順心 哈哈

❺ redis 數據分區--一致性hash&&虛擬槽分區

1.節點區域分區:
使用特定的數據,如redis的鍵或用戶ID,再根據節點數量N使用公式:hash(key)%N計算出hash值,用來決定數據映射到哪一個節點上.

這種方案的問題是:
當節點數量變化時,需要重新計算hash,會導致數據的重新遷移.

2.一致性hash演算法
一致性hash演算法實現思路是為系統中每一個節點分配一個token,范圍在0~2^32,這些token構成一個hash環.數據的讀寫執行節點查找操作時,先根據key計算hash值,然後順時針找到第一個大於等於該hash的token節點.

好處:
這種方式最大的好處就是,在加入或刪除節點時,隻影響hash環中相鄰的兩個節點,對其他節點無影響.

問題:

3.虛擬槽演算法

使用分散度較好的hash函數,將所有的數據映射到 比如0~16383(2^14)范圍的槽中(slot).這個槽的數量一般遠遠大於實例的數量.

槽是集群數據管理和遷移的基本單位.採用大范圍槽的主要目的是為了方便數據拆分和集群擴展.

每一個實例會映射一部分范圍的槽.

特點:
1.解耦數據和節點之間的關系,簡化擴容和鎖容的難度
2.節點自身維護槽的映射關系,不需要客戶端或代理服務維護槽分區的元數據.
3.支持節點,槽,鍵之間的映射查詢,用於數據路由,在線伸縮燈場景.

HashTags(面試)
Mset k1 v1 k2 v2 k3 v3
通過分片手段,可以將數據合理的劃分到不同的節點上,這本來是一件好事。但是有的時候,我們希望對相關聯的業務以原子性方式進行操作。舉個簡單的例子
我們在單節點上執行MSET (m表示多個,一次向redis設置多個key和值), 它是一個原子性的操作,我們要求所有給定的key要在同一時間內被設置,不能出現某些指定的key被更新另一些指定的key沒有被更新的情況。但是在集群環境下,我們仍然可以執行MSET命令,但它的操作不在是原子操作,會存在某些指定的key被更新,而另外一些指定的key沒有改變,原因是多個key可能會被分配到不同的機器上。
所以,這里就會存在一個矛盾點,及要求key盡可能的分散在不同機器,又要求某些相關聯的key分配到相同機器。
這個也是在面試的時候會容易被問到的內容。怎麼解決呢?
從前面的分析中我們了解到,分片其實就是一個hash的過程,對key做hash取模然後劃分到不同的機器上。所以為了解決這個問題,我們需要考慮如何讓相關聯的key得到的hash值都相同呢?如果key全部相同是不現實的,所以怎麼解決呢?在redis中引入了HashTag的概念,可以使得數據分布演算法可以根據key的某一個部分進行計算,然後讓相關的key落到同一個數據分片;
舉個簡單的例子,假如對於用戶的信息進行存儲,
redis:store:1001、redis:store:1002
那麼通過hashtag的方式,
redis:{store}:1001、redis:{store}:1002; 表示
當一個key包含 {} 的時候,就不對整個key做hash,而僅對 {} 包括的字元串做hash。

❻ 談談redis,memcache,mongodb的區別和具體應用場景

從以下幾個維度,對 redis、memcache、mongoDB 做了對比。
1、性能
都比較高,性能對我們來說應該都不是瓶頸。
總體來講,TPS 方面 redis 和 memcache 差不多,要大於 mongodb。
2、操作的便利性
memcache 數據結構單一。(key-value)
redis 豐富一些,數據操作方面,redis 更好一些,較少的網路 IO 次數,同時還提供 list,set,
hash 等數據結構的存儲。
mongodb 支持豐富的數據表達,索引,最類似關系型資料庫,支持的查詢語言非常豐富。
3、內存空間的大小和數據量的大小
redis 在 2.0 版本後增加了自己的 VM 特性,突破物理內存的限制;可以對 key value 設置過
期時間(類似 memcache)
memcache 可以修改最大可用內存,採用 LRU 演算法。Memcached 代理軟體 magent,比如建立
10 台 4G 的 Memcache 集群,就相當於有了 40G。 magent -s 10.1.2.1 -s 10.1.2.2:11211 -b
10.1.2.3:14000 mongoDB 適合大數據量的存儲,依賴操作系統 VM 做內存管理,吃內存也比較厲害,服務
不要和別的服務在一起。
4、可用性(單點問題)
對於單點問題,
redis,依賴客戶端來實現分布式讀寫;主從復制時,每次從節點重新連接主節點都要依賴整
個快照,無增量復制,因性能和效率問題,
所以單點問題比較復雜;不支持自動 sharding,需要依賴程序設定一致 hash 機制。
一種替代方案是,不用 redis 本身的復制機制,採用自己做主動復制(多份存儲),或者改成
增量復制的方式(需要自己實現),一致性問題和性能的權衡
Memcache 本身沒有數據冗餘機制,也沒必要;對於故障預防,採用依賴成熟的 hash 或者環
狀的演算法,解決單點故障引起的抖動問題。
mongoDB 支持 master-slave,replicaset(內部採用 paxos 選舉演算法,自動故障恢復),auto sharding 機制,對客戶端屏蔽了故障轉移和切分機制。
5、可靠性(持久化)
對於數據持久化和數據恢復,
redis 支持(快照、AOF):依賴快照進行持久化,aof 增強了可靠性的同時,對性能有所影

memcache 不支持,通常用在做緩存,提升性能;
MongoDB 從 1.8 版本開始採用 binlog 方式支持持久化的可靠性
6、數據一致性(事務支持)
Memcache 在並發場景下,用 cas 保證一致性redis 事務支持比較弱,只能保證事務中的每個操作連續執行
mongoDB 不支持事務
7、數據分析
mongoDB 內置了數據分析的功能(maprece),其他不支持
8、應用場景
redis:數據量較小的更性能操作和運算上
memcache:用於在動態系統中減少資料庫負載,提升性能;做緩存,提高性能(適合讀多寫
少,對於數據量比較大,可以採用 sharding)
MongoDB:主要解決海量數據的訪問效率問題。
表格比較:
memcache redis 類型 內存資料庫 內存資料庫
數據類型 在定義 value 時就要固定數據類型 不需要
有字元串,鏈表,集 合和有序集合
虛擬內存 不支持 支持
過期策略 支持 支持
分布式 magent master-slave,一主一從或一主多從
存儲數據安全 不支持 使用 save 存儲到 mp.rdb 中
災難恢復 不支持 append only file(aof)用於數據恢復
性能
1、類型——memcache 和 redis 都是將數據存放在內存,所以是內存資料庫。當然,memcache 也可用於緩存其他東西,例如圖片等等。
2、 數據類型——Memcache 在添加數據時就要指定數據的位元組長度,而 redis 不需要。
3、 虛擬內存——當物理內存用完時,可以將一些很久沒用到的 value 交換到磁碟。
4、 過期策略——memcache 在 set 時就指定,例如 set key1 0 0 8,即永不過期。Redis 可以通
過例如 expire 設定,例如 expire name 10。
5、 分布式——設定 memcache 集群,利用 magent 做一主多從;redis 可以做一主多從。都可
以一主一從。
6、 存儲數據安全——memcache 斷電就斷了,數據沒了;redis 可以定期 save 到磁碟。
7、 災難恢復——memcache 同上,redis 丟了後可以通過 aof 恢復。
Memecache 埠 11211
yum -y install memcached
yum -y install php-pecl-memcache
/etc/init.d/memcached start memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
-d 啟動一個守護進程
-p 埠
-m 分配的內存是 M
-c 最大運行並發數-P memcache 的 pid
//0 壓縮(是否 MEMCACHE_COMPRESSED) 30 秒失效時間
//delete 5 是 timeout <?php
$memcache = new Memcache; $memcache -> connect('127.0.0.1', 11211); $memcache -> set('name','yang',0,30);
if(!$memcache->add('name','susan',0, 30)) {
//echo 'susan is exist'; }$memcache -> replace('name', 'lion', 0, 300); echo $memcache -> get('name');
//$memcache -> delete('name', 5);
printf "stats\r\n" | nc 127.0.0.1 11211
telnet localhost 11211 stats quit 退出
Redis 的配置文件 埠 6379
/etc/redis.conf 啟動 Redis
redis-server /etc/redis.conf 插入一個值
redis-cli set test "phper.yang" 獲取鍵值
redis-cli get test 關閉 Redis
redis-cli shutdown 關閉所有
redis-cli -p 6379 shutdown <?php
$redis=new
Redis(); $redis->connect('127.0.0.1',6379); $redis->set('test',
'Hello World'); echo $redis->get('test'); Mongodb
apt-get install mongo mongo 可以進入 shell 命令行
pecl install mongo Mongodb 類似 phpmyadmin 操作平台 RockMongo

❼ redis到底是個什麼東西

1. 什麼是Redis

Redis是由義大利人Salvatore Sanfilippo(網名:antirez)開發的一款內存高速緩存資料庫。Redis全稱為:Remote Dictionary Server(遠程數據服務),該軟體使用C語言編寫,Redis是一個key-value存儲系統,它支持豐富的數據類型,如:string、list、set、zset(sorted set)、hash。

2. Redis特點

Redis以內存作為數據存儲介質,所以讀寫數據的效率極高,遠遠超過資料庫。以設置和獲取一個256位元組字元串為例,它的讀取速度可高達110000次/s,寫速度高達81000次/s。

Redis跟memcache不同的是,儲存在Redis中的數據是持久化的,斷電或重啟後,數據也不會丟失。因為Redis的存儲分為內存存儲、磁碟存儲和log文件三部分,重啟後,Redis可以從磁碟重新將數據載入到內存中,這些可以通過配置文件對其進行配置,正因為這樣,Redis才能實現持久化。

Redis支持主從模式,可以配置集群,這樣更利於支撐起大型的項目,這也是Redis的一大亮點。

3. Redis應用場景,它能做什麼

眾多語言都支持Redis,因為Redis交換數據快,所以在伺服器中常用來存儲一些需要頻繁調取的數據,這樣可以大大節省系統直接讀取磁碟來獲得數據的I/O開銷,更重要的是可以極大提升速度。

拿大型網站來舉個例子,比如a網站首頁一天有100萬人訪問,其中有一個板塊為推薦新聞。要是直接從資料庫查詢,那麼一天就要多消耗100萬次資料庫請求。上面已經說過,Redis支持豐富的數據類型,所以這完全可以用Redis來完成,將這種熱點數據存到Redis(內存)中,要用的時候,直接從內存取,極大的提高了速度和節約了伺服器的開銷。

總之,Redis的應用是非常廣泛的,而且極有價值,真是伺服器中的一件利器,所以從現在開始,我們就來一步步學好它。

❽ php面試題 memcache和redis的區別

Redis與Memcached的區別

傳統MySQL+ Memcached架構遇到的問題

實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:

1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。

2.Memcached與MySQL資料庫數據一致性問題。

3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。

4.跨機房cache同步問題。

眾多NoSQL百花齊放,如何選擇

最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的
問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解
決以下幾種問題

1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。

2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。

3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。

4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。

面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。

Redis適用場景,如何正確的使用

前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-
backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用
Memcached,何時使用Redis呢?

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

2 Redis支持數據的備份,即master-slave模式的數據備份。

3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。


Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的
key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability =
age*log(size_in_memory)」計
算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以

保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存

中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個
操作,直到子線程完成swap操作後才可以進行修改。

使用Redis特有內存模型前後的情況對比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used



從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。

這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行

批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程
池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。

如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。

補充的知識點:

memcached和redis的比較

1 網路IO模型

Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述
字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache
coherency和鎖的問題,比如,Memcached最常用的stats
命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。

(Memcached網路IO模型)

Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,
對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實
際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

2.內存管理方面

Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內
存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可
能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

Redis使用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis
跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,並把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔
除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

3.數據一致性問題

Memcached提供了cas命令,可以保證多個並發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

4.存儲方式及其它方面

Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復制等功能

Redis除key/value之外,還支持list,set,sorted set,hash等眾多數據結構,提供了KEYS

進行枚舉操作,但不能在線上使用,如果需要枚舉線上數據,Redis提供了工具可以直接掃描其mp文件,枚舉出所有數據,Redis還同時提供了持久化和復制等功能。

5.關於不同語言的客戶端支持

在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發展的時間更久一些,目
前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩定,而Redis由於其協議本身就比Memcached復雜,加上作者不斷增加新的功能
等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

根據以上比較不難看出,當我們不希望數據被踢出,或者需要除key/value之外的更多數據類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。

關於Redis的一些周邊功能

Redis除了作為存儲之外還提供了一些其它方面的功能,比如聚合計算、pubsub、scripting等,對於此類功能需要了解其實現原
理,清楚地了解到它的局限性後,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支持的,消費方連接閃斷或重連之間過來的消息是會全部丟
失的,又比如聚合計算和scripting等功能受Redis單線程模型所限,是不可能達到很高的吞吐量的,需要謹慎使用。

總的來說Redis作者是一位非常勤奮的開發者,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入了解後再使用。

總結:

1.Redis使用最佳方式是全部數據in-memory。

2.Redis更多場景是作為Memcached的替代者來使用。

3.當需要除key/value之外的更多數據類型支持時,使用Redis更合適。

4.當存儲的數據不能被剔除時,使用Redis更合適。

談談Memcached與Redis(一)

1. Memcached簡介

Memcached是以LiveJurnal旗下Danga Interactive公司的Bard
Fitzpatric為首開發的高性能分布式內存緩存伺服器。其本質上就是一個內存key-value資料庫,但是不支持數據的持久化,伺服器關閉之後數
據全部丟失。Memcached使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上,只要安裝了libevent即可使
用。在Windows下,它也有一個可用的非官方版本(http://code.jellycan.com/memcached/)。Memcached
的客戶端軟體實現非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang,
Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和
WordPress等。

在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d
install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make
install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可
以為其配置不同的啟動參數。

1.1 Memcache配置

Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。

1)-p <num> Memcached的TCP監聽埠,預設配置為11211;

2)-U <num> Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;

3)-s <file> Memcached監聽的UNIX套接字路徑;

4)-a <mask> 訪問UNIX套接字的八進制掩碼,預設配置為0700;

5)-l <addr> 監聽的伺服器IP地址,默認為所有網卡;

6)-d 為Memcached伺服器啟動守護進程;

7)-r 最大core文件大小;

8)-u <username> 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;

9)-m <num> 分配給Memcached使用的內存數量,單位是MB;

10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;

11)-c <num> 最大並發連數,預設配置為1024;

12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;

13)-f <factor> 用於設置chunk大小的遞增因子;

14)-n <bytes> 最小的chunk大小,預設配置為48個位元組;

15)-t <num> Memcached伺服器使用的線程數,預設配置為4個;

16)-L 嘗試使用大內存頁;

17)-R 每個事件的最大請求數,預設配置為20個;

18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;

2. Redis簡介

Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字
符串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等
POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、
Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘
寶,國外像Flickr、Github等均在使用Redis的緩存服務。

Redis的安裝非常方便,只需從http://redis.io/download獲取源碼,然後make && make

install即可。默認情況下,Redis的伺服器啟動程序和客戶端程序會安裝到/usr/local/bin目錄下。在啟動Redis伺服器時,我們
需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。

閱讀全文

與redis一致性hashphp相關的資料

熱點內容
遺傳演算法的浮點編碼 瀏覽:58
程序員與小區保安 瀏覽:18
javaarraycopy 瀏覽:293
紫禁城裡的小食光在app哪裡可以看 瀏覽:986
如何調節閱讀app字體大小 瀏覽:163
單片機管形 瀏覽:611
學電腦編程有前途嗎 瀏覽:646
安卓手機如何打開ys文件 瀏覽:259
程序員最深情的話 瀏覽:697
青椒視頻App在哪裡下載好 瀏覽:970
怎麼將電腦改為雲伺服器 瀏覽:500
華為電腦如何下載韓劇app 瀏覽:823
稀疏矩陣演算法復雜度 瀏覽:60
怎樣把歌曲轉換成源碼 瀏覽:323
光遇安卓怎麼平地滑行 瀏覽:159
常州php培訓 瀏覽:449
油氣田開發pdf 瀏覽:934
家有帶寬和伺服器帶寬有什麼區別 瀏覽:904
windows下編譯c語言開發工具 瀏覽:224
守望之海伺服器地址在那 瀏覽:905