MENU

使用redis实现关注粉丝功能(php版)

July 12, 2020 • Read: 223 • 折腾

redis不用说啥了,比mysql有的是可以吹的地方,于是很多人选择用redis来实现这类操作频繁的场景
但是下午第一次安装redis花了好多时间...

这里借用Redis实现用户关注功能的思路
于是有

<?php
namespace frag\lib;
class follow
{
    public static $redis;
    public function __construct()
    {
        // 连接redis
        self::$redis = new \Redis();
        self::$redis->connect(conf::get('IP', 'route'), 6379);
    }

    /**
     * 添加关注
     * @param int $follower uid
     * @param int $fan uid
     */
    public static function add($follower, $fan)
    {
        $name = $follower . ':follow';
        $other = $fan . ':fans';
        // 将对方id添加到自己的关注列表中
        self::$redis->zAdd($name, time(), $fan);
        //将自己的id添加到对方的粉丝列表中
        self::$redis->zAdd($other, time(), $follower);

    }

    /**
     * 取消关注
     * @param int $follower uid
     * @param int $fan uid
     */
    public static function del($follower, $fan)
    {
        $name = $follower . ':follow';
        $other = $fan . ':fans';
        // 将对方id从自己的关注列表中移除;
        self::$redis->zRem($name, $fan);
        // 将自己的id从对方的粉丝列表中移除
        self::$redis->zRem($other, $follower);
    }

    /**
     * 获取我的关注列表
     * @param $my
     * @return array
     */
    public static function getFollowList($my)
    {
        $name = $my . ':follow';
        return self::$redis->zRange($name, 0, -1);
    }

    /**
     * 获取我的粉丝列表
     * @param $my
     * @return array
     */
    public static function getFansList($my)
    {
        $name = $my . ':fans';
        return self::$redis->zRange($name, 0, -1);
    }

    /**
     * 人物关系
     * @param $my
     * @param $other
     * @return int
     */
    public static function relation($my, $other)
    {
        // 我关注了他 0
        // 他关注了我 1
        // 互相关注 2
        $myFans = $my . ':fans';
        $myFollow = $my . ':follow';
        $otherFans = $other . ':fans';
        $otherFollow = $other . ':follow';
        if (!self::$redis->zScore($myFans, $other) && self::$redis->zScore($myFollow, $other))
            return 0;
        elseif (!self::$redis->zScore($otherFans, $my) && self::$redis->zScore($otherFollow, $my))
            return 1;
        elseif (self::$redis->zScore($myFans, $other) && self::$redis->zScore($myFollow, $other))
            return 2;
    }

    /**
     * 返回我的关注数和粉丝数
     * @param $my
     * @return array
     */
    public static function count($my)
    {
        $myFans = $my . ':fans';
        $myFollow = $my . ':follow';
        return [self::$redis->zCard($myFollow), self::$redis->zCard($myFans)];
    }


}
Last Modified: July 14, 2020
Archives QR Code Tip
QR Code for this page
Tipping QR Code