redis实现的点赞功能的设计思路

admin 2023-10-30 19:01:11 2228

点赞功能的一般设计思路是:使用一个数据模型来表示点赞,包括点赞的用户ID和被点赞的内容ID。将点赞信息存储在数据库中,可以跟踪用户点赞的内容。在前端提供点赞按钮,用户点击按钮触发点赞操作。后端接收点赞请求,检查用户是否已经点赞,如果没有点赞则将点赞信息存储到数据库中。可以为每个内容维护一个点赞计数,以便在前端显示点赞数量。确保验证请求,防止未经授权的用户进行点赞操作。

使用Redis实现点赞功能的基本步骤包括:

  1. 当用户点赞时,将用户ID和内容ID存储在Redis集合中。
  2. 当用户取消点赞时,从Redis集合中移除相应的用户ID。
  3. 使用Redis的集合操作来获取点赞数量,例如使用SCARD命令计算集合的大小。
  4. 使用SISMEMBER命令检查用户是否已经点赞了某个内容。
  5. 定期将点赞数据从Redis同步到数据库,以防止数据丢失。

以上是点赞功能的一般设计思路和使用Redis实现的简要步骤。

下面是原生PHP的示例代码,大家可以参考。

<?php
/** 使用方法 */
$like = new Like(1023,'article');//实例化文章1023的点赞服务
$like->like(1);//用户1点赞
$like->isLike(1);//用户1 是否已赞

#[AllowDynamicProperties]
class Like
{

    /** @var Redis Redis实例 */
    protected Redis $redis;
    /** @var string redis key */
    protected string $redis_key;

    public function __construct(readonly public int $data_id, readonly public string $data_type)
    {
        $this->redis = new Redis();
        $this->key = "like_set:{$this->data_type}_$this->data_id";//set结构
    }

    /**
     * 喜欢某个内容
     * @param int $from_user_id 点赞用户
     * @return bool|int|Redis
     */
    public function like(int $from_user_id): bool|int|Redis
    {
        return $this->redis->sAdd($this->key, $from_user_id);//将用户ID添加到内容的点赞集合中
    }

    /**
     * @param int $from_user_id 取消点赞用户
     * @return false|int|Redis
     */
    public function unLike(int $from_user_id): false|int|Redis
    {
        return $this->redis->sRem($this->key, $from_user_id);//从内容的点赞集合中移除用户ID
    }

    /**
     * 获取点赞数量
     * @return false|int|Redis
     */
    public function count(): false|int|Redis
    {
        try {
            return $this->redis->sCard($this->key);
        } catch (RedisException $e) {
            return 0;
        }
    }

    /**
     * @param int $from_user_id
     * @return bool|Redis
     */
    public function isLike(int $from_user_id): bool|Redis
    {
        try {
            return $this->redis->sIsMember($this->key, $from_user_id);//使用SISMEMBER命令检查用户ID是否存在于集合中
        } catch (RedisException $e) {
            return false;
        }
    }
}

同步到数据库的代码,这里就不写了。。。大家伙自己实现吧。

可爱猫?Telegram电报群 https://t.me/ikeaimao

社区声明 1、本站提供的一切软件、教程和内容信息仅限用于学习和研究目的
2、本站资源为用户分享,如有侵权请邮件与我们联系处理敬请谅解!
3、本站信息来自网络,版权争议与本站无关。您必须在下载后的24小时之内,从您的电脑或手机中彻底删除上述内容
最新回复 (0)

您可以在 登录 or 注册 后,对此帖发表评论!

返回