zoukankan      html  css  js  c++  java
  • 报表的缓存基本存储和读写

    <?php
    /**
     * Class Rpt redis 用于报表的缓存基本存储和读写 2.0
     * @simple
     * Rpt::read("diamond.account",$nick);
     * Rpt::readSync("diamond.account",$nick);
     * $finder = Rpt::createFinder("diamond.account",$nick);
     * $finder->read();
     * $finder->readSync();
     *
     * Rpt::save("diamond.account",$nick,$data);
     * $storage = Rpt::createStorage("diamond.account",$nick);
     * $storage->save($data);
     * $storage->save($data,7200);
     */
    class Rpt {
        public static function read($key,$nick){
            $finder = self::createFinder($key,$nick);
            return $finder->read();
        }
    
        public static function readSync($key,$nick){
            $finder = self::createFinder($key,$nick);
            return $finder->readSync();
        }
    
        public static function createFinder($key,$nick){
            $key = RptGenerate::key($key,$nick);
            return new RptFinder($key);
        }
    
        public static function createStorage($key,$nick){
            $key = RptGenerate::key($key,$nick);
            return new RptStorage($key);
        }
    
        public static function save($key,$nick,$data,$expired=7200){
            $storage = self::createStorage($key,$nick);
            return $storage->save($data,$expired);
        }
    
    
        public static function createRedis(){
            $redis = new Redis();
            $redis->connect(Yii::app()->params["RedisServerIP"]);
            return $redis;
        }
    
    }
    
    /**
     * Class RptFinder  数据读取
     */
    class RptFinder {
    
        /**
         * @var string $key
         */
        public $key;
    
        /**
         * @param string $key
         */
        public function __construct($key){
            $this->key = $key;
        }
    
        /**
         * 非安全读取数据
         * @return mixed
         */
        public function read(){
            $data = $this->readData();
            if($data->isRead && !$data->isExpired())
                return $data->data;
            return null;
        }
    
        protected function readData(){
            $redis = Rpt::createRedis();
            $rptData = new RptData();
            $data = json_decode($redis->get($this->key));
            if(false == $data){
                $rptData->isRead = false;
                $rptData->expiredTime = time();
                $rptData->expired = 24*3600;
            }else{
                $rptData->expired = $data->expired;
                $rptData->isRead =  $data->isRead;
                $rptData->expiredTime = $data->expiredTime;
                $rptData->data = $data->data;
            }
            return $rptData;
        }
    
        /**
         * 同步读取数据
         * @return mixed
         */
        public function readSync(){
            while(true){
                $rptData = $this->readData();
                if($rptData->isRead && !$rptData->isExpired())
                    return $this->read();
                sleep(1);
            }
        }
    }
    
    /**
     * Class RptStorage  数据存储
     */
    class RptStorage {
    
        /**
         * @var string key
         */
        public $key;
    
        /**
         * @param string $key
         */
        public function __construct($key){
          $this->key = $key;
        }
    
        /**
         * 写入数据
         * @param $data
         * @param int $expired
         * @return bool
         */
        public function save($data,$expired=7200){
    
            $rptData = new RptData();
            $rptData->data = $data;
            $rptData->expiredTime = time();
            $rptData->isRead = true;
            $rptData->expired = $expired;
            $redis = Rpt::createRedis();
    
            return $redis->setex($this->key, $rptData->expired,json_encode($rptData));
        }
    }
    
    /**
     * Class RptData redis存储数据实体
     */
    class RptData {
        public $expired;
        public $expiredTime;
        public $data;
        public $isRead;
    
        public function isExpired(){
            if(time()-$this->expiredTime > $this->expired)
                return true;
            return false;
        }
    }
    
    /**
     * Class RptGenerate key生成
     */
    class RptGenerate {
        public static function key($key,$nick){
            return $key.".".md5($nick);
        }
    }
  • 相关阅读:
    callAfter 例子2
    wxpython
    python 处理excel 进程无法退出的问题
    常用电子技术网
    Emeditor 与正则表达式
    Windows程序中的字符编码
    Delphi7 无法启动 问题搞定
    2007中国发烧盘点之作《天路》发烧女声版
    一台电脑安装多个(虚拟)网卡问题
    无法删除xxx文档/文件夹:找不到指定的路径。请确定指定的路径是否正确
  • 原文地址:https://www.cnblogs.com/oshine/p/4493749.html
Copyright © 2011-2022 走看看