zoukankan      html  css  js  c++  java
  • PHP中使用Redis

    首先要确保有Redis的服务

    # redis-cli -v
    redis-cli 3.2.8
    
    
    # redis-server -v
    Redis server v=3.2.8 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=e034df79550b120
    
    

    然后确保PHP已经添加了Redis扩展

    # php -m |grep redis
    redis
    
    

    然后要创建Redis类

    <?php
    
    class Red {
    
        static private $redis = NULL;
    
        private $_red = NULL;
    
        private $_return_data = NULL;
    
        // 工厂加单例模式
        static public function create() {
            if(self::$redis) {
                return Red::$redis;   
            }        
    
            self::$redis = new self;
            return self::$redis;
        }   
    
        // 当调用的方法不存在会调用call方法,当方法不存在就去访问redis自身的方法
        public function __call($func, $params) {
            if ($func == 'multi') {
                $this->_return_data = $this->_red->multi($params[0]);
    
            } else {
                // 调用red对象下的方法,并传递参数
                $this->_return_data = call_user_func_array(array(&$this->_red, $func), $params);
    
            }   
    
            return $this->_return_data;
        }   
    
        private function __construct() {
    
            $this->_red = new Redis(); 
            $this->_red->connect(C("REDIS_HOST"),C("REDIS_PORT"));
            $this->_red->select(C('REDIS_DB') ?: 0);
            return Red::$redis;
        }   
    }
    
    <?php
    
    class Red {
    
        static private $redis = NULL;
    
        private $_red = NULL;
    
        private $_return_data = NULL;
    
        static public function create() {
            if(self::$redis) {
                return Red::$redis;
            }
    
            self::$redis = new self;
            return self::$redis;
        }
    
        // 当调用的方法不存在会调用call方法,当方法不存在就去访问redis自身的方法
        public function __call($func, $params) {
            if ($func == 'multi') {
                $this->_return_data = $this->_red->multi($params[0]);
    
            } else {
                // 调用red对象下的方法,并传递参数
                $this->_return_data = call_user_func_array(array(&$this->_red, $func), $params);
    
            }
            return $this->_return_data;
        }
    
        private function __construct() {
    
            $this->_red = new Redis();
            $this->_red->connect(C("REDIS_HOST"),C("REDIS_PORT"));
            $this->_red->select(C('REDIS_DB') ?: 0);
            return Red::$redis;
        }
    
        public function ttl($key)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->ttl($new_key);
        }
    
        public function del($key)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->del($new_key);
        }
    
        public function delete($key)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->delete($new_key);
        }
    
        public function rename($key1, $key2)
        {
            $new_key1 = C('REDIS_PREV') . $key1;
            $new_key2 = C('REDIS_PREV') . $key2;
            return $this->_red->rename($new_key1, $new_key2);
        }
    
        public function exists($key)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->exists($new_key);
        }
    
        public function setex($key, $time ,$value)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->setex($new_key, $time, $value);
        }
    
        public function set($key, $value)
        {
            $new_key = C('REDIS_PREV') . $key;
            return $this->_red->set($new_key, $value);
        }
    
        public function get($key)
        {
            $new_key = C('REDIS_PREV') . $key;
            $a = $this->_red->get($new_key);
            return $a;
        }
    }
    
    
    
    
    

    config.php中配置Redis

    'REDIS_HOST'                =>  '127.0.0.1',
    'REDIS_PROT'                =>  6379,
    

    使用Redis,可以提高查询速度,一些不变的查询,可以保存到Redis中,进行快速查询。比如查询城市信息,保存到Redis中,不必每次都查看数据库。

    // 获取区域数据
    public function get_map() {
            vendor('Redis.Red');
            $redis = Red::create();
            $data = $redis->get('china:area');
            if (!$data) {
                $areaModel = M('china_area');
                $p = $areaModel->field('id,name,level')->where(['level' => 1])->select();
                foreach ($p as $k => $v) {
                    $c = $areaModel->field('id,name,level')->where(['level' => 2, 'upid' => $v['id']])->select();
                    foreach ($c as $ck => $cv) {
                        $p[$k]['child'][$ck] = $cv;
                        $d = $areaModel->field('id,name,level')->where(['level' => 3, 'upid' => $cv['id']])->select();
                        foreach ($d as $dk => $dv) {
                            $p[$k]['child'][$ck]['child'][] = $dv;
                        }
                    }
                }
                $redis->set('china:area', json_encode($p,JSON_UNESCAPED_UNICODE));
            } else {
                $p = json_decode($data, true);
            }
    
            $this->json->setAttr("data", $p);
            $this->json->Send();
    }
    

    第一次查询,用时

    第二次查询,已经存入Redis

    差距很明显吧!!!

    Redis一个key或value值可以存储512M的数据,很强大了。

    可以去redis中查看一下,

    127.0.0.1:6379> keys china:area
    1) "china:area"
    

    Redis 可以存储任意类型的数据,最好通过json加密进去吧。获取的时候,进行解密。

    查看PHP扩展文档,https://github.com/phpredis/phpredis/

  • 相关阅读:
    关于树及其各种操作
    正交矩阵与齐次矩阵
    矩阵的行列式与矩阵的逆
    线性变换
    矩阵
    向量的运算
    求两直线的交点
    微任务防抖
    二项分布
    二项式定理
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/9092933.html
Copyright © 2011-2022 走看看