什么是RedisRedis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),。 redis的出現(xiàn),,很大程度補(bǔ)償了memcached這類key/value存儲(chǔ)的不足,在部分場(chǎng)合可以對(duì)關(guān)系數(shù)據(jù)庫(kù)起到很好的補(bǔ)充作用,。它提供了Java,,C/C++,C#,,PHP,,JavaScript,Perl,,Object-C,,Python,Ruby,,Erlang等客戶端,,使用很方便,。 優(yōu)點(diǎn)
缺點(diǎn)及解決辦法緩存和數(shù)據(jù)庫(kù)雙寫一致性問題 必然存在不一致問題,,如果對(duì)數(shù)據(jù)有較強(qiáng)的一致性要求,不要加緩存,,直接訪問數(shù)據(jù)庫(kù),。先更改數(shù)據(jù)庫(kù),在刪除緩存,,可能存在刪除緩存失敗問題,,提供補(bǔ)償策略:消息隊(duì)列 緩存雪崩問題 黑客故意請(qǐng)求緩存中不存在的數(shù)據(jù),導(dǎo)致所有請(qǐng)求都到了數(shù)據(jù)庫(kù)上 緩存擊穿問題 緩存同一時(shí)間大面積失效,,所有請(qǐng)求都到了數(shù)據(jù)庫(kù)上 解決這兩個(gè)問題方案:給緩存加上隨機(jī)失效時(shí)間,,避免同時(shí)失效。使用互斥鎖,。雙緩存,,設(shè)定不同的緩存時(shí)間。 緩存的并發(fā)競(jìng)爭(zhēng)問題 1,、redis事務(wù)機(jī)制,,不推薦。因?yàn)榇蠖鄶?shù)生產(chǎn)環(huán)境都是redis集群環(huán)境,,做了數(shù)據(jù)分片,。 2,、如果對(duì)key操作,不要求順序,,準(zhǔn)備一個(gè)分布鎖,,去搶鎖 3、如果對(duì)key操作,,要求順序,,對(duì)系統(tǒng)設(shè)定不同的字段,那個(gè)修改了就修改這個(gè)字段 注意: 1,、redis是單線程的,,但是速度還是非常快 a.純內(nèi)存操作 b.單線程操作,,避免了頻繁的上下文切換 c.采用了非阻塞I/O多路復(fù)用機(jī)制 參照上圖,,簡(jiǎn)單來說,就是,。我們的redis-client在操作的時(shí)候,,會(huì)產(chǎn)生具有不同事件類型的socket。在服務(wù)端,,有一段I/0多路復(fù)用程序,,將其置入隊(duì)列之中。然后,,文件事件分派器,,依次去隊(duì)列中取,轉(zhuǎn)發(fā)到不同的事件處理器中,。 2,、redis采用定期刪除和惰性刪除策略 定時(shí)刪除和定期刪除是不同的 定時(shí)刪除:用一個(gè)定時(shí)器來監(jiān)視key,如果key過期了就刪除,,但是會(huì)占用大量的CPU資源,,當(dāng)有大并發(fā)時(shí),CPU因該將時(shí)間應(yīng)用在處理請(qǐng)求 上而不是刪除key 定期刪除:默認(rèn)每隔一段時(shí)間就檢查是否有key過期,,如果過期就刪除。redis不是檢查所有的key,,而是隨機(jī)抽測(cè)檢查 惰性刪除:在獲取某個(gè)key的時(shí)候,,redis會(huì)檢查一下,如果過期了,,就刪除 采用定期刪除和惰性刪除也是有問題的,,如果定期刪除沒有刪除key,,你也沒有去請(qǐng)求key,,內(nèi)存就會(huì)越來越多,。那么就因該采用內(nèi)存淘汰機(jī) 制。 |
|