Redis存取多維對象或數組


17-03-16 更新 

最近閱讀tp5的底層類的實現,

看到了大神的Redis 類的實現, 覺

得非常的簡潔明了,而且統一了所有的get,set,在更新一下,非常值得參考

    /**
     * 讀取緩存
     * @access public
     * @param string $name 緩存變量名
     * @param mixed  $default 默認值
     * @return mixed
     */
    public function get($name, $default = false)
    {
        //拼接key , 並獲取緩存
        $value = $this->handler->get($this->getCacheKey($name));
        if (is_null($value)) {
            return $default;
        }
        $jsonData = json_decode($value, true);
        // 檢測是否為JSON數據 true 返回JSON解析數組, false返回源數據 
        return (null === $jsonData) ? $value : $jsonData;
    }

    /**
     * 寫入緩存
     * @access public
     * @param string    $name 緩存變量名
     * @param mixed     $value  存儲數據
     * @param integer   $expire  有效時間(秒)
     * @return boolean
     */
    public function set($name, $value, $expire = null)
    {
        if (is_null($expire)) {
            $expire = $this->options['expire'];
        }
        if ($this->tag && !$this->has($name)) {
            $first = true;
        }
        //增加KEY的前綴
        $key = $this->getCacheKey($name);
        //對數組/對象數據進行緩存處理,保證數據完整性 
        $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;
        if (is_int($expire) && $expire) {
            $result = $this->handler->setex($key, $expire, $value);
        } else {
            $result = $this->handler->set($key, $value);
        }
        isset($first) && $this->setTagItem($key);
        return $result;
    }

 

 

 

16.11.9號更新:

后來發現,由於redis存儲數據方式,如果存儲的數據中有"x:x"時,似乎會導致讀取錯誤,存儲時需注意

 

 

 

今天遇到了redis保存多維數組出錯的情況,得知redis是只能模擬簡單數組,沒有多維數組的數據結構.

解決方案是序列化一下保存的數據

我的解決方案是在原有的hset跟hget的基礎上新增了兩個方法 setArr跟getArr 調用 hset hget 用來保存多維數組的情況

這兩個方法是在存之前,取之后都進行序列化操作.

既不影響原來的簡單操作

又實現了保存多維數組的作用

 

例子如下

 

 

