當前位置:首頁 » 文件管理 » 緩存伺服器redis

緩存伺服器redis

發布時間: 2024-09-20 20:09:01

php資料庫緩存是什麼意思怎麼理解伺服器端的緩存和瀏覽器里的緩存是一個原理嗎

第一個問題:

資料庫緩存
我們知道當網站訪問量很大的時候,用戶直接去訪問你的資料庫,這個時候資料庫壓力很大,往往會導致你的數據伺服器蹦了,或者伺服器崩了。
那麼這個時候的解決方案從資料庫來說,就是加上緩存層,那麼常用的緩存就是redis,memcache了,或者有人使用文件。
第二個問題:
伺服器端的緩存:
文件緩存屬於伺服器上的,redis或者memcache也是屬於你伺服器端的緩存
第三個問題:
瀏覽器緩存,我們知道當你訪問網頁的時候,瀏覽器會去給你緩存網頁,會把你網頁的靜態載入文件去緩存,你按f5刷新實際上第二次訪問的是你的瀏覽器的緩存,當然這個可以根據header頭的參數去改動,你按ctrl+f5就是強制刷新式的訪問,這個時候就會重新去請求伺服器拿文件了!

② Redis 6.0多線程介紹

Redis作為一個基於內存的緩存系統,一直以高性能著稱,
在單線程處理情況下,讀速度可達到11萬次/s,寫速度達到8.1萬次/s。

官方曾做過類似問題的回復:使用Redis時,幾乎不存在CPU成為瓶頸的情況, Redis主要受限於內存和網路。

但是,單線程的設計也給Redis帶來一些問題:

針對上面問題,Redis在4.0版本以及6.0版本分別引入了Lazy Free以及多線程IO,逐步向多線程過渡。

 

Redis伺服器是一個事件驅動程序,伺服器需要處理以下兩類事件:

Redis伺服器通過套接字與客戶端(或者其他Redis伺服器)進行連接。
文件事件就是伺服器對套接字操作的抽象

伺服器與客戶端的通信會產生相應的文件事件,而伺服器則通過監聽並處理這些事件來完成一系列網路通信操作。
(eg: 連接accept,read,write,close等)

Redis伺服器中的一些操作(eg: serverCron函數)需要在給定的時間點執行。
時間事件就是伺服器對這類定時操作的抽象
(eg: 過期鍵清理,服務狀態統計等)

Redis將文件事件和時間事件進行抽象,時間輪詢器會監聽I/O事件表:
一旦有文件事件就緒,Redis就會優先處理文件事件,
接著處理時間事件。
在上述所有事件處理上,Redis都是以單線程形式處理,所以說Redis是單線程的。
處理過程見下圖

Redis基於Reactor模式開發了自己的I/O事件處理器,也就是文件事件處理器。
Redis在I/O事件處理上,採用了I/O多路復用技術,同時監聽多個套接字,
並為套接字關聯不同的事件處理函數,通過一個線程實現了多客戶端並發處理。
處理過程見下圖

上述的設計,在數據處理上避免了加鎖操作,既使得實現上足夠簡潔,也保證了其高性能。
當然, Redis單線程只是指其在事件處理上 ,實際上,Redis也並不是單線程的,比如生成RDB文件,就會fork一個子進程來實現。

 

背景:
客戶端向Redis發送一條耗時較長的命令,比如刪除一個含有上百萬對象的Set鍵,或者執行flushdb,flushall操作,
Redis伺服器需要回收大量的內存空間,導致伺服器卡住好幾秒,對負載較高的緩存系統而言將會是個災難。

為了解決這個問題,在Redis 4.0版本引入了Lazy Free, 將慢操作非同步化 ,這也是在事件處理上向多線程邁進了一步。

將大鍵的刪除操作非同步化,採用非阻塞刪除(對應命令UNLINK)。
大鍵的空間回收交由單獨線程實現,主線程只做關系解除,可以快速返回,繼續處理其他事件,避免伺服器長時間阻塞。

意義:
Redis在4.0版本引入了Lazy Free,自此Redis有了一個 Lazy Free線程專門用於大鍵的回收
同時,也去掉了聚合類型的共享對象,這為多線程帶來可能。
這為Redis在6.0版本實現了多線程I/O打下了基礎。

 

