PHP使用serialize和json_encode序列化數據並通過redis緩存文件和$GLOGALS緩存資源對象


PHP常用緩存方式:
第一種,把需要緩存的數據進行處理,形成PHP可以直接執行的文件。在需要緩存數據的時候,通過include方式引入,並使用。
第二種,把需要的數據通過serialize函數序列化后直接保存到文件。在需要使用緩存數據的時候,通過反序列化讀入文件內容並復制給需要的變量,然后使用。

測試結果:
通過測試我們發現,第二種也就是serialize緩存數據的方式更加高效。(數據略去,最后提供了文章地址下載,大家可以自行測試)

原因分析:
include方式讀取緩存的時候,PHP需要執行幾個過程
1.讀取文件
2.解析所Include的文件
3.執行,給變量賦值

而serialize序列化方式讀取緩存的時候:
1.讀取數據
2.反序列化數據內容
3.給變量賦值

總結分析:
第一種,include緩存的方式
優點:增加數據的保密性,和安全性,緩存內容不會被外界發現。
缺點:速度相對較慢。
用途:保存禁止系統外部得知的數據,比如web系統的設置,甚至MySQL信息等的保存

第二種,serialize序列化緩存的方式
優點:速度較快,可處理除了resource之外的任何類型,特別是對象的存儲,這是其存在的意義(json_encode()無法處理對象方法等數據)。
缺點:緩存系統文件路徑一旦曝光,緩存內容會泄露。
用途:緩存最新文章,相關文章等不擔心外部得知的數據的時候,可以使用這種方式。

PHP文件緩存內容保存格式主要有三種:

(1)變量 var_export 格式化成PHP正常的賦值書寫格式;
(2)變量 serialize 序列化之后保存,用的時候反序列化;
(3)變量 json_encode格式化之后保存,用的時候json_decode;

互聯網上測試結果是:serialize格式的文件解析效率大於Json,Json的解析效率大於PHP正常賦值。
所以我們要是緩存數據建議采用序列化的形式解析數據會更快。

注意:json只有四種類型,並且是以簡單的符號表示,而serialize有更加詳細的類型區分。 json無法處理對象方法等數據,因此序列化對象要用serialize()。

與對象無關的數據存儲可以使用json,如包含大量數字的數組等,而對象的存儲要用serialize,這是其存在的意義。

serialize()可處理除了resource之外的任何類型。

$data=[];
for($i=1;$i<10;$i++){
    $data[]=['id'=>$i,'title'=>'title '.$i];
}
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->set('data', serialize($data)); // 使用serialize序列化數據為字符串
$data2 = unserialize($redis->get('data')); // 反序列化字符串為數據
var_export($data2);

resource類型的資源只能用$GLOBALS緩存

class dbutil {
    protected $link = null;
    public function connect($host, $user, $password, $database = '') {
        $this->link = mysqli_connect($host, $user, $password, $database, 3306);
    }
    public function query($sqlstmt) {
        $result = $this->link->query($sqlstmt);
        $out = [];
        while ($row = mysqli_fetch_row($result)) {
            $out[] = $row;
        }
        return $out;
    }
}

$dbutil = new dbutil();
$dbutil->connect('127.0.0.1', 'root', 'root', 'chaoyue');
$list = $dbutil->query('select * from fanwe_user limit 1');
var_export($list);
echo '<hr />';

//$GLOBALS['db']=$dbutil; // $GLOBALS普通賦值方法
$GLOBALS += ['db2' => $dbutil]; // $GLOBALS另一種賦值方法
$list2 = $GLOBALS['db2']->query('select * from fanwe_user limit 1');
var_export($list2);
exit;

 

 

參考文章:
php apc緩存以及與redis的對比 (http://blog.csdn.net/w18704622664/article/details/47132061)
Redis數據存儲解決方案 (http://www.cnblogs.com/fvsfvs123/p/4319240.html)
Redis 與 數據庫處理數據的兩種模式 (http://www.veryhuo.com/a/view/9266.html)
Redis內存使用優化與存儲 (http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage)
Redis復制與可擴展集群搭建 (http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster)
redis緩存隊列+MySQL +php任務腳本定時批量入庫 (http://www.cnblogs.com/shijy-1990/p/5920841.html)
PHP讀取大文件 (http://www.cnblogs.com/DavidYan/articles/2496235.html)
讓php讀取文件不在受內存限制 (http://www.71j.cn/archives/88)
PHP中文件緩存轉內存緩存的方法 (http://www.jb51.net/article/29068.htm)
PHP 文件緩存的性能測試 (http://www.jb51.net/article/23206.htm)
PHP中加速、緩存擴展的區別和作用詳解(eAccelerator、memcached、xcache、APC) (http://www.jb51.net/article/88281.htm)
PHP文件緩存內容保存格式實例分析 (http://www.jb51.net/article/54046.htm)
PHP5+引進$GLOBALS延遲初始化的概念 (http://blog.csdn.net/billfeller/article/details/8517746)
$GLOBALS與global區別 & 變量銷毀機制 (http://blog.csdn.net/u013372487/article/details/72085692)
Redis 命令參考 (http://redisdoc.com/)

 

版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。
本文標題:PHP使用serialize和json_encode序列化數據並通過redis緩存文件和$GLOGALS緩存資源對象
本文鏈接:http://www.cnblogs.com/sochishun/p/7462177.html
本文作者:SoChishun (郵箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
發表日期:2017年9月1日


免責聲明!

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



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