一個簡單的Redis應用,簡單Redis應用

來源:互聯網
上載者:User

一個簡單的Redis應用,簡單Redis應用
需求

很早就聽說過Redis的大名,但是一直也沒有去研究。因為前一陣有朋友需要用到,來問過我時大致看了看,正好最近自己也碰到需求,就研究了一下。

我這裡的情況其實很簡單:

在一個VPS上跑了一個應用,提供了短連結功能,原來的實現是直接在web server上 做了一個反向 Proxy,通過urlrewrite映射到後端伺服器上。這麼用當然是沒有問題,功能是完全可以實現的,只是後來發現,當把短連結分享到社交網路 的時候,會有短時的大量訪問,這些訪問全部壓到後端去查詢資料庫,就會有一點壓力了——因為我的VPS配置很低,所以在突發高訪問時還是有一定的機率發生 50x錯誤。

於是考慮把反向 Proxy用redis改寫成一個緩衝代理。其實這種需求用memcached也可以,因為持久化並非必須,大不了重啟以後從後端再取一次就是了。不過因為我對redis更感興趣,所以還是用redis來做了。

安裝配置

redis的安裝很簡單,我用的是debian,直接apt-get install redis-server即可。

配置上也沒什麼可說的,大部分都是用預設配置,只是對記憶體使用量作了一點限制——VPS資源緊張,要節約。反正短連結的資料量也不大。

安裝完成以後可以用 service redis-server start 啟動。用 redis-cli 可以通過命令操作資料庫。

雖然我對Python比較熟,但是這種簡單應用就懶得折騰環境了,直接用現成的PHP做吧。

首先是需要下載安裝一個PHP的redis庫,官方最推薦的兩個PHP庫是predis和phpredis,雖然目測用C寫的phpredis應該效能好些,但為了圖方便,我還是用純PHP的predis。

下載最新穩定版的Predis後,運行bin/create-single-file(需要系統中安裝了php-cli)即可產生一個單獨的Predis.php,把這個檔案放到你的項目路徑中就可以使用了,相當簡單。

功能實現

這個緩衝功能很簡單:

先取得短連結的ID,然後用這個ID去redis裡查詢。如果查到URL就直接返回302重新導向到這個URL。如果查不到就向後端查詢,取得302響應返回的redirect_url,然後把這個URL儲存到redis,並作302重新導向。

需要注意的是,對於向後端查詢失敗的ID也要儲存起來,並返回404錯誤,以避免錯誤的ID不斷向後端查詢,但是風險在於如果這個錯誤的ID以後用到了,也會查詢不到,所以還需要給錯誤的ID設定逾時,到期後刪除以便可以重新查詢。

主體部分代碼就這麼點:

function raise_404() {    header('HTTP/1.1 404 Not Found');    header("status: 404 Not Found");    die();}function redirect($url) {    header("Location: $url");}require 'Predis.php';$redisdb = new Predis\Client([    'database' => 1,]);$query = (array) explode('/', $_SERVER['REQUEST_URI']);if (!isset($query[1]) || $query[1]=="") raise_404();$id = $query[1];$url = $redisdb->get($id);if (!isset($url)) {    $url = get_redirect($id);    $redisdb->set($id, $url);    if ($url == "") {        $redisdb->expire($id, 3600);    }}if ($url != "") {    redirect($url);}else {    raise_404();}

其中get_redirect是通過curl向後端查詢實際URL的函數,這裡就不列出具體實現了。

實際跑了一段時間以後的效果還是很明顯的。從LOG統計上看,在這個緩衝代理處理了500個請求的時候,後端實際上只處理了不到100個,而且隨著時間推移,緩衝的ID越來越多,對後端的請求會越來越少。

這個實驗成功以後,我把RSS功能也緩衝起來,不過這個就複雜一些,但原理還是差不多的,只不過因為欄位多了,改為使用redis的HashMap值方式(支援多種類型的value是redis的一大強頂),另外還加上了Last-Modified和Etag支援,期望爬蟲們能聰明一點,會用這兩個東西來進一步減少不必要的訪問量。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.