英文商務(wù)網(wǎng)站制作百度互聯(lián)網(wǎng)營(yíng)銷是什么
redis持久化(persistence)
redis支持兩種方式的持久化,可以單獨(dú)使用或者結(jié)合起來使用。
第一種:RDB方式(redis默認(rèn)的持久化方式)
rdb方式的持久化是通過快照完成的,當(dāng)符合一定條件時(shí)redis會(huì)自動(dòng)將內(nèi)存中的所有數(shù)據(jù)執(zhí)行快照操作并存儲(chǔ)到硬盤上。默認(rèn)存儲(chǔ)在dump.rdb文件中。(文件名在配置文件中dbfilename)
redis進(jìn)行快照的時(shí)機(jī)(在配置文件redis.conf中)
save 900 1 //表示900秒內(nèi)至少一個(gè)鍵被更改則進(jìn)行快照。
save 300 10 //表示300秒內(nèi)10條被更改則快照
save 60 10000 //60秒內(nèi)10000條
第二種:AOF方式
aof方式的持久化是通過日志文件的方式。默認(rèn)情況下redis沒有開啟aof,可以通過參數(shù)appendonly參數(shù)開啟。
appendonly yes
aof文件的保存位置和rdb文件的位置相同,都是dir參數(shù)設(shè)置的,默認(rèn)的文件名是appendonly.aof,可以通過appendfilename參數(shù)修改
appendfilename appendonly.aof
redis寫命令同步的時(shí)機(jī)
appendfsync always 每次都會(huì)執(zhí)行
appendfsync everysec 默認(rèn) 每秒執(zhí)行一次同步操作(推薦,默認(rèn))
appendfsync no不主動(dòng)進(jìn)行同步,由操作系統(tǒng)來做,30秒一次
寶塔設(shè)置:
redis中鍵的生存時(shí)間(expire)
class Myredis{protected $redis;public function __construct() {//實(shí)例化Redis類$redis = new Redis();//選擇指定的redis數(shù)據(jù)庫連接,默認(rèn)端口號(hào)為6379$redis->connect('127.0.0.1',6379);$this->redis = $redis;}public function expire(string $name,int $expire){$this->redis->expire($name, $expire);// $redis->ttl(‘foo’); //返回有效期值1s// $redis->expire(‘foo’); //取消expire行為}
}
$redis = new Myredis();
$redis->expire("name",10); //(單位/秒)
redis的事務(wù)(transaction)
public function transaction(){//Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個(gè)命令,一個(gè)事務(wù)中所有命令都會(huì)被序列化。在事務(wù)執(zhí)行過程,會(huì)按照順序串行化執(zhí)行隊(duì)列中的命令,其他客戶端提交的命令請(qǐng)求不會(huì)插入到事務(wù)執(zhí)行命令序列中。/**//1 Redis事務(wù)沒有隔離級(jí)別$this->redis->multi();$this->redis->decrby("number",10);//發(fā)送 EXEC 命令前被放入隊(duì)列緩存,并不會(huì)被實(shí)際執(zhí)行,也就不存在事務(wù)內(nèi)的查詢要看到事務(wù)里的更新,事務(wù)外查詢不能看到。if($this->redis->get("number") < 0){return $this->redis->discard();}$this->redis->incrby("number2",10);$this->redis->exec(); //number:-10, number2:10*//**//2 Redis不保證原子性//Redis中,單條命令是原子性執(zhí)行的,但事務(wù)不保證原子性,且沒有回滾。事務(wù)中任意命令執(zhí)行失敗,其余的命令仍會(huì)被執(zhí)行。$this->redis->multi();$this->redis->decrby("number",10);$this->redis->incrby("number2",10,21,321); //err$this->redis->incrby("number3",10);$this->redis->exec(); //number:-10, number3: 10//Redis中,單條命令是原子性執(zhí)行的,但事務(wù)不保證原子性,且沒有回滾。*/// Watch 命令用于監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷$this->redis->watch('number');sleep(10); //期間改掉number,下面的命令都不會(huì)執(zhí)行$this->redis->multi();$this->redis->set('favorite_fruit','cherry');$this->redis->incrBy('number',3);$this->redis->exec();}$redis->transaction();
發(fā)布/訂閱
//調(diào)用
public function Publish_Subscribe(){//通過訂閱/發(fā)布,添加數(shù)據(jù)庫數(shù)據(jù)。 tb_people表$channelName = "tb_people";//向指定頻道發(fā)送消息try {$redis = new Redis();$redis->connect('127.0.0.1', 6379);for ($i=0;$i<5;$i++){$data = array('name' => 'key'.$i);$ret = $redis->publish($channelName, json_encode($data));print_r($ret);}} catch (Exception $e){echo $e->getMessage();}
}
xxxx.php:單獨(dú)起個(gè)php文件,訂閱信息
<?php
//設(shè)置php腳本執(zhí)行時(shí)間
set_time_limit(0);
//設(shè)置socket連接超時(shí)時(shí)間
ini_set('default_socket_timeout', -1);$servername = "localhost";
$username = "root";
$password = "root";
try {$conn = new PDO("mysql:host=$servername;dbname=my_mysql;port=3306", $username, $password);// echo "連接成功";
}catch(PDOException $e){echo $e->getMessage();
}//聲明測(cè)試頻道名稱
$channelName = "tb_people";
try {$redis = new Redis();//建立一個(gè)長(zhǎng)鏈接$redis->pconnect('127.0.0.1', 6379);//阻塞獲取消息$redis->subscribe(array($channelName), function ($redis, $chan, $msg) use($conn){// echo "channel:".$chan.",message:".$msg."\n";$arr_msg = json_decode($msg,true);$sqlquery = "INSERT INTO tb_people (name) VALUES ('".$arr_msg['name']."')";$conn->query($sqlquery);echo "成功";});
} catch (Exception $e){echo $e->getMessage();
}
mysql_close($con);