redis使用及配置之緩存詳解


redis使用及配置之緩存詳解

1、Redis的介紹

       Redis是一個Key-Value存儲系統。它支持存儲的value類型有:string(字符串),list(鏈表), set(無序集合),zset(sorted set有序集合)和hash,也可以把redis看成一個數據結構服務器。這些數據類型都支持pust/popadd/remove及取交集、並集和差集運算,Redis支持各種不同方式的排序。數據都是緩存在內存中的,它也可以周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並實現了master-slave(主從)同步。

       Redis提供的API語言包括C、C++、C#、JavaJavaScript、Lua、Objective-C、Perl、PHP、Python、Ruby、Go、Tcl等。

       使用Redis:新浪微博,200+ Server、400 port、4G data.

       使用方式:與memcache相同

              1. 應用程序直接訪問Redis數據庫;

              2. 應用程序直接訪問Redis,只有當訪問Redis失敗時才訪問MySQL

       應用場合:

              1. 取最新N個數據的操作

              2. 排行榜應用

              3. 需要精確設定過期時間的應用

              4. 計數器應用

              5. Uniq操作,獲取某段時間所有數據排重值

              6. 實時系統,反垃圾系統

              7. Pub/Sub構建實時消息系統

              8. 構建隊列系統

              9. 緩存

              10. 存儲微博關注關系

       Redis有庫無表無字段無行列。MongoDB有庫有集合(對應於Mysql中的表)

 

 2、redis客戶端

可以通過百度網盤下載:

 http://pan.baidu.com/s/1pLH79jX

 

客戶端打開圖示:

 

 通過redisClient客戶端可以看到我們存儲到redis中的數據;

3、應用示例

 

TestAPI已經寫了get(/TestRedis/get)和set(/TestRedis/set)示例。
 
下載了predis之后,將predis包加入項目目錄中:
 redis訪問路徑我們一般配置在配置文件中:redis_config.php文件中添加下面的代碼:
<?php
$master_redis_config = array('tcp://172.16.0.39:6379', array('profile' => '3.0'));
$slave_redis_config = array('tcp://172.16.0.39:6379', array('profile' => '3.0'));
?>

 


在需要使用redis文件中加入下面代碼,自動加載redis服務:

require_once 'predis/autoload.php';

 

使用redis存儲服務時,代碼如下:

    private function hsetRedisDatas($hash_table, $key, $value){
        $redis_config = Flight::get('master_redis_config');
        $redis = new Predis\Client($redis_config[0]);
        $redis->hset($hash_table,$key, $value);
    }

注意:這里使用了Flight框架加載配置文件,獲取redis訪問路徑;

獲取redis數據時,代碼如下:

    private function hgetRedisDatas($hash_table, $key){
        $redis_config = Flight::get('master_redis_config');
        $redis = new Predis\Client($redis_config[0]);
        $result = $redis->hget($hash_table,$key);
        return $result;
    }

 

 在存儲和獲取redis中的數據時,使用這兩個私有方法就可以了;
 
    public function getShippingName($shipping_id){
        $shipping_name = self::hgetRedisDatas('shipping_name', $shipping_id);
        if (empty($shipping_name)){
            $shipping_name = "當redis沒有緩存數據時,通過讀取數據庫獲取數據";
            if (!empty($shipping_name) && !isset($shipping_name['error_code'])){
                self::hsetRedisDatas('shipping_name', $shipping_id, $shipping_name);
            }
        }
        return $shipping_name;
    }

 

 

 更新redis緩存

create/update/delete---同時存到redis和數據庫

query--先從redis查,沒有記錄才從數據庫查,並把從數據庫查的結果也放一份到redis

 
做好緩存之后,出現了一個問題,就是如何更新redis緩存呢?
 
有時候我們調用其他項目的接口來獲取數據,那么怎么樣通過redis來進行緩存呢?
 
1、一種方法是讓對方做緩存
這種方式的缺點是對方並不一定喜歡給你做緩存,增加了對方的開發成本;
 
2.第二種方法是我們當第一次調用對方接口的時候,我們自己做緩存,確保相同參數的接口,我們只調用一次對方接口;
只需要在請求結束的時候,清空緩存就行了,這樣就能保證每次獲取到的都是對方最新的數據;
    private static function removeRedisDatas(){
        $redis_config = Flight::get('master_redis_config');
        $redis = new \Predis\Client($redis_config[0]);
        $redis->del($redis->keys('inventory*'));
    }

我們在redis中定義特殊的key,例如inventory*,這樣我們就可以將inventory開頭的緩存清空,而不至於影響其他redis緩存數據;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM