一、為什么使用緩存?
當(dāng)網(wǎng)站的處理和訪問(wèn)量非常大的時(shí)候,我們的數(shù)據(jù)庫(kù)的壓力就變大了,數(shù)據(jù)庫(kù)的連接池,數(shù)據(jù)庫(kù)同時(shí)處理數(shù)據(jù)的能力就會(huì)受到很大的挑戰(zhàn),一旦數(shù)據(jù)庫(kù)承受了其最大承受能力,網(wǎng)站的數(shù)據(jù)處理效率就會(huì)大打折扣。此時(shí)就要使用高并發(fā)處理、負(fù)載均衡和分布式數(shù)據(jù)庫(kù),而這些技術(shù)既花費(fèi)人力,又花費(fèi)資金。
二、什么是redis緩存到MySQL?
Redis其實(shí)就是說(shuō)把表中經(jīng)常訪問(wèn)的記錄放在了Redis中,然后用戶查詢時(shí)先去查詢Redis再去查詢MySQL,確實(shí)實(shí)現(xiàn)了讀寫分離,也就是Redis只做讀操作。
由于緩存在內(nèi)存中,所以查詢會(huì)很快。對(duì)于一個(gè)sql語(yǔ)句格式的數(shù)據(jù)請(qǐng)求,首先計(jì)算該語(yǔ)句的MD5并據(jù)此得到結(jié)果集標(biāo)識(shí)符,然后利用該標(biāo)識(shí)符在Redis中查找該結(jié)果集。
注意,結(jié)果集中的每一行都有一個(gè)相應(yīng)的鍵,這些鍵都存儲(chǔ)在一個(gè)Redis集合結(jié)構(gòu)中。如果Redis中不存在這樣一個(gè)集合,說(shuō)明要找的結(jié)果集不在Redis中,所以需要執(zhí)行相應(yīng)的sql語(yǔ)句,在Mysql中查詢到相應(yīng)的結(jié)果集,然后按照上面所說(shuō)的辦法把結(jié)果集中的每一行以字符串或哈希的形式存入Redis。
三、為什么使用redis做mysql的緩存,還有其他緩存策略嗎?
Memcatched和Redis
1.性能上
性能上都很出色,具體到細(xì)節(jié),由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個(gè)核上Redis在存儲(chǔ)小數(shù)據(jù)時(shí)比Memcached性能更高。
而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲(chǔ)大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起 Memcached,還是稍有遜色。
2.內(nèi)存空間和數(shù)據(jù)量大小
MemCached可以修改最大內(nèi)存,采用LRU算法。Redis增加了VM的特性,突破了物理內(nèi)存的限制。
3.操作便利上
MemCached數(shù)據(jù)結(jié)構(gòu)單一,僅用來(lái)緩存數(shù)據(jù),而Redis支持更加豐富的數(shù)據(jù)類型,也可以在服務(wù)器端直接對(duì)數(shù)據(jù)進(jìn)行豐富的操作,這樣可以減少網(wǎng)絡(luò)IO次數(shù)和數(shù)據(jù)體積。
4.可靠性上
MemCached不支持?jǐn)?shù)據(jù)持久化,斷電或重啟后數(shù)據(jù)消失,但其穩(wěn)定性是有保證的。Redis支持?jǐn)?shù)據(jù)持久化和數(shù)據(jù)恢復(fù),允許單點(diǎn)故障,但是同時(shí)也會(huì)付出性能的代價(jià)。
5.應(yīng)用場(chǎng)景
Memcached:動(dòng)態(tài)系統(tǒng)中減輕數(shù)據(jù)庫(kù)負(fù)載,提升性能;做緩存,適合多讀少寫,大數(shù)據(jù)量的情況(如人人網(wǎng)大量查詢用戶信息、好友信息、文章信息等)。Redis:適用于對(duì)讀寫效率要求都很高,數(shù)據(jù)處理業(yè)務(wù)復(fù)雜和對(duì)安全性要求較高的系統(tǒng)(如新浪微博的計(jì)數(shù)和微博發(fā)布部分系統(tǒng),對(duì)數(shù)據(jù)安全性、讀寫要求都很高)。
四、如何redis數(shù)據(jù)和mysql數(shù)據(jù)同步?
redis其讀取速度快,但是redis 怎么和數(shù)據(jù)庫(kù)同步呢,怎么能把數(shù)據(jù)庫(kù)的所有數(shù)據(jù)存到redis里面,能使用戶更快速的查找。
方法1:mysql 同步到redis:解析mysql的binlog,然后做同步處理,可以使用的庫(kù)有:open-replicator(https://Github.com/whitesock/open-replicator)
方法2:同步redis數(shù)據(jù)到mysql:(https://github.com/leonchen83/redis-replicator)
后來(lái)發(fā)現(xiàn),redis讀取速度快,也沒(méi)有必要把所有的數(shù)據(jù)都放到redis里面,redis里面只放使用頻繁,用戶操作量較大的數(shù)據(jù),或者用戶近期使用的數(shù)據(jù)。解決辦法:
1、讀取數(shù)據(jù)的時(shí)候先從redis里面查,若沒(méi)有,再去數(shù)據(jù)庫(kù)查,同時(shí)寫到redis里面,并且要設(shè)置失效時(shí)間。
2、存數(shù)據(jù)的時(shí)候要具體情況具體分析,可以選擇同時(shí)插到數(shù)據(jù)庫(kù)和redis(要是存放到redis中,最好設(shè)置失效時(shí)間),也可以選擇直接插到數(shù)據(jù)庫(kù)里面,少考慮一些問(wèn)題。