文章目录

  • 前言
  • 一、Redis订阅发布是什么?
  • 二、使用步骤
  • 1.安装Redis
  • 2.使用
  • 总结



前言

前段时间有一个需求是这样的,公司有一个视频资源网站,同时拥有一个需要该视频资源的客户端,用户通过网站购买加密视频资源,在客户端使用。因为是加密视频,用户使用时需要获取解密秘钥,解密秘钥是用户在网站购买之后才能够获取。但是用户登陆客户端时,只有在登陆时才能够获取一次所有秘钥,中途购买无法获取秘钥信息。所以考虑了一下决定使用Redis订阅发布功能来主动通知客户端。



一、Redis订阅发布是什么?

所谓发布订阅,就是消息发布者发布消息及消息订阅者接收消息,二者通过某种媒介关联起来。这类似以前的『订报』,当我们订阅了某种报纸后(比如财经报),每当报纸有新的期刊出版后,就会有邮递员给我们送过来。即,只有定了这种报纸才会收到出版社发布的这种新报纸。


二、使用步骤

1.安装Redis



2.使用

代码如下(示例):

/**
 * Redis 发布
 * @param $user_id  int 用户iD
 * @param $source_id    int  资源id
 * @return bool
 */
function redis_publish($user_id, $source_id)
{
    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('redis密码'); //密码验证 //redis密码

    //查询用户账号,用作频道 通知对应用户
    $user_info = M('user')->where(['id' => $user_id])->field('phone,email')->find();
    //查询资源对应的秘钥和标识
    $source_info = M('source')->where(['id' => $source_id])->field('source_pwd,source_flag')->find();
    //组合发布参数
    $data = ['source_flag' => $source_info['source_flag']];

    if ($user_info['phone']) {
        $channel_name = $user_info['phone'];
        $redis->publish($channel_name, json_encode($data));
    }

    if ($user_info['email']) {
        $channel_name = $user_info['email'];
        $redis->publish($channel_name, json_encode($data));
    }
    return true;
}

这里是根据用户的手机号或者邮箱作为唯一频道进行发布消息的。
//使用redis 发布订阅
redis_publish($uid, $source_id);


关于订阅,因为客户端是使用C语言进行开发的,这里使用PHP作为一个演示案例供大家参考

<?php
//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);
//声明测试频道名称
$channelName = "testPubSub";
$channelName2 = "testPubSub2";
try {
  $redis = new \Redis();
  //建立一个长链接
  $redis->pconnect('127.0.0.1', 6379);
  //阻塞获取消息
  $redis->subscribe(array($channelName, $channelName2), function ($redis, $chan, $msg) {
    echo "channel:".$chan.",message:".$msg."\n";
  });
} catch (Exception $e) {
  echo $e->getMessage();
}

总结

本文仅仅简单介绍了本人在第一次使用Redis的过程,而Redis的使用远远不限于此。此文仅供参考,欢迎大家指正。