thinkphp 5は簡単なredis分布式の主従を構築する
32468 ワード
プライマリ・ライブラリはデータの書き込みのみを担当し、データの更新があるたびに更新されたデータをすべてのセカンダリ・ライブラリに同期し、セカンダリ・ライブラリはデータの読み取りのみを担当します.
まずレプリケーションして構成redisを追加します6380.confメインプロファイルの変更 修正スレーブプロファイル この2つのredis を起動します.
thinkphpでの使用
まず、プロファイル
次に、redisをインスタンス化するために
その後、redisの方法を統一的に管理するには、
プロジェクトで呼び出す
简単な配置は良い提案があれば、みんなが积极的に讨论することを望んでいます.の
まずレプリケーションして構成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
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
}
}
简単な配置は良い提案があれば、みんなが积极的に讨论することを望んでいます.の