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
保证同一时间只有一个访问有效,有效限制并发访问。
为了避免系统突然出错导致死锁,所以在获取锁的时候增加一个过期时间,如果已超过过期时间,即使是锁定状态都会释放锁,避免死锁导致的问题。
源码下载地址:点击查看