Redis 6.0的多線程並未將事件處理改成多線程,而是在I/O上。
因為,如果把事件處理改成多線程,不但會導致鎖競爭,而且會有頻繁的上下文切換,
即使用分段鎖來減少競爭,對Redis內核也會有較大改動,性能也不一定有明顯提升。

流程簡述如下:

見下圖

 

Redis6.0的多線程默認是禁用的,只使用主線程。
如需開啟需要修改redis.conf配置文件:

開啟多線程後,還需要設置線程數,否則是不生效的。
同樣修改redis.conf配置文件:

③ 緩存-redis 三種模式搭建和運行原理

標簽: redis 緩存 主從 哨兵 集群

本文簡單的介紹redis三種模式在linux的安裝部署和數據存儲的總結,希望可以相互交流相互提升。

對於Centos7在安裝redis之前需要進行一些常用工具的安裝:

關閉防火牆

正式安裝redis

在redis進行maketest時候會出現一系列的異常,有如下解決方案:

用redis-server啟動一下redis,做一些實驗沒什麼意義。

要把redis作為一個系統的daemon進程去運行的,每次系統啟動,redis進程一起啟動,操作不走如下:

RDB和AOF是redis的一種數據持久化的機制。 持久化 是為了避免系統在發生災難性的系統故障時導致的系統數據丟失。我們一般會將數據存放在本地磁碟,還會定期的將數據上傳雲伺服器
RDB 是redis的snapshotting,通過redis.conf中的save配置進行設置,如 save 60 1000:

AOF 是以appendonly方式進行數據的儲存的,開啟AOF模式後,所有存進redis內存的數據都會進入os cache中,然後默認1秒執行一次fsync寫入追加到appendonly.aof文件中。一般我們配置redis.conf中的一下指令:

AOF和RDB模式我們一般在生產環境都會打開,一般而言,redis服務掛掉後進行重啟會優先家在aof中的文件。

當啟動一個slave node的時候,它會發送一個PSYNC命令給master node,如果這是slave node重新連接master node,那麼master node僅僅會復制給slave部分缺少的數據;否則如果是slave node第一次連接master node,那麼會觸發一次full resynchronization;
開始full resynchronization的時候,master會啟動一個後台線程,開始生成一份RDB快照文件,同時還會將從客戶端收到的所有寫命令緩存在內存中。RDB文件生成完畢之後,master會將這個RDB發送給slave,slave會先寫入本地磁碟,然後再從本地磁碟載入到內存中。然後master會將內存中緩存的寫命令發送給slave,slave也會同步這些數據。
slave node如果跟master node有網路故障,斷開了連接,會自動重連。master如果發現有多個slave node都來重新連接,僅僅會啟動一個rdb save操作,用一份數據服務所有slave node。

從redis 2.8開始,就支持主從復制的斷點續傳,如果主從復制過程中,網路連接斷掉了,那麼可以接著上次復制的地方,繼續復制下去,而不是從頭開始復制一份。

master node會在內存中常見一個backlog,master和slave都會保存一個replica offset還有一個master id,offset就是保存在backlog中的。如果master和slave網路連接斷掉了,slave會讓master從上次的replica offset開始繼續復制,但是如果沒有找到對應的offset,那麼就會執行一次resynchronization。

master在內存中直接創建rdb,然後發送給slave,不會在自己本地落地磁碟了,可以有如下配置:

slave不會過期key,只會等待master過期key。如果master過期了一個key,或者通過LRU淘汰了一個key,那麼會模擬一條del命令發送給slave。

在redis.conf配置文件中,上面的參數代表至少需要3個slaves節點與master節點進行連接,並且master和每個slave的數據同步延遲不能超過10秒。一旦上面的設定沒有匹配上,則master不在提供相應的服務。

sdown達成的條件很簡單,如果一個哨兵ping一個master,超過了 is-master-down-after-milliseconds 指定的毫秒數之後,就主觀認為master宕機
sdown到odown轉換的條件很簡單,如果一個哨兵在指定時間內,收到了 quorum 指定數量的其他哨兵也認為那個master是sdown了,那麼就認為是odown了,客觀認為master宕機

如果一個slave跟master斷開連接已經超過了down-after-milliseconds的10倍,外加master宕機的時長,那麼slave就被認為不適合選舉為master

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

每次一個哨兵要做主備切換,首先需要quorum數量的哨兵認為odown,然後選舉出一個slave來做切換,這個slave還得得到majority哨兵的授權,才能正式執行切換;

