thinkphp5搭建简单redis分布式主从主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,⽽从库只负责读数据
所以先复制添加⼀个配置f
f f
修改主配置⽂件f
#给主服务器设置密码
requirepass 123456
#定义主服务器端⼝
port 6379
修改从配置⽂件f
masterauth 123456 # 若Master设置了密码,需要此配置;对应 f requirepass 属性。
port 6380 #定义从服务器端⼝
slaveof 127.0.0.1 6379 #设置成为127.0.0.1的从服务器
然后启动这两个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,
],
]
],
然后添加⼀个RedisManagerModel.php⽂件⽤来实例化redis
<?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的操作
<?php
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);
thinkphp3foreach($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;
}
}
在项⽬中调⽤
<?php
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
}
}
简单配置如有好的建议希望⼤家踊跃讨论。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论