一、nginx簡介
nginx的ngx_http_proxy_module模塊實現了后端反向代理功能,這樣就可以實現客戶端請求的動靜分離和負載均衡。
當客戶端請求反向代理至后端服務器時,建立的是keep-alive連接。代理服務器和前端,代理服務器和后端服務器都建立長連接,這樣會降低nginx的性能,這時候proxy就派上用場了。代理服務器和客戶端還是建立長連接,而代理服務器和后端web server之間請求結束之后,代理服務器會把數據緩存在本地,與后端不建立長連接大大節省了資源。當客戶端請求來時,代理服務器會先去緩存中尋找並返回給客戶端。代理服務器將緩存存在內存中,以key-value形式存儲,value存儲的是指向本地文件系統中存儲的URL的哈希值。
二、redis簡介
頻繁的寫入操作、相對較少的讀取統計信息的操作,應該使用基於內存的Key-Value存儲系統或者是具備本地更新特性的文檔存儲系統。
redis是一款先進的Key-Value存儲系統。
redis和Memcache類似,區別如下:
- redis不僅支持簡單的Key/Value類型的數據,同時還提供list、set、hash等數據結構的存儲。
- redis支持數據的備份,即master slave模式的數據備份。
- redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候再次加載進行使用。
在redis中,並不是所有的數據都一直存儲在內存中。
redis只會緩存所有的key的信息,如果redis發現內存的使用量超過了某個閾值,將觸發交換(swap)的操作。
redis根據“swappabillity=age*log(size_in_memory)” 計算出哪些Key對應的Value需要交換到磁盤,然后再將這些key對應的value持久化到磁盤中,同時在內存中清除。這種特性使得redis可以保存超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行交換操作的。
同時由於redis將內存中的數據交換到磁盤中的時候,提供服務的主線程和進行交換操作的子線程會共享這部分內存,所以如果更新需要交換的數據,redis將阻塞這個操作,直到子線程完成交換操作后才可以進行修改。