首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[分享]redis实现的点赞功能的设计思路

发布于 2025-01-01 22:05:46
0
178

点赞功能的一般设计思路是:使用一个数据模型来表示点赞,包括点赞的用户ID和被点赞的内容ID。将点赞信息存储在数据库中,可以跟踪用户点赞的内容。在前端提供点赞按钮,用户点击按钮触发点赞操作。后端接收点赞...

点赞功能的一般设计思路是:使用一个数据模型来表示点赞,包括点赞的用户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;
        }
    }
}

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

评论
一个月内的热帖推荐
久久在线
Lv.1普通用户

551

帖子

21

小组

2050

积分

赞助商广告
站长交流