Redis键值过期自动执行回调函数

更新时间:2023-07-17 01:23:38 阅读: 评论:0

Redis键值过期⾃动执⾏回调函数
⽤到了 redis 的键空间通知(keyspace notifications)
今天帮忙解决问题时遇到的redis⼀个功能点
具体⾏为就是:某个键值到了过期时间⾃动触发回调函数,然后执⾏⼀些操作,⽐如订单15分钟未⽀付就⾃动取消。
系统环境Win10, PHP7.1
下⾯记录下刚才爬的坑:
聚能教育
1、redis 2.8版本的升级到 3.0 以上再说,⽐如 3.2
2、如果将redis加⼊到windows的系统服务了,建议在初始阶段停⽌服务,使⽤redis-rver "配置⽂件路径" 来启动redis,因为系统服务
启动的redis使⽤的配置⽂件你可能搞不清楚,导致修改配置⽂件不⽣效,在最后我会讲。
3、各种路径,参数问题,加不加引号等问题。
本⽂仅就此功能进⾏讲解,业务逻辑不过多累述。
⾸先找⼀个空⽬录,新建四个⽂件,⽂件名以及内容如下:
index.php 经过⼀些业务逻辑后,设置⼀个 10s 后过期的键值
<?php
require_once 'Redis2.class.php';
// require_once 'db.class.php';
$redis2 = new \Redis2();
// $mysql      = new \mysql();  // 注释是你的业务逻辑
// $mysql->connect();
// $order_sn='SN'.time().'T'.rand(10000000,99999999);
// $data = ['ordersn'=>$order_sn,'status'=>0,'createtime'=>date('Y-m-d H:i:s',time())];
/
/ $mysql->inrt('order',$data);
$res = $redis2->tex('kkk',10, "It is no pay");
var_dump($res);exit;
psubscribe.php 监听,超时回调函数
<?php
require_once 'Redis2.class.php';
ini_t('default_socket_timeout', -1);  //不超时
$redis = new Redis2();
// 解决Redis客户端订阅时候超时情况
$redis->tOption();
$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');
/
/ 回调函数,这⾥写处理逻辑
function keyCallback($redis, $pattern, $chan, $msg)
{
echo date('Y-M-D H:i:s');  // 这两⾏留作查看是否执⾏回调函数
// file_put_contents("d:/lizheng.log", "\n\n".print_r(123, true),8);
// 下⾯写你的业务逻辑
//修改订单状态
// $order=model('order')->where(['order_no'=>$msg])->find();
// $order->status=-1;
// $order->save();
// //库存还原
/
/ $products=json_decode($order->snap_items,true);
// foreach($products as $v){
//    model('product')->where(['id'=>$v['id']])->tInc('stock',$v['count']);
// }
}
Redis2.class.php 封装 redis 类
<?php
class Redis2
{
private $redis;
public function __construct($host = '127.0.0.1', $port = 6379)
{
$this->redis = new Redis();
$this->redis->connect($host, $port);
// $this->redis->auth('123456');
}
public function tex($key, $time, $val)
{
return $this->redis->tex($key, $time, $val);
}
public function t($key, $val)
{
return $this->redis->t($key, $val);
}
public function get($key)
{
return $this->redis->get($key);
}
public function expire($key = null, $time = 0)
{
return $this->redis->expire($key, $time);
}
public function psubscribe($patterns = array(), $callback)
{
$this->redis->psubscribe($patterns, $callback);
}
训练大脑的方法public function tOption()
{
$this->redis->tOption(\Redis::OPT_READ_TIMEOUT, -1);
}
public function lRange($key,$start,$end)
{
return $this->redis->lRange($key,$start,$end);
}
public function lPush($key, $value1, $value2 = null, $valueN = null ){
return $this->redis->lPush($key, $value1, $value2 = null, $valueN = null );
}
public function delete($key1, $key2 = null, $key3 = null)
{
return $this->redis->delete($key1, $key2 = null, $key3 = null);
}
}
db.class.php 封装mysql,这⾥我们不涉及业务逻辑所以未使⽤<?php
class mysql
{
private $mysqli;
private $result;
/**
* 数据库连接
* @param $config 配置数组
*/
public function connect()
{
$config=array(
'host'=>'127.0.0.1',
'urname'=>'root',
马航翻译
98 degrees'password'=>'123456qwerty',
'databa'=>'marhal',
'port'=>3306,
);
$host = $config['host'];    //主机地址
$urname = $config['urname'];//⽤户名
$password = $config['password'];//密码
$databa = $config['databa'];//数据库
$port = $config['port'];    //端⼝号
$this->mysqli = new mysqli($host, $urname, $password, $databa, $port);    }
/**
* 数据查询
* @param $table 数据表
* @param null $field 字段
* @param null $where 条件
* @return mixed 查询结果数⽬
*/
public function lect($table, $field = null, $where = null)
{
godknows$sql = "SELECT * FROM `{$table}`";
//echo $sql;exit;
if (!empty($field)) {
$field = '`' . implode('`,`', $field) . '`';
$sql = str_replace('*', $field, $sql);
}
if (!empty($where)) {
$sql = $sql . ' WHERE ' . $where;
}
$this->result = $this->mysqli->query($sql);
return $this->result;
}
/**
* @return mixed 获取全部结果
*/
public function fetchAll()
{
return $this->result->fetch_all(MYSQLI_ASSOC);
}
/**
* 插⼊数据
* @param $table 数据表
* @param $data 数据数组
* @return mixed 插⼊ID
*/
public function inrt($table, $data)
{
foreach ($data as $key => $value) {
$data[$key] = $this->mysqli->real_escape_string($value);
}
$keys = '`' . implode('`,`', array_keys($data)) . '`';glory hole
上海学化妆$values = '\'' . implode("','", array_values($data)) . '\'';
$sql = "INSERT INTO `{$table}`( {$keys} )VALUES( {$values} )";
$this->mysqli->query($sql);
return $this->mysqli->inrt_id;
}
/
**
* 更新数据
* @param $table 数据表
* @param $data 数据数组
* @param $where 过滤条件
* @return mixed 受影响记录
*/
public function update($table, $data, $where)
{
foreach ($data as $key => $value) {
$data[$key] = $this->mysqli->real_escape_string($value);
}
$ts = array();
foreach ($data as $key => $value) {
$kstr = '`' . $key . '`';
$vstr = '\'' . $value . '\'';
array_push($ts, $kstr . '=' . $vstr);
}
brightcove$kav = implode(',', $ts);
$sql = "UPDATE `{$table}` SET {$kav} WHERE {$where}";
$this->mysqli->query($sql);
return $this->mysqli->affected_rows;
pdc
}
/**
* 删除数据
* @param $table 数据表
* @param $where 过滤条件
* @return mixed 受影响记录
*/
public function delete($table, $where)
tatanic{
$sql = "DELETE FROM `{$table}` WHERE {$where}";
$this->mysqli->query($sql);
return $this->mysqli->affected_rows;
}
}
配置⽂件修改
配置⽂件中找到 notify-keyspace-events ""  将其改成  notify-keyspace-events "Ex" // 注意引号,之所以要求3.0以上版本,是因为2.8版本设置了此项后会于java冲突,⽆法启动。    Ex代表过期,另外注意修改的配置⽂件,是否为正使⽤的配置⽂件
以上操作完成后,重启redis,以指定配置⽂件的⽅式重启,以免使⽤其它的配置⽂件或redis默认配置。
redis-rver "D:/redis/f";  // 3.2版本为例,其它版本中,⽂件名可能为其它。
// 此处之外还有⼀个 redis.f ⽂件,作为系统服务启动时的配置⽂件。
服务截图如下
"D:\Program Files\" --rvice-run f --loglevel verbo
如果你不想将redis加⼊到系统服务,那么可以不⽤安装服务,只⽤命令⾏启动redis即可。    --rvice-uninstall    // redis系统服务的卸载, 也可以通过管理员命令⾏ sc delete 服务名来卸载    redis-rver --rvice-install f --loglevel verbo  // 安装服务
运⾏测试
切换到你的redis⽬录,或者将redis加⼊系统变量Path中
php -v // 可以直接调⽤PHP命令,我的版本为7.1,此功能与php版本关系不⼤
php psubscribe.php // 启动监听程序
php index.php // 通过index.php 模拟订单超时,即建⽴⼀个⽣命周期为10秒的键值。
10秒后,psubscribe.php 会调⽤回调函数执⾏⼀些操作。
psubscribe.php 窗⼝有相应的输出即可

本文发布于:2023-07-17 01:23:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/179730.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:服务   配置   系统
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图