參考
http://blog.csdn.net/greatestrabit/article/details/51184262
Jedis連接方式
- Jedis/JedisPool
單個機(jī)器尘奏。 - ShardedJedis/ShardedJedisPool
水平拆分猜拾,多個機(jī)器間不通。 - JedisCluster
集群乃摹,機(jī)器間互通抠璃。
集群
- 一致性哈希
1. 對結(jié)點(diǎn)和數(shù)據(jù)都做hash.
2. 對結(jié)點(diǎn)做哈希讓其分布在一個環(huán)上(0到2的23次方-1)芽淡,這樣能夠做到結(jié)點(diǎn)的增加和減少對數(shù)據(jù)遷移影響最胁璧省(相比于取模hash方式)
3. 對數(shù)據(jù)做hash讓其分布在環(huán)上,環(huán)上的一段屬于一個結(jié)點(diǎn)(node A 到node B這段屬于node B).
4. 結(jié)點(diǎn)太少會出現(xiàn)失衡分布不均勻問題令境,需要設(shè)置虛擬結(jié)點(diǎn)來增多結(jié)點(diǎn)數(shù)。
- 分片
ShardedJedis顾瞪, 多個redis服務(wù)器舔庶,每個就是一片。redis為單線程陈醒,為了提高資源利用率惕橙,一臺機(jī)器會部多個redis實(shí)例。
I/O多路復(fù)用技術(shù)
采用此技術(shù)就可以實(shí)現(xiàn)單線程達(dá)到多線程的效果钉跷。
下面舉一個例子弥鹦,模擬一個tcp服務(wù)器處理30個客戶socket。
假設(shè)你是一個老師爷辙,讓30個學(xué)生解答一道題目彬坏,然后檢查學(xué)生做的是否正確,你有下面幾個選擇:
1. 第一種選擇:按順序逐個檢查膝晾,先檢查A栓始,然后是B,之后是C血当、D幻赚。禀忆。。這中間如果有一個學(xué)生卡主落恼,全班都會被耽誤箩退。這種模式就好比,你用循環(huán)挨個處理socket佳谦,根本不具有并發(fā)能力戴涝。
2. 第二種選擇:你創(chuàng)建30個分身,每個分身檢查一個學(xué)生的答案是否正確吠昭。 這種類似于為每一個用戶創(chuàng)建一個進(jìn)程或者線程處理連接喊括。
3. 第三種選擇,你站在講臺上等矢棚,誰解答完誰舉手郑什。這時C、D舉手蒲肋,表示他們解答問題完畢蘑拯,你下去依次檢查C、D的答案兜粘,然后繼續(xù)回到講臺上等申窘。此時E、A又舉手孔轴,然后去處理E和A剃法。。路鹰。 這種就是IO復(fù)用模型贷洲,Linux下的select、poll和epoll就是干這個的晋柱。將用戶socket對應(yīng)的fd注冊進(jìn)epoll优构,然后epoll幫你監(jiān)聽哪些socket上有消息到達(dá),這樣就避免了大量的無用操作雁竞。此時的socket應(yīng)該采用非阻塞模式钦椭。
這樣,整個過程只在調(diào)用select碑诉、poll彪腔、epoll這些調(diào)用的時候才會阻塞,收發(fā)客戶消息是不會阻塞的进栽,整個進(jìn)程或者線程就被充分利用起來漫仆,這就是事件驅(qū)動,所謂的reactor模式泪幌。