3.Top 10 list
產(chǎn)品運(yùn)營(yíng)總會(huì)讓你展示最近、最熱、點(diǎn)擊率最高、活躍度最高等等條件的top list。很多更新較頻繁的列表如果使用MC+MySQL維護(hù)的話緩存失效的可能性會(huì)比較大,鑒于占用內(nèi)存較小的情況,使用Redis做存儲(chǔ)也是相當(dāng)不錯(cuò)的。
4.Last Index
用戶最近訪問(wèn)記錄也是redis list的很好應(yīng)用場(chǎng)景,lpush lpop自動(dòng)過(guò)期老的登陸記錄,對(duì)于開(kāi)發(fā)來(lái)說(shuō)還是非常友好的。
5.Relation List/Message Queue
這里把兩個(gè)功能放在最后,因?yàn)檫@兩個(gè)功能在現(xiàn)實(shí)問(wèn)題當(dāng)中遇到了一些困難,但在一定階段也確實(shí)解決了我們很多的問(wèn)題,故在這里只做說(shuō)明。
Message Queue就是通過(guò)list的lpop及l(fā)push接口進(jìn)行隊(duì)列的寫(xiě)入和消費(fèi),由于本身性能較好也能解決大部分問(wèn)題。
6.Fast transaction with Lua
Redis 的Lua的功能擴(kuò)展實(shí)際給Redis帶來(lái)了更多的應(yīng)用場(chǎng)景,你可以編寫(xiě)若干command組合作為一個(gè)小型的非阻塞事務(wù)或者更新邏輯,如:在收到message推送時(shí),同時(shí)1.給自己的增加一個(gè)未讀的對(duì)話 2.給自己的私信增加一個(gè)未讀消息 3.最后給發(fā)送人回執(zhí)一個(gè)完成推送消息,這一層邏輯完全可以在Redis Server端實(shí)現(xiàn)。
但是,需要注意的是Redis會(huì)將lua script的全部?jī)?nèi)容記錄在aof和傳送給slave,這也將是對(duì)磁盤(pán),網(wǎng)卡一個(gè)不小的開(kāi)銷。
7.Instead of Memcache
- 很多測(cè)試和應(yīng)用均已證明,
- 在性能方面Redis并沒(méi)有落后memcache多少,而單線程的模型給Redis反而帶來(lái)了很強(qiáng)的擴(kuò)展性。
- 在很多場(chǎng)景下,Redis對(duì)同一份數(shù)據(jù)的內(nèi)存開(kāi)銷是小于memcache的slab分配的。
- Redis提供的數(shù)據(jù)同步功能,其實(shí)是對(duì)cache的一個(gè)強(qiáng)有力功能擴(kuò)展。
Redis使用的重要點(diǎn)
1.rdb/aof Backup!
我們線上的Redis 95%以上是承擔(dān)后端存儲(chǔ)功能的,我們不僅用作cache,而更為一種k-v存儲(chǔ),他完全替代了后端的存儲(chǔ)服務(wù)(MySQL),故其數(shù)據(jù)是非常重要的,如 果出現(xiàn)數(shù)據(jù)污染和丟失,誤操作等情況,將是難以恢復(fù)的。所以備份是非常必要的!為此,我們有共享的hdfs資源作為我們的備份池,希望能隨時(shí)可以還原業(yè)務(wù) 所需數(shù)據(jù)。
2.Small item & Small instance!
由于Redis單線程(嚴(yán)格意義上不是單線程,但認(rèn)為對(duì)request的處理是單線程的)的模型,大的數(shù)據(jù)結(jié)構(gòu)list,sorted set,hash set的批量處理就意味著其他請(qǐng)求的等待,故使用Redis的復(fù)雜數(shù)據(jù)結(jié)構(gòu)一定要控制其單key-struct的大小。
另外,Redis單實(shí)例的內(nèi)存容量也應(yīng)該有嚴(yán)格的限制。單實(shí)例內(nèi)存容量較大后,直接帶來(lái)的問(wèn)題就是故障恢復(fù)或者Rebuild從庫(kù)的時(shí)候時(shí)間較長(zhǎng),而更糟糕的是,Redis rewrite aof和save rdb時(shí),將會(huì)帶來(lái)非常大且長(zhǎng)的系統(tǒng)壓力,并占用額外內(nèi)存,很可能導(dǎo)致系統(tǒng)內(nèi)存不足等嚴(yán)重影響性能的線上故障。我們線上96G/128G內(nèi)存服務(wù)器不建議單實(shí)例容量大于20/30G。
3.Been Available!
業(yè)界資料和使用比較多的是Redis sentinel(哨兵)
http://www.huangz.me/en/latest/storage/redis_code_analysis/sentinel.html
http://qiita.com/wellflat/items/8935016fdee25d4866d9
2000行C實(shí)現(xiàn)了服務(wù)器狀態(tài)檢測(cè),自動(dòng)故障轉(zhuǎn)移等功能。
但由于自身實(shí)際架構(gòu)往往會(huì)復(fù)雜,或者考慮的角度比較多,為此