redis刪除指定前綴的緩存


redis作為緩存服務器為MySQL數據庫提供較高的防御性,對於一些數據的查詢可以直接從緩存中可以進行查詢。

但是,某些情況下,我們需要清除緩存。

以下場景:

公司經常做活動,每個活動都存在大量的數據。在新活動進行測試的時候,也會產生一些緩存,但是刪除這些緩存如果不能批量刪除就有點煩了。

在寫活動的時候,為了保證活動的緩存不沖突,用自己姓名的前綴及活動的英文名作為前綴。緩存在很大程度上能夠幫助我們降低服務器的訪問壓力,但是也要防止緩存失效的情況,緩存並不能作為我們的最終依靠。

首先在緩存中查詢,如果緩存中不存在再去mysql數據庫中查詢,當數據庫中真的不存在的時候,才能確定該查詢的數據不存在;因此在數據庫中查到數據的時候,再將該數據寫入緩存。

------------------------------------------------------------------------------------------------------

如何刪除指定前綴的redis。。。

我們一開始給redis封裝了一個類庫

<?php
  class RedisClass
  {
    static $_instance; //存儲對象
    public $handler ;
      private function __construct($dbindex = 0)
      {      
        global $_G ;
        $data = $_G['config']['redis']['redis']['params']; 
        if ( !extension_loaded('redis') ) {
            throw new Exception("REDIS NOT  SUPPORT", 1);
        }      
        $this->handler =  new Redis();  
        //從配置讀取
        $this->handler->connect($data['hostname'],$data['port']);
        $this->handler->auth($data['auth']);
        $this->handler->select($dbindex);  
      }
      public static function getInstance($dbindex = 0){
        if(!isset(self::$_instance[$dbindex]) or  FALSE == (self::$_instance[$dbindex] instanceof self)){
          self::$_instance[$dbindex] = new self($dbindex);
        }
        return self::$_instance[$dbindex];
      }

    /**key value  get**/
    public  function GET($key)
    {
      return  $this->handler->get($key);
    }
    /**key value  set  過期時間為 $exp**/
    public  function SET($key ,$value ,$exp)
    {
        $this->handler->setex($key ,$exp ,$value );
    }

    /*移除數據$key*/
    public  function REMOVE($key)
    {
        $this->handler->delete($key);

    }
      /*設置數據的過期時間$key*/
    public  function EXPIRE($key ,$exp)
    {
        $this->handler->expire($key ,$exp);
    }
    /**Hash 相關**/

    public  function HGET($domain , $key)
    {
        return $this->handler->hGet($domain , $key);
    }
    public  function HSET ($domain ,$key ,$value )
    {
          $this->handler->hSet($domain , $key);
    }

    public  function HREMOVE($domain ,$key)
    {
        $this->handler->hDel($domain , $key);
    }
    public function HGETALL($key = '' ){
        return $this->handler->hGetAll($key);
    }
    public function HMset($key = ''  , $value = array()){
        return $this->handler->hMset($key , $value );
    }
    /*插入列表*/
    public  function  PushList($channel,$data)
    {
          $this->handler->lPush($channel,$data);
    }

    /*從列表中獲取*/
    public function  POPList($channel)
    {
        return  $this->handler->lPop($channel);
    }

    public  function  SADD($hash ,$value){

        return  $this->handler->SADD($hash ,$value);
    }

    public  function  SMEMBERS($hash){
      return $this->handler->SMEMBERS($hash );
    }

    /**
     * pj
     * 用於批量獲取指定
     * @param [type] $key [description]
     *  例如:
     *  $key = "pj_group_*";//獲取以pj_group_
        $cache = RedisClass::getInstance(12);
        $data = $cache->KEYS($key);
        $cache->DELKEYS($data);
     */
    public  function  KEYS($key){//獲取指定的key 或者指定前綴的key
      return $this->handler->keys($key );
    }
    public  function  DELKEYS($data = array()){
      return $this->handler->delete($data);
    }
  }
 ?>

批量刪除redis緩存的思路:

先獲取要刪除的redis前綴,比如“pj_group_*”為前綴的

然后直接delete掉這些key就可以了

//刪除指定開始的前綴緩存
    public function indexAction(){
        $key = "pj_group_*";//當前openid
        $cache = RedisClass::getInstance(12);
        $data = $cache->KEYS($key);
        $cache->DELKEYS($data);
    }

 


免責聲明!

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



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