thinkphp 5は簡単なredis分布式の主従を構築する

32468 ワード

プライマリ・ライブラリはデータの書き込みのみを担当し、データの更新があるたびに更新されたデータをすべてのセカンダリ・ライブラリに同期し、セカンダリ・ライブラリはデータの読み取りのみを担当します.
まずレプリケーションして構成redisを追加します6380.conf
cp redis.conf  redis_6380.conf   
  • メインプロファイルの変更redis.conf
  • #         
    requirepass 123456
    
    #        
    port  6379
    
  • 修正スレーブプロファイルredis.conf
  • masterauth 123456    #  Master     ,     ;    Master/redis.conf    requirepass    。
    
    port 6380  #        
    
    slaveof 127.0.0.1 6379   #    127.0.0.1     
    
    
  • この2つのredis
  • を起動します.
    thinkphpでの使用
    まず、プロファイルconfig.phpで構成
      //redis       
        'REDIS_LIST' => [
            'db01' => [
                'master' => [
                    'host' => 'localhost',
                    'port' => '6379',
                    'persistent' => false,
                ],
                'standby' => [
                    'host' => 'localhost',
                    'port' => '6380',
                    'persistent' => false,
                ],
            ],
            'db02' => [
                'master' => [
                    'host' => '192.168.9.228',
                    'port' => '6379',
                    'persistent' => false,
                ],
                'standby' => [
                    'host' => '192.168.9.228',
                    'port' => '6380',
                    'persistent' => false,
                ],
            ]
        ],
    

    次に、redisをインスタンス化するためにRedisManagerModel.phpファイルを追加します.
    
    namespace app\app\model;
    class RedisManagerModel {
        static private $instances = array();
        /**
         *    redis
         * @param type $adapter
         * @return \Redis
         * @throws \Exception
         */
        static private function createInstance($adapter)
        {
            $config = config('REDIS_LIST');
            $redis = new \Redis();
            if ($config[$adapter]["master"]["persistent"]) {
                $result = $redis->pconnect($config[$adapter]["master"]["host"], $config[$adapter]["master"]["port"]);
            } else {
                $result = $redis->connect($config[$adapter]["master"]["host"], $config[$adapter]["master"]["port"]);
            }
            //stanby    
            if (!$result) {
                if ($config[$adapter]["standby"]["persistent"]) {
                    $result = $redis->pconnect($config[$adapter]["standby"]["host"], $config[$adapter]["standby"]["port"]);
                } else {
                    $result = $redis->connect($config[$adapter]["standby"]["host"], $config[$adapter]["standby"]["port"]);
                }
            }
            if (!$result) {
                throw new \Exception('Redis Connection Error');
            }
            return $redis;
        }
    
        /**           
         * @param string $adapter
         * @return Redis
         */
        static public function getInstance($adapter = "db01")
        {
            if (!isset(self::$instances[$adapter])) {
                self::$instances[$adapter] = self::createInstance($adapter);
            }
            return self::$instances[$adapter];
        }
    
    }
    
    

    その後、redisの方法を統一的に管理するには、RedisMdoel.phpを構築してredisに関するすべての操作を解放します.
    
    
    namespace app\app\model;
    
    use think\db;
    use app\app\model\RedisManagerModel;
    
    class RedisMdoel  {
        public $redis_db_no = "db01";//     db01
    
        /**
         *   redis key
         * @param type $key
         * @return boolean
         */
        public static function redisDelKey($key)
        {
            RedisManagerModel::getInstance()->del($key);
            return true;
        }
        
        /* 
         *   redis,    json     
         * @param $key
         * @param null $value
         * @return mixed|null
         */
        public static function get_from_redis($key, $value = null)
        {
            if (!is_null($value)) {
                RedisManagerModel::getInstance()->set($key, json_encode($value, true));
            }
            $result = RedisManagerModel::getInstance()->get($key);
            return $result ? json_decode($result, true) : null;
        }
    
        /*   
         *  redis,      list       
         * @param $key
         * @param $start    
         * @param $length   
         * @param null $value
         * @return
         */
        public static function get_list_from_redis($key, $start = 0, $length = 0, $value = null)
        {
            if (!is_null($value)) {
                // list     ,              
                RedisManagerModel::getInstance()->delete($key);
                foreach ($value as $item) {
                    RedisManagerModel::getInstance()->lPush($key, json_encode($item, true));
                }
            }
            if ($length === 0) {
                $length = RedisManagerModel::getInstance()->lLen($key);
            }
    
            $lst = RedisManagerModel::getInstance()->lGetRange($key, $start, $length);
            if ($lst) {
                $result = array();
                foreach ($lst as $item) {
                    array_push($result, json_decode($item, true));
                }
                return $result;
            }
            return null;
        }
    
    }
    

    プロジェクトで呼び出す
    
    namespace app\app\model;
    use app\app\model\RedisMdoel;
    
    class Test extends Model{
    
       /**
         *      redisKey
         */
        public function delRedisKey($key)
        {
    	   if(RedisMdoel::redisDelKey($key)){
    	   		return true;
    	   } 
    	 	return false
        }
    
    
    }
    
    

    简単な配置は良い提案があれば、みんなが积极的に讨论することを望んでいます.の