phpredis的使用
A. thinkphp5.0鎬庝箞浣跨敤redis
璋冪敤鏂規硶
$redis = new Redis();
$redis->set('username','zongs');echo $redis->get('username');
B. php涓轟粈涔堜嬌鐢╮edis
1銆 Redis綆浠
redis鏄疦osql鏁版嵁搴撲腑浣跨敤杈冧負騫挎硾鐨勯潪鍏崇郴鍨嬪唴瀛樻暟鎹搴擄紝redis鍐呴儴鏄涓涓猭ey-value瀛樺偍緋葷粺銆傚畠鏀鎸佸瓨鍌ㄧ殑value綾誨瀷鐩稿規洿澶氾紝鍖呮嫭string(瀛楃︿覆)銆乴ist(閾捐〃)銆乻et(闆嗗悎)銆亃set(sorted set _鏈夊簭闆嗗悎)鍜宧ash錛堝搱甯岀被鍨嬶紝綾諱技浜嶫ava涓鐨刴ap錛夈俁edis鍩轟簬鍐呭瓨榪愯屽苟鏀鎸佹寔涔呭寲鐨凬oSQL鏁版嵁搴擄紝鏄褰撳墠鏈鐑闂ㄧ殑NoSql鏁版嵁搴撲箣涓錛屼篃琚浜轟滑縐頒負鏁版嵁緇撴瀯鏈嶅姟鍣ㄣ
2銆 浜掕仈緗戞椂浠h儗鏅涓嬪ぇ鏈洪亣錛屼粈涔堣佷嬌鐢∟osql錛
1錛 褰撴暟鎹閲忕殑鎬誨ぇ灝忎竴涓鏈哄櫒鏀句笉涓嬫椂銆
2錛 鏁版嵁緔㈠紩涓涓鏈哄櫒鐨勫唴瀛樻斁涓嶄笅鏃躲
3錛 璁塊棶閲忥紙璇誨啓娣峰悎錛変竴涓瀹炰緥鏀句笉涓嬫椂銆
鍗曟満鏃朵唬妯″瀷
濡傛灉姣忔″瓨鍌ㄦ垚鍗冧笂涓囨潯鏁版嵁錛岃繖鏍峰緢浼氬艱嚧MySQL鐨勬ц兘寰堝樊錛屽瓨鍌ㄤ互鍙婅誨彇閫熷害寰堟參錛岀劧鍚庡氨婕斿彉鎴愮紦瀛+mysql+鍨傜洿鎷嗗垎鐨勬柟寮忋
Cache浣滀負涓闂寸紦瀛
灝嗘墍鏈夌殑鏁版嵁鍏堜繚瀛樺埌緙撳瓨涓錛岀劧鍚庡啀瀛樺叆mysql涓錛屽噺灝忔暟鎹搴撳帇鍔涳紝鎻愰珮鏁堢巼銆 浣嗘槸褰撴暟鎹鍐嶆″炲姞鍒板張涓涓閲忕駭錛屼笂闈㈢殑鏂瑰紡涔熶笉鑳芥弧瓚抽渶奼傦紝鐢變簬鏁版嵁搴撶殑鍐欏叆鍘嬪姏澧炲姞錛孧emcached鍙鑳界紦瑙f暟鎹搴撶殑璇誨彇鍘嬪姏銆
璇誨啓闆嗕腑鍦ㄤ竴涓鏁版嵁搴撲笂璁╂暟鎹搴撲笉鍫閲嶈礋錛屽ぇ閮ㄥ垎緗戠珯寮濮嬩嬌鐢ㄤ富浠庡嶅埗鎶鏈鏉ヨ揪鍒拌誨啓鍒嗙伙紝浠ユ彁楂樿誨啓鎬ц兘鍜岃誨簱鐨勫彲鎵╁睍鎬с侻ysql鐨刴aster-slave妯″紡鎴愪負榪欎釜鏃跺欑殑緗戠珯鏍囬厤浜嗐
涓諱粠鍒嗙繪ā寮
鍦╮edis鐨勯珮閫熺紦瀛橈紝MySQL鐨勪富浠庡嶅埗錛岃誨啓鍒嗙葷殑鍩虹涔嬩笂錛岃繖鏃禡ySQL涓誨簱鐨勫啓鍘嬪姏寮濮嬪嚭鐜扮摱棰堬紝鑰屾暟鎹閲忕殑鎸佺畫鐚涘烇紝鐢變簬MyISAM浣跨敤琛ㄩ攣錛屽湪楂樺苟鍙戜笅浼氬嚭鐜頒弗閲嶇殑閿侀棶棰橈紝澶ч噺鐨勯珮騫跺彂MySQL搴旂敤寮濮嬩嬌鐢↖nnoDB寮曟搸浠f浛MyISAM銆
鍒嗚〃鍒嗗簱妯″紡
灝嗗彉鍖栧皬鐨勩佷笟鍔$浉鍏崇殑鏀懼湪涓涓鏁版嵁搴擄紝鍙樺寲澶氱殑錛屼笉鐩稿叧鐨勬暟鎹鏀懼湪涓涓鏁版嵁搴撱
3銆 nosql鏁版嵁搴撶殑浼樺娍
1錛夋槗鎵╁睍
榪欎簺綾誨瀷鐨勬暟鎹瀛樺偍涓嶉渶瑕佸滻瀹氱殑妯″紡錛屾棤闇澶氫綑鐨勬搷浣滃氨鍙浠ヨ繘琛屾í鍚戠殑鎵╁睍銆傜浉瀵逛簬鍏崇郴鍨嬫暟鎹搴撳彲浠ュ噺灝戣〃鍜屽瓧孌電壒鍒澶氱殑鎯呭喌銆備篃鏃犲瀷涔嬮棿鍦ㄦ灦鏋勭殑灞傞潰涓婂甫鏉ヤ簡鍙鎵╁睍鐨勮兘鍔
2錛夊ぇ鏁版嵁閲忔彁楂樻ц兘
3錛夊氭牱鐏墊椿鐨勬暟鎹妯″瀷
鍦╪osql涓涓嶄粎鍙浠ュ瓨鍌⊿tring錛宧ash錛宻et銆乑set絳夋暟鎹綾誨瀷錛岃繕鍙浠ヤ繚瀛榡avaBean浠ュ強澶氱嶅嶆潅鐨勬暟鎹綾誨瀷銆
4銆 NoSql鐨勫簲鐢
1錛 澶ф暟鎹鏃朵唬娣樺疂銆佸井淇°佷互鍙婂井鍗氱瓑閮藉箍娉涚殑浣跨敤浜唕edis鏁版嵁搴擄紝灝嗕竴浜涘滻瀹氫笉鍙樼殑鏁版嵁渚嬪傚︽牎錛屽尯鍩熺瓑鍥哄畾鐨勪俊鎮淇濆瓨鍦ㄥ叧緋誨瀷鏁版嵁搴撲腑銆傜劧鍚庡逛簬緇忓父鍙樺寲鐨勬暟鎹渚嬪傛窐瀹濇瘡涓鑺傛棩閮戒細鏈夋瘮杈冪儹闂ㄧ殑鎼滅儲鏄劇ず鍦ㄦ悳緔㈡嗭紝褰撹妭鏃ヨ繃鍘誨叧閿瀛楄嚜鍔ㄥ垹闄わ紝涓轟簡渚誇簬綆$悊錛屽彲浠ュ皢榪欎簺鏁版嵁淇濆瓨鍦╮edis鏁版嵁搴撲腑錛屽苟璁劇疆榪囨湡鏃墮棿錛屽埌杈炬椂闂村氨鑷鍔ㄥ垹闄ゃ
2錛変負浜嗙紦瑙f暟鎹搴撳帇鍔涳紝寰鍗氶栧厛灝嗗彂閫佺殑寰鍗氫繚瀛樺埌redis鏁版嵁搴擄紝鑷宸卞彲浠ョ珛鍗蟲煡鐪嬪埌錛岀劧鍚庡皢鍐呭瓨涓鐨勬暟鎹鍚屾ュ埌鍏崇郴鍨嬫暟鎹搴撱
浠ヤ笂鍐呭逛粎渚涘弬鑰冿紒
鎺ㄨ崘瑙嗛戞暀紼嬶細redis鏁欑▼
C. php redis 什麼時候用
默認情況下,Redis 服務會提供 16 個資料庫,PHPHub 使用 0 號資料庫來做緩存,1 號資料庫來做會話存儲 - Laravel 下配置 Redis 讓緩存、Session 各自使用不同的 Redis 資料庫_PHPHub
隊列的話使用 Beanstalkd
最常用的就是緩存、隊列,當然還有很多其它的,如歸並計算、去重等。
我根據自己使用Redis的場景及個人最佳實踐,整理了一篇文章,redis應用場景與最佳實踐
比如網站搶購時,可以使用redis做隊列,可以使用redis來代替session功能,還有可以拿redis中的無序集合做socket的客戶端id存儲。
D. thinkphp5模型如何使用redis操作資料庫CURD操作
模型中添加如下代碼,可實現更新或插入前刪除緩存:
protected static function init()
{
TurnGiftSetting::beforeInsert(function ($model) {
$redis = new Redis(config('redis'));
$redis->rm(self::$redisKey);
});
TurnGiftSetting::beforeUpdate(function ($model) {
$redis = new Redis(config('redis'));
$redis->rm(self::$redisKey);
});
TurnGiftSetting::beforeDelete(function ($model) {
$redis = new Redis(config('redis'));
$redis->rm(self::$redisKey);
});
TurnGiftSetting::beforeWrite(function ($model) {
$redis = new Redis(config('redis'));
$redis->rm(self::$redisKey);
});
}
E. windows php使用redis怎麼後台運行
1. 進入 DOS窗口
2. 在進入Redis的安裝目錄
3. 輸入:redis-server --service-install redis.windows.conf --loglevel verbose ( 安裝redis服務 )
4. 輸入:redis-server --service-start ( 啟動服務 )
5. 輸入:redis-server --service-stop
主要是需要安裝redis的服務,電腦重新啟動之後如果redis的服務沒啟動需要手動啟動
F. 訂單超時,活動過期解決方案:php監聽redis鍵重復觸發引發事件
訂單超時,活動過期解決方案:php監聽redis鍵重復觸發引發事件
Redis的2.8.0版本之後可用,鍵空間消息(Redis Keyspace Notifications),配合2.0.0版本之後的SUBSCRIBE 可以完成這個定時任務的操作了,定時的單位是秒。
1.我們先訂閱頻道稱為 redisChat
2.現在,我們重新開啟個redis客戶端,然後在同一個頻道redisChat發布消息,訂閱者可以接收到消息。
接收到的消息如下:
3.Key過期事件的Redis配置
需要這里配置notify-keyspace-events的參數為「EX」 .X代表了過期事件。notify-keyspace-events 「Ex」保存配置後,重啟Redis的服務,使配置生效。
PHP Redis實現訂閱鍵空間通知
redis實例化類:
redis.class.php
1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18歲
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//遇到類別重復的報錯,所有叫Redis2
classRedis2
{
private$redis;
publicfunction__construct($host= '127.0.0.1', $port= 6379)
{
$this->redis = newRedis();
$this->redis->connect($host, $port);
}
publicfunctionsetex($key, $time, $val)
{
return$this->redis->setex($key, $time, $val);
}
publicfunctionset($key, $val)
{
return$this->redis->set($key, $val);
}
publicfunctionget($key)
{
return$this->redis->get($key);
}
publicfunctionexpire($key= null, $time= 0)
{
return$this->redis->expire($key, $time);
}
publicfunctionpsubscribe($patterns= array(), $callback)
{
$this->redis->psubscribe($patterns, $callback);
}
publicfunctionsetOption()
{
$this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
}
}
過期事件的訂閱:
psubscribe.php
1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require_once'./Redis.class.php';
$redis= new\Redis2();
// 解決Redis客戶端訂閱時候超時情況
$redis->setOption();
$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');
// 回調函數,這里寫處理邏輯
functionkeyCallback($redis, $pattern, $chan, $msg)
{
echo"Pattern: $pattern\n";
echo"Channel: $chan\n";
echo"Payl
oad: $msg\n\n";
//keyCallback為訂閱事件後的回調函數,這里寫業務處理邏輯,
//比如前面提到的商品不支付自動撤單,這里就可以根據訂單id,來實現自動撤單
}
設置過期事件:
index.php
1個
2
3
4
require_once'./Redis.class.php';
$redis= new\Redis2();
$order_id= 123;
$redis->setex('order_id',10,$order_id);
先用命令行模式執行 psubscribe.php
在瀏覽器訪問 index.php
效果如下:
G. php redis 可以使用yeild嗎
PHP中redis的使用
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value資料庫。redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。
若想在PHP中使用redis,首先要先安裝redis。然後在PHP中配置擴展。
1.安裝redis。
首先下載好redis安裝文件,解壓到D盤或其他盤。
然後通過Dos命令行進行安裝。
把這個文件夾復制到其它地方,比如D:\redis 目錄下。
打開一個cmd窗口 使用cd命令切換目錄到D:\redis 運行 redis-server.exe redis.conf如果想方便的話,可以把redis的路徑加到系統的環境變數里,這樣就省得再輸路徑了,後面的那個redis.conf可以省略,如果省略,會啟用默認的。輸入之後,會顯示如下界面:
這時候另啟一個cmd窗口,原來的不要關閉,不然就無法訪問服務端了切換到redis目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379 出現下圖:
這時候,就已經完成配置了。
完成了配置之後,要在PHP中添加redis的擴展,之後才可以用PHP靈活的使用它。
在windows下安裝php的redis擴展非常簡單,下載一個.dll擴展包放到php的ext目錄下,在php.ini里邊添加一行配置就可以了。
H. PHP Redis是使用connect還是pconnect
首先先介紹下connect和pconnect的區別。
connect:腳本結束之後連接就釋放了。
pconnect:腳本結束之後連接不釋放,連接保持在php-fpm進程中。
所以使用pconnect代替connect,可以減少頻繁建立redis連接的消耗。
I. php 使用redis鎖限制並發訪問類示例
本文介紹了php
使用redis鎖限制並發訪問類,並詳細的介紹了並發訪問限制方法。
1.並發訪問限制問題
對於一些需要限制同一個用戶並發訪問的場景,如果用戶並發請求多次,而伺服器處理沒有加鎖限制,用戶則可以多次請求成功。
例如換領優惠券,如果用戶同一時間並發提交換領碼,在沒有加鎖限制的情況下,用戶則可以使用同一個換領碼同時兌換到多張優惠券。
偽代碼如下:
if
A(可以換領)
B(執行換領)
C(更新為已換領)
D(結束)
如果用戶並發提交換領碼,都能通過可以換領(A)的判斷,因為必須有一個執行換領(B)後,才會更新為已換領(C)。因此如果用戶在有一個更新為已換領之前,有多少次請求,這些請求都可以執行成功。
2.並發訪問限制方法
使用文件鎖可以實現並發訪問限制,但對於分布式架構的環境,使用文件鎖不能保證多台伺服器的並發訪問限制。
Redis是一個開源的使用ANSI
C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
本文將使用其setnx方法實現分布式鎖功能。setnx即Set
it
N**ot
eX**ists。
當鍵值不存在時,插入成功(獲取鎖成功),如果鍵值已經存在,則插入失敗(獲取鎖失敗)
RedisLock.class.PHP
<?php
/**
*
Redis鎖操作類
*
Date:
2016-06-30
*
Author:
fdipzone
*
Ver:
1.0
*
*
Func:
*
public
lock
獲取鎖
*
public
unlock
釋放鎖
*
private
connect
連接
*/
class
RedisLock
{
//
class
start
private
$_config;
private
$_redis;
/**
*
初始化
*
@param
Array
$config
redis連接設定
*/
public
function
__construct($config=array()){
$this->_config
=
$config;
$this->_redis
=
$this->connect();
}
/**
*
獲取鎖
*
@param
String
$key
鎖標識
*
@param
Int
$expire
鎖過期時間
*
@return
Boolean
*/
public
function
lock($key,
$expire=5){
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
//
不能獲取鎖
if(!$is_lock){
//
判斷鎖是否過期
$lock_time
=
$this->_redis->get($key);
//
鎖已過期,刪除鎖,重新獲取
if(time()>$lock_time){
$this->unlock($key);
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
}
}
return
$is_lock?
true
:
false;
}
/**
*
釋放鎖
*
@param
String
$key
鎖標識
*
@return
Boolean
*/
public
function
unlock($key){
return
$this->_redis->del($key);
}
/**
*
創建redis連接
*
@return
Link
*/
private
function
connect(){
try{
$redis
=
new
Redis();
$redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);
if(empty($this->_config['auth'])){
$redis->auth($this->_config['auth']);
}
$redis->select($this->_config['index']);
}catch(RedisException
$e){
throw
new
Exception($e->getMessage());
return
false;
}
return
$redis;
}
}
//
class
end
?>
demo.php
<?php
require
'RedisLock.class.php';
$config
=
array(
'host'
=>
'localhost',
'port'
=>
6379,
'index'
=>
0,
'auth'
=>
'',
'timeout'
=>
1,
'reserved'
=>
NULL,
'retry_interval'
=>
100,
);
//
創建redislock對象
$oRedisLock
=
new
RedisLock($config);
//
定義鎖標識
$key
=
'mylock';
//
獲取鎖
$is_lock
=
$oRedisLock->lock($key,
10);
if($is_lock){
echo
'get
lock
success<br>';
echo
'do
sth..<br>';
sleep(5);
echo
'success<br>';
$oRedisLock->unlock($key);
//
獲取鎖失敗
}else{
echo
'request
too
frequently<br>';
}
?>
測試方法:
打開兩個不同的瀏覽器,同時在A,B中訪問demo.php
如果先訪問的會獲取到鎖
輸出
get
lock
success
do
sth..
success
另一個獲取鎖失敗則會輸出request
too
frequently
保證同一時間只有一個訪問有效,有效限制並發訪問。
為了避免系統突然出錯導致死鎖,所以在獲取鎖的時候增加一個過期時間,如果已超過過期時間,即使是鎖定狀態都會釋放鎖,避免死鎖導致的問題。
源碼下載地址:點擊查看