你好,是我琉憶。
繼週一(2019.2-18)發佈的「PHP面試常考內容之Memcache和Redis(1)」後,這是第二篇,感謝你的支持和閱讀。
本週(2019.2-18至2-22)的文章內容點爲如下幾點,更新時間爲每週一三五,能夠關注本欄持續關注,感謝你的支持。php
1、什麼是Memcache?
2、Memcache有什麼特徵?
3、Memcache的內存管理機制是什麼樣的?
4、Memcache和Memcached有什麼區別?
5、如何操做Memcache?
6、如何使用Memcache作Session共享?
7、什麼是Redis?
8、如何使用Redis?
9、使用Redis須要注意哪些問題?
10、新增:Redis和Memcache有什麼不一樣?
11、新增:Redis如何實現持久化?
12、Memcache和Redis常考的面試題
本章節的內容將會被分爲三篇文章進行講解完整塊內容,第一篇主要講解一到六,第二篇主要講解七到十一(新增了十和十一),第三篇圍繞第十二點。html
如下正文的部份內容來自《PHP程序員面試筆試寶典》書籍,若是轉載請保留出處:nginx
Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set,有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集、並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,Redis支持各類不一樣方式的排序。與Memcached同樣,爲了保證效率,數據都是緩存在內存中。區別是Redis會週期性地把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。程序員
Redis的出現,很大程度上彌補了Memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客戶端,使用起來很方便。面試
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心地對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。redis
set方法的使用示例:數據庫
<?php
$Redis = new Redis();
$Redis->connect('127.0.0.1', 6378);
$res = $Redis->set(aaa,"bbbb");
var_dump($res); //結果:bool(true)
?>
如下僅羅列各使用方法的彙總,具體使用方法能夠參考示例和PHP的寫法進行使用:編程
與MySQL同樣,Redis在使用過程當中,也會碰到不少的問題,適當的技巧和優化將大大提升Redis的使用性能,提升服務的質量。現將常見的一些問題總結以下:segmentfault
keys*操做執行速度將會變慢。由於keys命令的時間複雜度是O(n),其中n是要返回的keys的個數,因而可知這個命令的複雜度就取決於數據量的大小了。當數據量比較大時,在這個操做執行期間,其餘任何命令在實例中都沒法執行,嚴重影響了性能。
可使用scan命令來代替,scan命令經過增量迭代的方式來掃描數據庫。緩存
使用INFO commandstats命令來查看全部命令的統計狀況,如命令執行了多少次,執行命令所耗費的毫秒數等信息。
Hash的存儲方式會大大提升操做效率。
不管何時,只要有可能就利用key超時的優點。一個很好的例子就是存儲一些諸如臨時認證key之類的東西。當你去查找一個受權key時——以OAUTH爲例——一般會獲得一個超時時間。這樣在設置key的時候,設成一樣的超時時間,Redis就會自動爲你清除!而再也不須要使用KEYS *來遍歷全部的key了。
若是必須確保關鍵性的數據能夠被放入Redis的實例中,那麼請使用異常處理機制。幾乎全部的Redis客戶端採用的都是「發送即忘」策略,所以常常須要考慮一個 key 是否真正被放到Redis數據庫中了。加入異常處理機制是程序健壯性保障的前提。
不管何時,只要有可能就分散多Redis實例的工做量。Redis集羣容許基於key範圍分離出部分包含主/從模式的key。多實例是保證集羣資源最大利用,集羣穩定的重要保障。
本身整理了一篇「 Redis如何實現集羣?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 redis」,我發給你。
(1)數據結構:Memcache只支持key value存儲方式,Redis支持更多的數據類型,好比Key value、hash、list、set、zset;
(2)多線程:Memcache支持多線程,Redis支持單線程;CPU利用方面Memcache優於Redis;
(3)持久化:Memcache不支持持久化,Redis支持持久化;
(4)內存利用率:Memcache高,Redis低(採用壓縮的狀況下比Memcache高);
(5)過時策略:Memcache過時後,不刪除緩存,會致使下次取數據數據的問題,Redis有專門線程,清除緩存數據;
Redis是一個支持數據持久化的內存數據庫,能夠對Redis設置,讓Redis週期性的把更新的數據同步到磁盤中保證數據持久化。
Redis支持的持久化策略有兩種,分別是:RDB和AOF。
RDB持久化的意思是:指定的時間間隔內保存數據快照。Redis默認的持久化方式就是RDB。
RDB的工做原理爲當 Redis 須要作持久化時,Redis 會 fork 一個子進程,子進程將數據寫到磁盤上一個臨時 RDB 文件中。當子進程完成寫臨時文件後,將原來的 RDB 替換掉,這樣的好處就是能夠 copy-on-write。
在Redis.conf 文件中RDB持久化的默認設置爲:
save 300 10 #300秒內,若是超過10個key被修改,則發起快照保存;
由於RDB的持久化方式是能夠在時間間隔內進行數據快照,因此RDB很是適合用於災難恢復。例如設置每小時備份一次,或天天備份一次總的,從而方便數據的追溯和還原到不一樣版本。
(1)特定時間下才進行一次持久化,因此易丟失數據;例如你設置30分鐘備份一次數據,可是若是Redis服務器發生故障,那麼就可能丟失好幾分鐘的數據沒能備份。
(2)龐大數據時,保存時會出現性能問題。
AOF:先把命令追加到操做日誌的尾部,保存全部歷史操做。
AOF的工做原理是,每個寫命令都經過write函數追加到 appendonly.aof 中,當Redis出現故障重啓時,將會讀取 AOF 文件進行「重放」以恢復到 Redis 關閉前的狀態。
Redis.conf 對AOF持久化的設置:
Redis.conf appendonly yes #開啓全程持久化
appendfsync always #每次有數據修改發生時都會寫入AOF文件。
appendfsync everysec #每秒鐘同步一次,該策略爲AOF的缺省策略。
(1)數據很是完整,故障恢復丟失數據少;
(2)可對歷史操做進行處理。
(1)在備份相同的數據集時,AOF的文件體積大於RDB的文件體積;
(2)AOF使用fsync策略的話,AOF的速度可能會慢於RDB。
由於Redis是支持同時開啓RDB和AOF持久化策略的,因此數據備份安全性考慮的話二者均可以設置,當Redis重啓後會優先使用AOF恢復數據,保證丟失的數據最少。
若是要二選一的話,能夠根據本身的業務進行選擇:
(1)若是對數據的丟失要求很高,能夠選擇AOF持久化策略;
(2)AOF對Redis執行的每一條命令都會追加到磁盤中,會下降Redis的性能,若是對Redis的性能有所考慮,能夠選擇RDB持久化策略;
(3)考慮數據災難恢復的狀況,能夠選擇RDB持久化策略。
這裏還有一個常考的Redis相關的問題:Redis如何實現緩存集羣?
關注公衆號:「 琉憶編程庫」,回覆:「 redis」,我發給你。
預告:PHP面試常考內容之Memcache和Redis(3)將於本週五(2019.2-22)更新。
以上內容摘自《PHP程序員面試筆試寶典》書籍,該書已在天貓、京東、噹噹等電商平臺銷售。
更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫
對本文有什麼問題或建議均可以進行留言,我將不斷完善追求極致,感謝大家的支持。
你好,是我琉憶。
繼週一(2019.2-18)發佈的「PHP面試常考內容之Memcache和Redis(1)」後,這是第二篇,感謝你的支持和閱讀。
本週(2019.2-18至2-22)的文章內容點爲如下幾點,更新時間爲每週一三五,能夠關注本欄持續關注,感謝你的支持。
1、什麼是Memcache?
2、Memcache有什麼特徵?
3、Memcache的內存管理機制是什麼樣的?
4、Memcache和Memcached有什麼區別?
5、如何操做Memcache?
6、如何使用Memcache作Session共享?
7、什麼是Redis?
8、如何使用Redis?
9、使用Redis須要注意哪些問題?
10、新增:Redis和Memcache有什麼不一樣?
11、新增:Redis如何實現持久化?
12、Memcache和Redis常考的面試題
本章節的內容將會被分爲三篇文章進行講解完整塊內容,第一篇主要講解一到六,第二篇主要講解七到十一(新增了十和十一),第三篇圍繞第十二點。
如下正文的部份內容來自《PHP程序員面試筆試寶典》書籍,若是轉載請保留出處:
Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set,有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集、並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,Redis支持各類不一樣方式的排序。與Memcached同樣,爲了保證效率,數據都是緩存在內存中。區別是Redis會週期性地把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。
Redis的出現,很大程度上彌補了Memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客戶端,使用起來很方便。
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心地對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。
set方法的使用示例:
<?php $Redis = new Redis(); $Redis->connect('127.0.0.1', 6378); $res = $Redis->set(aaa,"bbbb"); var_dump($res); //結果:bool(true) ?>
如下僅羅列各使用方法的彙總,具體使用方法能夠參考示例和PHP的寫法進行使用:
與MySQL同樣,Redis在使用過程當中,也會碰到不少的問題,適當的技巧和優化將大大提升Redis的使用性能,提升服務的質量。現將常見的一些問題總結以下:
keys*操做執行速度將會變慢。由於keys命令的時間複雜度是O(n),其中n是要返回的keys的個數,因而可知這個命令的複雜度就取決於數據量的大小了。當數據量比較大時,在這個操做執行期間,其餘任何命令在實例中都沒法執行,嚴重影響了性能。
可使用scan命令來代替,scan命令經過增量迭代的方式來掃描數據庫。
使用INFO commandstats命令來查看全部命令的統計狀況,如命令執行了多少次,執行命令所耗費的毫秒數等信息。
Hash的存儲方式會大大提升操做效率。
不管何時,只要有可能就利用key超時的優點。一個很好的例子就是存儲一些諸如臨時認證key之類的東西。當你去查找一個受權key時——以OAUTH爲例——一般會獲得一個超時時間。這樣在設置key的時候,設成一樣的超時時間,Redis就會自動爲你清除!而再也不須要使用KEYS *來遍歷全部的key了。
若是必須確保關鍵性的數據能夠被放入Redis的實例中,那麼請使用異常處理機制。幾乎全部的Redis客戶端採用的都是「發送即忘」策略,所以常常須要考慮一個 key 是否真正被放到Redis數據庫中了。加入異常處理機制是程序健壯性保障的前提。
不管何時,只要有可能就分散多Redis實例的工做量。Redis集羣容許基於key範圍分離出部分包含主/從模式的key。多實例是保證集羣資源最大利用,集羣穩定的重要保障。
本身整理了一篇「 Redis如何實現集羣?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 redis」,我發給你。
(1)數據結構:Memcache只支持key value存儲方式,Redis支持更多的數據類型,好比Key value、hash、list、set、zset;
(2)多線程:Memcache支持多線程,Redis支持單線程;CPU利用方面Memcache優於Redis;
(3)持久化:Memcache不支持持久化,Redis支持持久化;
(4)內存利用率:Memcache高,Redis低(採用壓縮的狀況下比Memcache高);
(5)過時策略:Memcache過時後,不刪除緩存,會致使下次取數據數據的問題,Redis有專門線程,清除緩存數據;
Redis是一個支持數據持久化的內存數據庫,能夠對Redis設置,讓Redis週期性的把更新的數據同步到磁盤中保證數據持久化。
Redis支持的持久化策略有兩種,分別是:RDB和AOF。
RDB持久化的意思是:指定的時間間隔內保存數據快照。Redis默認的持久化方式就是RDB。
RDB的工做原理爲當 Redis 須要作持久化時,Redis 會 fork 一個子進程,子進程將數據寫到磁盤上一個臨時 RDB 文件中。當子進程完成寫臨時文件後,將原來的 RDB 替換掉,這樣的好處就是能夠 copy-on-write。
在Redis.conf 文件中RDB持久化的默認設置爲:
save 300 10 #300秒內,若是超過10個key被修改,則發起快照保存;
由於RDB的持久化方式是能夠在時間間隔內進行數據快照,因此RDB很是適合用於災難恢復。例如設置每小時備份一次,或天天備份一次總的,從而方便數據的追溯和還原到不一樣版本。
(1)特定時間下才進行一次持久化,因此易丟失數據;例如你設置30分鐘備份一次數據,可是若是Redis服務器發生故障,那麼就可能丟失好幾分鐘的數據沒能備份。
(2)龐大數據時,保存時會出現性能問題。
AOF:先把命令追加到操做日誌的尾部,保存全部歷史操做。
AOF的工做原理是,每個寫命令都經過write函數追加到 appendonly.aof 中,當Redis出現故障重啓時,將會讀取 AOF 文件進行「重放」以恢復到 Redis 關閉前的狀態。
Redis.conf 對AOF持久化的設置:
Redis.conf appendonly yes #開啓全程持久化
appendfsync always #每次有數據修改發生時都會寫入AOF文件。
appendfsync everysec #每秒鐘同步一次,該策略爲AOF的缺省策略。
(1)數據很是完整,故障恢復丟失數據少;
(2)可對歷史操做進行處理。
(1)在備份相同的數據集時,AOF的文件體積大於RDB的文件體積;
(2)AOF使用fsync策略的話,AOF的速度可能會慢於RDB。
由於Redis是支持同時開啓RDB和AOF持久化策略的,因此數據備份安全性考慮的話二者均可以設置,當Redis重啓後會優先使用AOF恢復數據,保證丟失的數據最少。
若是要二選一的話,能夠根據本身的業務進行選擇:
(1)若是對數據的丟失要求很高,能夠選擇AOF持久化策略;
(2)AOF對Redis執行的每一條命令都會追加到磁盤中,會下降Redis的性能,若是對Redis的性能有所考慮,能夠選擇RDB持久化策略;
(3)考慮數據災難恢復的狀況,能夠選擇RDB持久化策略。
這裏還有一個常考的Redis相關的問題:Redis如何實現緩存集羣?
關注公衆號:「 琉憶編程庫」,回覆:「 redis」,我發給你。
預告:PHP面試常考內容之Memcache和Redis(3)將於本週五(2019.2-22)更新。
以上內容摘自《PHP程序員面試筆試寶典》書籍,該書已在天貓、京東、噹噹等電商平臺銷售。
更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫
對本文有什麼問題或建議均可以進行留言,我將不斷完善追求極致,感謝大家的支持。