PHP使用Redis實(shí)戰(zhàn)實(shí)錄系列
- PHP使用Redis實(shí)戰(zhàn)實(shí)錄1:寶塔環(huán)境搭建、6379端口配置、Redis服務(wù)啟動(dòng)失敗解決方案
- PHP使用Redis實(shí)戰(zhàn)實(shí)錄2:Redis擴(kuò)展方法和PHP連接Redis的多種方案
- PHP使用Redis實(shí)戰(zhàn)實(shí)錄3:數(shù)據(jù)類(lèi)型比較、大小限制和性能擴(kuò)展
- PHP使用Redis實(shí)戰(zhàn)實(shí)錄4:?jiǎn)卫J胶兔嫦蜻^(guò)程操作redis的語(yǔ)法
為了應(yīng)對(duì)不同的場(chǎng)景,redis分為是單機(jī)模式、主從模式、哨兵模式、集群模式四種模式。
-
單機(jī)模式(Standalone Mode):?jiǎn)螜C(jī)模式是最基本的 Redis 運(yùn)行模式,它在單個(gè)實(shí)例上運(yùn)行,不涉及復(fù)雜的集群配置。它被廣泛用于開(kāi)發(fā)和測(cè)試環(huán)境。
-
主從復(fù)制模式(Master-Slave Replication):主從復(fù)制模式通過(guò)將一個(gè) Redis 實(shí)例設(shè)為主節(jié)點(diǎn)(Master)和一個(gè)或多個(gè) Redis 實(shí)例設(shè)為從節(jié)點(diǎn)(Slave),實(shí)現(xiàn)數(shù)據(jù)的復(fù)制和備份。主節(jié)點(diǎn)負(fù)責(zé)寫(xiě)操作,而從節(jié)點(diǎn)復(fù)制主節(jié)點(diǎn)的數(shù)據(jù),可以用于讀操作或故障轉(zhuǎn)移。
-
哨兵模式(Redis Sentinel Mode):Sentinel 是 Redis 提供的一個(gè)高可用解決方案,它通過(guò)在主從復(fù)制模式的基礎(chǔ)上添加 Sentinel 進(jìn)程來(lái)實(shí)現(xiàn)自動(dòng)故障檢測(cè)和故障切換。Sentinel 進(jìn)程監(jiān)視主節(jié)點(diǎn)和從節(jié)點(diǎn)的狀態(tài),并在主節(jié)點(diǎn)故障時(shí)自動(dòng)將從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)。
-
Cluster 模式(Redis Cluster Mode):集群模式是 Redis 最常用的分布式解決方案,它將多個(gè) Redis 節(jié)點(diǎn)組成一個(gè)集群,每個(gè)節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)一部分?jǐn)?shù)據(jù),并在節(jié)點(diǎn)之間自動(dòng)進(jìn)行數(shù)據(jù)分片和數(shù)據(jù)遷移。集群模式提供了高擴(kuò)展性和高可用性。
這些運(yùn)行模式可以根據(jù)需求選擇合適的方案來(lái)使用 Redis,例如在開(kāi)發(fā)和測(cè)試環(huán)境中使用單機(jī)模式,生產(chǎn)環(huán)境中使用主從復(fù)制或集群模式來(lái)提供高可用性和橫向擴(kuò)展能力。
一、單例模式
在 PHP 中使用 Redis 的單例模式可以確保在應(yīng)用程序中只創(chuàng)建一個(gè) Redis 連接實(shí)例,以便在多個(gè)地方共享該連接。
下面是一個(gè)簡(jiǎn)單的示例,展示如何使用單例模式實(shí)現(xiàn) Redis 連接:
面對(duì)對(duì)象封裝類(lèi)(1)
class RedisSingleton
{
private static $instance;
private static $redis;
private function __construct()
{
self::$redis = new Redis();
self::$redis->connect('127.0.0.1', 6379);
// 進(jìn)行其他 Redis 相關(guān)的初始化操作
}
public static function getInstance()
{
if (!self::$instance) {
self::$instance = new RedisSingleton();
}
return self::$instance;
}
public function getRedis()
{
return self::$redis;
}
}
// 在應(yīng)用程序中使用 Redis 單例模式
$redisSingleton = RedisSingleton::getInstance();
$redis = $redisSingleton->getRedis();
// 使用 $redis 進(jìn)行操作,例如 $redis->get('key')、$redis->set('key', 'value') 等
面對(duì)對(duì)象封裝類(lèi)(2)
將redis變量放在配置文件,進(jìn)行整體調(diào)用;
/*
* Redis操作類(lèi)
* 單例+支持長(zhǎng)連接 模式
*/
class RedisSingleton
{
const REDISTIMEOUT = 0; //超時(shí)
private static $_instance = []; //類(lèi)單例數(shù)組
private $hash;
private $redis; //redis連接句柄
private function __construct($redis_config = [])
{
$this->redis = new Redis();
$this->hash = $redis_config["redis_db"];
if ($redis_config["redis_pconnect"]) {
$this->redis->pconnect($redis_config["redis_host"], $redis_config["redis_port"], self::REDISTIMEOUT);
} else {
$this->redis->connect($redis_config["redis_host"], $redis_config["redis_port"], self::REDISTIMEOUT);
}
//設(shè)置連接密碼
if ($redis_config["redis_auth"]) {
$this->redis->auth($redis_config["redis_auth"]);
}
//選擇庫(kù) 0-15
$this->redis->select($this->hash);
}
//外部獲取實(shí)例
public static function getInstance($redis_config)
{
if (!isset(self::$_instance[$redis_config["redis_db"]])) {
self::$_instance[$redis_config["redis_db"]] = new self($redis_config);
}
//防止掛掉
try {
self::$_instance[$redis_config["redis_db"]]->Ping() == 'Pong';
} catch (Exception $e) {
throw new Exception("連接錯(cuò)誤");
}
return self::$_instance[$redis_config["redis_db"]];
}
//獲取redis的連接實(shí)例
public function getRedisConnect()
{
return $this->redis;
}
public function __call($method, $args)
{
return call_user_func_array([$this->redis, $method], $args);
}
/**
* 關(guān)閉單例時(shí)做清理工作
*/
public function __destruct()
{
$key = $this->hash;
$this->redis->close();
self::$_instance[$key] = null;
}
private function __clone()
{
}
}
$redis_config = [
"redis_host" => "127.0.0.1",
"redis_port" => "6379",
"redis_db" => 0,
"redis_auth" => "kYABzc8u3zNs7cq",
"redis_pconnect" => 0
];
$redis = RedisSingleton::getInstance($redis_config);
$redis->set("hello", "world1");
在上述示例中,RedisSingleton
類(lèi)的 getInstance
方法返回一個(gè) Redis 單例實(shí)例。當(dāng)需要使用 Redis 連接時(shí),可以調(diào)用 getRedis
方法獲取該實(shí)例的 Redis 連接對(duì)象。
通過(guò)這種方式,無(wú)論在應(yīng)用程序中的哪個(gè)位置需要使用 Redis,都可以共享同一個(gè) Redis 連接實(shí)例,避免了重復(fù)創(chuàng)建連接的開(kāi)銷(xiāo)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-619495.html
二、面向過(guò)程操作Redis
1.php連接redis
/*1.Connection*/
$redis = new Redis();
$redis->connect('127.0.0.1',6379,1);//短鏈接,本地host,端口為6379,超過(guò)1秒放棄鏈接
$redis->open('127.0.0.1',6379,1);//短鏈接(同上)
$redis->pconnect('127.0.0.1',6379,1);//長(zhǎng)鏈接,本地host,端口為6379,超過(guò)1秒放棄鏈接
$redis->popen('127.0.0.1',6379,1);//長(zhǎng)鏈接(同上)
$redis->auth('password');//登錄驗(yàn)證密碼,返回【true | false】
$redis->select(0);//選擇redis庫(kù),0~15 共16個(gè)庫(kù)
$redis->close();//釋放資源
$redis->ping(); //檢查是否還再鏈接,[+pong]
$redis->ttl('key');//查看失效時(shí)間[-1 | timestamps]
$redis->persist('key');//移除失效時(shí)間[ 1 | 0]
$redis->sort('key',[$array]);//返回或保存給定列表、集合、有序集合key中經(jīng)過(guò)排序的元素,$array為參數(shù)limit等 [array|false]
2.共性的運(yùn)算歸類(lèi)
/*2.共性的運(yùn)算歸類(lèi)*/
$redis->expire('key',10);//設(shè)置失效時(shí)間[true | false]
$redis->move('key',15);//把當(dāng)前庫(kù)中的key移動(dòng)到15庫(kù)中[0|1]
//string
$redis->strlen('key');//獲取當(dāng)前key的長(zhǎng)度
$redis->append('key','string');//把string追加到key現(xiàn)有的value中[追加后的個(gè)數(shù)]
$redis->incr('key');//自增1,如不存在key,賦值為1(只對(duì)整數(shù)有效,存儲(chǔ)以10進(jìn)制64位,redis中為str)[new_num | false]
$redis->incrby('key',$num);//自增$num,不存在為賦值,值需為整數(shù)[new_num | false]
$redis->decr('key');//自減1,[new_num | false]
$redis->decrby('key',$num);//自減$num,[ new_num | false]
$redis->setex('key',10,'value');//key=value,有效期為10秒[true]
//list
$redis->llen('key');//返回列表key的長(zhǎng)度,不存在key返回0, [ len | 0]
//set
$redis->scard('key');//返回集合key的基數(shù)(集合中元素的數(shù)量)。[num | 0]
$redis->sMove('key1', 'key2', 'member');//移動(dòng),將member元素從key1集合移動(dòng)到key2集合。[1 | 0]
//Zset
$redis->zcard('key');//返回集合key的基數(shù)(集合中元素的數(shù)量)。[num | 0]
$redis->zcount('key',0,-1);//返回有序集key中,score值在min和max之間(默認(rèn)包括score值等于min或max)的成員。[num | 0]
//hash
$redis->hexists('key','field');//查看hash中是否存在field,[1 | 0]
$redis->hincrby('key','field',$int_num);//為哈希表key中的域field的值加上量(+|-)num,[new_num | false]
$redis->hlen('key');//返回哈希表key中域的數(shù)量。[ num | 0]
3.Redis服務(wù)器操作
/*3.Server*/
$redis->dbSize();//返回當(dāng)前庫(kù)中的key的個(gè)數(shù)
$redis->flushAll();//清空整個(gè)redis[總true]
$redis->flushDB();//清空當(dāng)前redis庫(kù)[總true]
$redis->save();//同步??把數(shù)據(jù)存儲(chǔ)到磁盤(pán)-dump.rdb[true]
$redis->bgsave();//異步??把數(shù)據(jù)存儲(chǔ)到磁盤(pán)-dump.rdb[true]
$redis->info();//查詢(xún)當(dāng)前redis的狀態(tài) [verson:2.4.5....]
$redis->lastSave();//上次存儲(chǔ)時(shí)間key的時(shí)間[timestamp]
$redis->watch('key','keyn');//監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷 [true]
$redis->unwatch('key','keyn');//取消監(jiān)視一個(gè)(或多個(gè)) key [true]
$redis->multi(Redis::MULTI);//開(kāi)啟事務(wù),事務(wù)塊內(nèi)的多條命令會(huì)按照先后順序被放進(jìn)一個(gè)隊(duì)列當(dāng)中,最后由 EXEC 命令在一個(gè)原子時(shí)間內(nèi)執(zhí)行。
$redis->multi(Redis::PIPELINE);//開(kāi)啟管道,事務(wù)塊內(nèi)的多條命令會(huì)按照先后順序被放進(jìn)一個(gè)隊(duì)列當(dāng)中,最后由 EXEC 命令在一個(gè)原子時(shí)間內(nèi)執(zhí)行。
$redis->exec();//執(zhí)行所有事務(wù)塊內(nèi)的命令,;【事務(wù)塊內(nèi)所有命令的返回值,按命令執(zhí)行的先后順序排列,當(dāng)操作被打斷時(shí),返回空值 false】
4.String增刪改操作
/*4.String,鍵值對(duì),創(chuàng)建更新同操作*/
$redis->setOption(Redis::OPT_PREFIX,'hf_');//設(shè)置表前綴為hf_
$redis->set('key',1);//設(shè)置key=aa value=1 [true]
$redis->mset($arr);//設(shè)置一個(gè)或多個(gè)鍵值[true]
$redis->setnx('key','value');//key=value,key存在返回false[|true]
$redis->get('key');//獲取key [value]
$redis->mget($arr);//(string|arr),返回所查詢(xún)鍵的值
$redis->del($key_arr);//(string|arr)刪除key,支持?jǐn)?shù)組批量刪除【返回刪除個(gè)數(shù)】
$redis->delete($key_str,$key2,$key3);//刪除keys,[del_num]
$redis->getset('old_key','new_value');//先獲得key的值,然后重新賦值,[old_value | false]
5.List增刪改操作
/*5.List棧的結(jié)構(gòu),注意表頭表尾,創(chuàng)建更新分開(kāi)操作*/
$redis->lpush('key','value');//增,只能將一個(gè)值value插入到列表key的表頭,不存在就創(chuàng)建 [列表的長(zhǎng)度 |false]
$redis->rpush('key','value');//增,只能將一個(gè)值value插入到列表key的表尾 [列表的長(zhǎng)度 |false]
$redis->lInsert('key', Redis::AFTER, 'value', 'new_value');//增,將值value插入到列表key當(dāng)中,位于值value之前或之后。[new_len | false]
$redis->lpushx('key','value');//增,只能將一個(gè)值value插入到列表key的表頭,不存在不創(chuàng)建 [列表的長(zhǎng)度 |false]
$redis->rpushx('key','value');//增,只能將一個(gè)值value插入到列表key的表尾,不存在不創(chuàng)建 [列表的長(zhǎng)度 |false]
$redis->lpop('key');//刪,移除并返回列表key的頭元素,[被刪元素 | false]
$redis->rpop('key');//刪,移除并返回列表key的尾元素,[被刪元素 | false]
$redis->lrem('key','value',0);//刪,根據(jù)參數(shù)count的值,移除列表中與參數(shù)value相等的元素count=(0|-n表頭向尾|+n表尾向頭移除n個(gè)value) [被移除的數(shù)量 | 0]
$redis->ltrim('key',start,end);//刪,列表修剪,保留(start,end)之間的值 [true|false]
$redis->lset('key',index,'new_v');//改,從表頭數(shù),將列表key下標(biāo)為第index的元素的值為new_v, [true | false]
$redis->lindex('key',index);//查,返回列表key中,下標(biāo)為index的元素[value|false]
$redis->lrange('key',0,-1);//查,(start,stop|0,-1)返回列表key中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量start和stop指定。[array|false]
6.set增刪改操作
/*6.Set,沒(méi)有重復(fù)的member,創(chuàng)建更新同操作*/
$redis->sadd('key','value1','value2','valuen');//增,改,將一個(gè)或多個(gè)member元素加入到集合key當(dāng)中,已經(jīng)存在于集合的member元素將被忽略。[insert_num]
$redis->srem('key','value1','value2','valuen');//刪,移除集合key中的一個(gè)或多個(gè)member元素,不存在的member元素會(huì)被忽略 [del_num | false]
$redis->smembers('key');//查,返回集合key中的所有成員 [array | '']
$redis->sismember('key','member');//判斷member元素是否是集合key的成員 [1 | 0]
$redis->spop('key');//刪,移除并返回集合中的一個(gè)隨機(jī)元素 [member | false]
$redis->srandmember('key');//查,返回集合中的一個(gè)隨機(jī)元素 [member | false]
$redis->sinter('key1','key2','keyn');//查,返回所有給定集合的交集 [array | false]
$redis->sunion('key1','key2','keyn');//查,返回所有給定集合的并集 [array | false]
$redis->sdiff('key1','key2','keyn');//查,返回所有給定集合的差集 [array | false]
7.Zset增刪改操作
/*7.Zset,沒(méi)有重復(fù)的member,有排序順序,創(chuàng)建更新同操作*/
$redis->zAdd('key',$score1,$member1,$scoreN,$memberN);//增,改,將一個(gè)或多個(gè)member元素及其score值加入到有序集key當(dāng)中。[num | 0]
$redis->zrem('key','member1','membern');//刪,移除有序集key中的一個(gè)或多個(gè)成員,不存在的成員將被忽略。[del_num | 0]
$redis->zscore('key','member');//查,通過(guò)值反拿權(quán) [num | null]
$redis->zrange('key',$start,$stop);//查,通過(guò)(score從小到大)【排序名次范圍】拿member值,返回有序集key中,【指定區(qū)間內(nèi)】的成員 [array | null]
$redis->zrevrange('key',$start,$stop);//查,通過(guò)(score從大到小)【排序名次范圍】拿member值,返回有序集key中,【指定區(qū)間內(nèi)】的成員 [array | null]
$redis->zrangebyscore('key',$min,$max[,$config]);//查,通過(guò)scroe權(quán)范圍拿member值,返回有序集key中,指定區(qū)間內(nèi)的(從小到大排)成員[array | null]
$redis->zrevrangebyscore('key',$max,$min[,$config]);//查,通過(guò)scroe權(quán)范圍拿member值,返回有序集key中,指定區(qū)間內(nèi)的(從大到小排)成員[array | null]
$redis->zrank('key','member');//查,通過(guò)member值查(score從小到大)排名結(jié)果中的【member排序名次】[order | null]
$redis->zrevrank('key','member');//查,通過(guò)member值查(score從大到小)排名結(jié)果中的【member排序名次】[order | null]
$redis->ZINTERSTORE();//交集
$redis->ZUNIONSTORE();//差集
8.Hash表結(jié)構(gòu)增刪改操作
/*8.Hash,表結(jié)構(gòu),創(chuàng)建更新同操作*/
$redis->hset('key','field','value');//增,改,將哈希表key中的域field的值設(shè)為value,不存在創(chuàng)建,存在就覆蓋【1 | 0】
$redis->hget('key','field');//查,取值【value|false】
$arr = array('one'=>1,2,3);$arr2 = array('one',0,1);
$redis->hmset('key',$arr);//增,改,設(shè)置多值$arr為(索引|關(guān)聯(lián))數(shù)組,$arr[key]=field, [ true ]
$redis->hmget('key',$arr2);//查,獲取指定下標(biāo)的field,[$arr | false]
$redis->hgetall('key');//查,返回哈希表key中的所有域和值。[當(dāng)key不存在時(shí),返回一個(gè)空表]
$redis->hkeys('key');//查,返回哈希表key中的所有域。[當(dāng)key不存在時(shí),返回一個(gè)空表]
$redis->hvals('key');//查,返回哈希表key中的所有值。[當(dāng)key不存在時(shí),返回一個(gè)空表]
$redis->hdel('key',$arr2);//刪,刪除指定下標(biāo)的field,不存在的域?qū)⒈缓雎?[num | false]
@漏刻有時(shí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-619495.html
到了這里,關(guān)于PHP使用Redis實(shí)戰(zhàn)實(shí)錄4:?jiǎn)卫J胶兔嫦蜻^(guò)程操作redis的語(yǔ)法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!