<?php 
namespace Vendor\Redis;
class DefaultRedis{
private $redis;
public function __construct($host='127.0.0.1',$port =3198,$auth = '#yr9XjB%b6k'){
$this->redis = new \Redis();
$this->redis->pconnect($host,$port);
$this->redis->auth($auth);
}


/**
* [set key-value設置 會覆蓋]
* @ckhero
* @DateTime 2016-06-17
* @param [type] $name [緩存名字(傳進來的參數可為數組)]
* @param [type] $value [緩存值]
* @param integer $expire [緩存有效期]
*/
public function set($name,$value,$expire=0){
if(is_array($name)){ //判斷是否維數組
foreach($name as $key=>$val){
if($expire==0){
if(!$this->redis->set($val,$value[$key])){ //緩存失敗則會中斷
return false;
}
}else{
if(!$this->redis->setex($val,$expire,$value[$key])){
return false;
}
}
}
return true;
}else{
if($expire==0){
return $this->redis->set($name,$value);
}else{
return $res = $this->redis->setex($name,$expire,$value);
}
}
}
/**
* [setnx 設置值不覆蓋]
* @ckhero
* @DateTime 2016-06-17
* @param [type] $name [緩存名字]
* @param [type] $value [緩存的值]
* @return [type] [返回 成功(true)/失敗(false)]
*/
public function setnx($name,$value){
return $this->redis->setnx($name,$value);
}
/////////////////////set/getarr///////////////////////////////////// /**
* [setArr 將存入的數據進行序列化]
* @ckhero
* @DateTime 2016-10-27
* @param [type] $key [description]
* @param [type] $data [description]
*/
public function setArr($key,$data){
$this->set($key,serialize($data));
}
public function getArr($key){ return unserialize($this->get($key)); } //////////////////////////////////////////// /** * [get 獲取緩存] * @ckhero * @DateTime 2016-06-17 * @param [type] $name [緩存名字(可為數組)] * @return [type] [返回值] */ public function get($name){ if(!is_array($name)){ return $this->redis->get($name); }else{ return $this->redis->getMultiple($name); } } /** * [exists 驗證指定的鍵是否存在] * @ckhero * @DateTime 2016-06-17 * @param [type] $name [緩存名字] * @return [type] [返回 存在(true)/不存在(false)] */ public function exists($name){ return $this->redis->exists($name); } /** * [delete 刪除] * @ckhero * @DateTime 2016-06-17 * @param [type] $name [緩存名字] * @return [type] [返回 成功(true)/失敗(false)] */ public function delete($name){ return $this->redis->delete($name); }


public function hset($key,$val,$field){ if(!is_array($val)){ return $this->redis->hset($key,$field,$val); }else{ return $this->redis->hMset($key,$val); } } public function hget($key,$field=false){ if(!$field){ return $this->redis->hGetAll($key); }else{ return $this->redis->hGet($key,$name); } } /** * list * 操作 */ /** * [lpush 左/右插入] * @ckhero * @DateTime 2016-07-29 * @param [type] $key [description] * @param [type] $val [description] * @param string $type [l從左邊插入,R從右邊插入] * @return [type] [description] */ public function lset($key,$val,$type = 'L',$index=-1){ if(empty($key)){ return false; } if(!is_array($val)){ //不是數組先轉為數組 $arr[] = $val; }else{ $arr = $val; } foreach($arr as $k=>$v){ if($type=='L'){ $res[] = $this->redis->lPush($key,$v); //左插入 }else if($type=='R'){ $res[] = $this->redis->rPush($key,$v); //右插入 }elseif($type=='S'){ $res[] = $this->redis->lSet($key,$index,$v); //定點插入 }else{ return false; } } return $res; } /** * [lsize 返回該列表長度 ] * @ckhero * @DateTime 2016-07-29 * @param [type] $key [description] * @return [type] [description] */ public function lsize($key){ return $this->redis->lSize($key); } /** * [lget 獲取list的值] * @ckhero * @DateTime 2016-08-11 * @param [type] $key [description] * @param [type] $type [description] * @param integer $start [description] * @param integer $end [description] * @return [type] [description] */ public function lget($key,$type,$start=0,$end=-1){ if(empty($key)){ return false; } if($type == 'g'){ //return $this->reids->lget($key,1); }else if($type=='R'){ return $this->redis->lRange($key,$start,$end); } } /** * [pop 返回一個值 並且刪除該值] * @ckhero * @DateTime 2016-08-11 * @param [type] $key [description] * @param string $type [description] * @return [type] [description] */ public function pop($key,$type = "L"){ if(!empty($key)){ if($type =='l'){ return $this->redis->lPop($key); }elseif($type=='R'){ return $this->redis->rPop($key); } } return false; } public function ltrim($key,$start,$end){ return $this->redis->lTrim($key,$start,$end); } /** * [expire 設置過期時間] * @ckhero * @DateTime 2016-08-16 * @param [type] $data [二維數組安然然也array( array('鍵值'=>過期時間))] * @return [type] [description] */ public function expire($key,$val){ if(!is_array($key)){ $data[$key] = $val; }else{ $data = $key; } foreach($data as $k=>$expire_time){ $this->redis->expire($k,$expire_time); } return true; } /** * [databaseSelect 表選擇] * @ckhero * @DateTime 2016-08-18 * @param string $name [表名字] * @return [type] [description] */ public function databaseSelect($name='default'){ switch($name){ case 'pt_log': $database = 1; break; case 'zwid': $database = 2; break; case 'one_coin': $database = 3; break; case "wheel" : $database = 4; break; case "home" : $database = 5; break; case "analysis" : $database = 6; break; case "order" : $database = 7; break;

case "product_score" : $database = 8; break; case "LeTianBang" : $database = 9; break; default: $database = 0; break; } return $this->redis->select($database); } /** * [del 刪除緩存] * @ckhero * @DateTime 2016-08-18 * @param [type] $key [緩存的key名] * @return [type] [true/false] */ public function del($key){ return $this->redis->del($key); } /** * [keys 模糊匹配] * @ckhero * @DateTime 2016-08-29 * @param [type] $key [description] * @return [type] [description] */ public function keys($key){ return $this->redis->keys($key); } /** * zset */ /** * [zset 有序集合設置] * @ckhero * @DateTime 2016-09-01 * @param [type] $key [鍵名] * @param [type] $score [分數、權重] * @param [type] $member [鍵值] * @return [type] [description] */ public function zset($key,$score,$val){ return $this->redis->zAdd($key,$score,$val); } /** * [zdel 刪除有序集合中某個值] * @ckhero * @DateTime 2016-09-01 * @param [type] $key [鍵名] * @param [type] $val [刪除的鍵值] * @return [type] [description] */ public function zdel($key,$val){ return $this->redis->zRem($key,$val); } /** * [zget 獲取集合中的數據] * @ckhero * @DateTime 2016-09-01 * @param [type] $key [鍵名] * @param integer $start [開始索引] * @param integer $end [結束索引] * @param string $order ['排序方式';sec(從小打大);desc(從大到小)] * @param boolean $withscroes [true返回分數值;默認false 不返回] * @return [type] [description] */ public function zget($key,$start=0,$end='-1',$order = 'sec',$withscroes = false){ if($order =='sec'){ return $this->redis->zRange($key,$start,$end,$withscroes); }else{ return $this->redis->zRevRange($key,$start,$end,$withscroes); } } /** * [exists 判斷商品是否存在] * @ckhero * @DateTime 2016-09-02 * @param [type] $key [鍵名] * @return [type] [1為存在,0為不存在] */

public function existsRedis($key){ return $this->redis->exists($key); } } ?>

 


免責聲明!

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



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