(2)SENTINEL RESET *,在所有sentinal上執行,清理所有的master狀態
(3)SENTINEL MASTER mastername,在所有sentinal上執行,查看所有sentinal對數量是否達成了一致

4.3.2 slave的永久下線

讓master摘除某個已經下線的slave:SENTINEL RESET mastername,在所有的哨兵上面執行.

redis的集群模式為了解決系統的橫向擴展以及海量數據的存儲問題,如果你的數據量很大,那麼就可以用redis cluster。
redis cluster可以支撐N個redis master,一個master上面可以掛載多個slave,一般情況我門掛載一個到兩個slave,master在掛掉以後會主動切換到slave上面,或者當一個master上面的slave都掛掉後,集群會從其他master上面找到冗餘的slave掛載到這個master上面,達到了系統的高可用性。

2.1 redis cluster的重要配置

2.2 在三台機器上啟動6個redis實例

將上面的配置文件,在/etc/redis下放6個,分別為: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf

每個啟動腳本內,都修改對應的埠號

2.3 創建集群

解決辦法是 先安裝rvm,再把ruby版本提升至2.3.3

使用redis-trib.rb命令創建集群

--replicas: 表示每個master有幾個slave

redis-trib.rb check 192.168.31.187:7001 查看狀體

3.1 加入新master

以上相同配置完成後,設置啟動腳本進行啟動;然後用如下命令進行node節點添加:

3.2 reshard一些數據過去

3.3 添加node作為slave

3.4 刪除node

④ redis到底是個什麼東西

1. 什麼是Redis

Redis是由義大利人Salvatore Sanfilippo(網名:antirez)開發的一款內存高速緩存資料庫。Redis全稱為:Remote Dictionary Server(遠程數據服務),該軟體使用C語言編寫,Redis是一個key-value存儲系統,它支持豐富的數據類型,如:string、list、set、zset(sorted set)、hash。

2. Redis特點

Redis以內存作為數據存儲介質,所以讀寫數據的效率極高,遠遠超過資料庫。以設置和獲取一個256位元組字元串為例,它的讀取速度可高達110000次/s,寫速度高達81000次/s。

Redis跟memcache不同的是,儲存在Redis中的數據是持久化的,斷電或重啟後,數據也不會丟失。因為Redis的存儲分為內存存儲、磁碟存儲和log文件三部分,重啟後,Redis可以從磁碟重新將數據載入到內存中,這些可以通過配置文件對其進行配置,正因為這樣,Redis才能實現持久化。

Redis支持主從模式,可以配置集群,這樣更利於支撐起大型的項目,這也是Redis的一大亮點。

3. Redis應用場景,它能做什麼

眾多語言都支持Redis,因為Redis交換數據快,所以在伺服器中常用來存儲一些需要頻繁調取的數據,這樣可以大大節省系統直接讀取磁碟來獲得數據的I/O開銷,更重要的是可以極大提升速度。

拿大型網站來舉個例子,比如a網站首頁一天有100萬人訪問,其中有一個板塊為推薦新聞。要是直接從資料庫查詢,那麼一天就要多消耗100萬次資料庫請求。上面已經說過,Redis支持豐富的數據類型,所以這完全可以用Redis來完成,將這種熱點數據存到Redis(內存)中,要用的時候,直接從內存取,極大的提高了速度和節約了伺服器的開銷。

總之,Redis的應用是非常廣泛的,而且極有價值,真是伺服器中的一件利器,所以從現在開始,我們就來一步步學好它。

熱點內容
壓縮彈簧行程 發布:2024-10-10 06:35:50 瀏覽:801
php目錄在哪 發布:2024-10-10 06:30:09 瀏覽:620
安卓手機怎麼屏蔽垃圾號碼 發布:2024-10-10 06:24:32 瀏覽:923
區域網內文件夾同步 發布:2024-10-10 06:23:13 瀏覽:267
oracle中plsql 發布:2024-10-10 06:19:31 瀏覽:906
長春工程學院如何改校園網密碼 發布:2024-10-10 06:04:38 瀏覽:794
安卓光遇的像素為什麼是糊的 發布:2024-10-10 05:54:12 瀏覽:989
芒果tv在哪個文件夾 發布:2024-10-10 05:45:49 瀏覽:189
選擇ftp伺服器 發布:2024-10-10 04:56:16 瀏覽:198
php函數fopen 發布:2024-10-10 04:50:20 瀏覽:239