PHP结合redis实现点赞功能

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: PHP结合redis实现点赞功能

第一下载redis包

"predis/predis": "^1.1",
<?php
/**
 * 点赞
 */
namespace app\like\service;
use app\common\DataService;
use app\common\Redis;
class LikeService
{
    const LIKE_TYPE_ALL = 4; //全部
    const LIKE_USER_GIVE_SHOW_CHINESENAME = '赞了您这条';
    const LIKE_USER_RECEIVE_SHOW_CHINESENAME = '我点赞了这条';
    const BLOG_CHINESENAME = '资讯';
    /**
     * 点赞资讯
     * @param int $userId 用户ID
     * @param int $blogId 资讯ID
     */
    public function addLikeBlog($userId, $blogId, $sys)
    {
        $blogInfo = $this->_getBlogInfo($blogId, $sys);
        if (!$blogInfo) return false;
        if ($blogInfo['author_id']) {
            //(资讯创建人)我收到点赞全部列表
            $key = $this->_getMyAllReceiveLikeListKey($blogInfo['author_id'], $sys);
            Redis::getInstance()->redisZadd($key, time(), $blogId . ':blog:' . $userId . ':likeuserid');
        }
        //资讯点赞列表
        $key = $this->_getBlogListKey($blogId, $sys);
        Redis::getInstance()->redisZadd($key, time(), $userId);
        //我的点赞资讯列表
        $key = $this->_getMyLikeBlogListKey($userId, $sys);
        Redis::getInstance()->redisZadd($key, time(), $blogId);
        //我发出点赞全部列表
        $key = $this->_getMyAllGiveLikeListKey($userId, $sys);
        Redis::getInstance()->redisZadd($key, time(), $blogId . ":blog");
        return true;
    }
    /**
     * 取消点赞资讯
     * @param int $userId 用户ID
     * @param int $BlogId 资讯ID
     */
    public function unLikeBlog($userId, $blogId, $sys)
    {
        $blogInfo = $this->_getBlogInfo($blogId, $sys);
        if (!$blogInfo) return false;
        if ($blogInfo['author_id']) {
            //(资讯创建人)我收到点赞全部列表
            $key = $this->_getMyAllReceiveLikeListKey($blogInfo['author_id'], $sys);
            Redis::getInstance()->redisZrem($key, $blogId . ':blog:' . $userId . ':likeuserid');
        }
        //资讯点赞列表
        $key = $this->_getBlogListKey($blogId, $sys);
        Redis::getInstance()->redisZrem($key, $userId);
        //我的点赞资讯列表
        $key = $this->_getMyLikeBlogListKey($userId, $sys);
        Redis::getInstance()->redisZrem($key, $blogId);
        //我的点赞全部列表
        $key = $this->_getMyAllGiveLikeListKey($userId, $sys);
        Redis::getInstance()->redisZrem($key, $blogId . ":blog");
        return true;
    }
    /**
     * 判断资讯是否被点赞
     * @param int $userId 登录用户ID
     * @param int $blogId 资讯ID
     */
    public function isLikeBlog($userId, $blogId, $sys)
    {
        $key = $this->_getMyLikeBlogListKey($userId, $sys);
        $score = Redis::getInstance()->redisZscore($key, $blogId);
        if (empty($score)) {
            return false;
        }
        return true;
    }
    /**
     * 获取资讯点赞数量
     */
    public function getBlogLikeCount($blogId, $sys)
    {
        $key = $this->_getBlogListKey($blogId, $sys);
        $count = (int)Redis::getInstance()->redisZcard($key);
        return ['count' => $count];
    }
    /**
     * 获取资讯评论点赞排序,从高到低排序
     * 返回排序好后评论id数组
     */
    public function getBlogCommentLikeSort($blogId, $sys)
    {
        $key = $this->_getCommentTypeListKey($blogId, 'blog', $sys);
        $list = Redis::getInstance()->redisZRevRange($key, 0, -1, ['WITHSCORES']);
        return $list;
    }
    /**
     * 获取我发出的点赞列表
     * @param int $type 1 帖子 2 资讯 3评论 4全部
     */
    public function getMyAllGiveLikeList($userId, $sys, $type, $pageNo = 1, $pageCount = 10)
    {
        switch ($type) {
            case self::LIKE_TYPE_BLOG:
                $key = $this->_getMyLikeBlogListKey($userId, $sys);
                break;
            default:
                $key = $this->_getMyAllGiveLikeListKey($userId, $sys);
                break;
        }
        $list = Redis::getInstance()->redisZRevRange($key, 0, -1);
        $list = isset($list['data']) ? $list['data'] : [];
        //只展示显示每页数量
        $result = array_slice($list, ($pageNo - 1) * $pageCount, $pageCount);
        $data = [];
        if ($type == self::LIKE_TYPE_ALL) {
            //获取全部信息
            foreach ($result as $k => $value) {
                $detail = explode(':', $value);
                //适应前端数据格式
                $score = Redis::getInstance()->redisZscore($key, $value);
                $likeTime = date("Y-m-d H:i:s", $score);
                $likeTime = DataService::getInstance()->_handleCreateTimeTwo($likeTime);
                $data[$k]['likeTime'] = $likeTime;
                $data[$k]['titleId'] = $detail[0];
                $data[$k]['commentId'] = 0;
                $data[$k]['comment'] = '';
                if (isset($detail[1]) && $detail[1] == 'blog') {
                    $blogInfo = $this->_getBlogInfo($detail[0], $sys);
                    $blogAuthorId = isset($blogInfo['author_id']) ? $blogInfo['author_id'] : 0;
                    $authorInfo = $this->_getAuthorInfo($blogAuthorId, $sys);
                    $data[$k]['sourceUserId'] = $blogAuthorId;
                    $data[$k]['sourceUserNickName'] = isset($authorInfo['author_name']) ? $authorInfo['author_name'] : '';
                    $data[$k]['sourceUserHeadimgurl'] = isset($authorInfo['author_headimgurl']) ? $authorInfo['author_headimgurl'] : '';
                    $data[$k]['likeShowName'] = self::LIKE_USER_RECEIVE_SHOW_CHINESENAME . self::BLOG_CHINESENAME;
                    //点赞来源类型id,1帖子2资讯
                    $data[$k]['likeSourceTypeId'] = self::LIKE_TYPE_BLOG;
                    $data[$k]['likeTypeName'] = self::BLOG_CHINESENAME;
                    $data[$k]['title'] = isset($blogInfo['title']) ? $blogInfo['title'] : '';
                    //评论创建者信息设置为空
                    $data[$k]['commentUserId'] = 0;
                    $data[$k]['commentUserNickName'] = '';
                    $data[$k]['commentUserHeadimgurl'] = '';
                }
            }
        }
        $count = count($data);
        $pagerInfo = [
            "total" => $count,
            "page_no" => $pageNo,
            "page_count" => $pageCount,
            "page_total" => ceil($count / $pageCount)
        ];
        return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "查询成功", "data" => ["page_info" => $pagerInfo, "list" => $data]];
    }
    /**
     * 获取我收到的点赞列表
     * @param int $type 1 帖子 2 资讯 3评论 4全部
     */
    public function getMyAllReceiveLikeList($userId, $sys, $type, $pageNo = 1, $pageCount = 10)
    {
        switch ($type) {
            case self::LIKE_TYPE_BLOG:
                $key = $this->_getMyLikeBlogListKey($userId, $sys);
                break;
            default:
                $key = $this->_getMyAllReceiveLikeListKey($userId, $sys);
                break;
        }
        $list = Redis::getInstance()->redisZRevRange($key, 0, -1);
        $list = isset($list['data']) ? $list['data'] : [];
        //只展示显示每页数量
        $result = array_slice($list, ($pageNo - 1) * $pageCount, $pageCount);
        $data = [];
        if ($type == self::LIKE_TYPE_ALL) {
            //获取全部信息
            foreach ($result as $k => $value) {
                $detail = explode(':', $value);
                //适应前端数据格式
                $score = Redis::getInstance()->redisZscore($key, $value);
                $likeTime = date("Y-m-d H:i:s", $score);
                $likeTime = DataService::getInstance()->_handleCreateTimeTwo($likeTime);
                $data[$k]['likeTime'] = $likeTime;
                $data[$k]['titleId'] = $detail[0];
                $data[$k]['commentId'] = 0;
                $data[$k]['comment'] = '';
                if (isset($detail[1]) && $detail[1] == 'blog') {
                    $blogInfo = $this->_getBlogInfo($detail[0], $sys);
                    $blogAuthorId = isset($blogInfo['author_id']) ? $blogInfo['author_id'] : 0;
                    $authorInfo = $this->_getAuthorInfo($blogAuthorId, $sys);
                    $data[$k]['sourceUserId'] = $blogAuthorId;
                    $data[$k]['sourceUserNickName'] = isset($authorInfo['author_name']) ? $authorInfo['author_name'] : '';
                    $data[$k]['sourceUserHeadimgurl'] = isset($authorInfo['author_headimgurl']) ? $authorInfo['author_headimgurl'] : '';
                    $data[$k]['likeShowName'] = self::LIKE_USER_GIVE_SHOW_CHINESENAME . self::BLOG_CHINESENAME;
                    //点赞来源类型id,1帖子2资讯
                    $data[$k]['likeSourceTypeId'] = self::LIKE_TYPE_BLOG;
                    $data[$k]['likeTypeName'] = self::BLOG_CHINESENAME;
                    $data[$k]['title'] = isset($blogInfo['title']) ? $blogInfo['title'] : '';
                    //评论创建者信息
                    $data[$k]['commentUserId'] = 0;
                    $data[$k]['commentUserNickName'] = '';
                    $data[$k]['commentUserHeadimgurl'] = '';
                }
                //点赞者信息
                $userInfo = $this->_getUserInfo($detail[2], $sys);
                $data[$k]['userId'] = $detail[2];
                $data[$k]['userNickName'] = isset($userInfo['nickname']) ? $userInfo['nickname'] : '';
                $data[$k]['userHeadimgurl'] = isset($userInfo['headimgurl']) ? $userInfo['headimgurl'] : '';
            }
        }
        $count = count($data);
        $pagerInfo = [
            "total" => $count,
            "page_no" => $pageNo,
            "page_count" => $pageCount,
            "page_total" => ceil($count / $pageCount)
        ];
        return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "查询成功", "data" => ["page_info" => $pagerInfo, "list" => $data]];
    }
    /**
     * 获取资讯点赞列表的key
     */
    private function _getBlogListKey($blogId, $sys)
    {
        return "Like:{$sys}:blog:{$blogId}";
    }
    /**
     * 获取我的点赞资讯的key
     */
    private function _getMyLikeBlogListKey($userId, $sys)
    {
        return "Like:{$sys}:users:blogs:{$userId}";
    }
    /**
     * 获取我的全部发出点赞列表的key
     * Like:343:users:all:give:1
     * 在343系统下用户id=1全部发出点赞列表(value=2:blog(文章id为2),score=time时间戳)
     */
    private function _getMyAllGiveLikeListKey($userId, $sys)
    {
        return "Like:{$sys}:users:all:give:{$userId}";
    }
    /**
     * 获取我的全部收到点赞列表的key
     * Like:343:users:all:receive:1
     * 在343系统下用户id=1全部收到点赞列表(value=2:blog(文章id为2),score=time时间戳)
     */
    private function _getMyAllReceiveLikeListKey($userId, $sys)
    {
        return "Like:{$sys}:users:all:receive:{$userId}";
    }
    /**
     * 获取资讯信息
     */
    private function _getBlogInfo($blogId, $sys)
    {
        if (empty($blogId)) {
            return [];
        }
        $blogInfo = BlogInstanceModel::getInstance()->getOneById($blogId, $sys);
        return $blogInfo['data'];
    }
}

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7天前
|
JavaScript PHP UED
16 PHP实现图书删除功能
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入了解PHP。本文介绍了如何实现图书删除功能,通过点击删除按钮触发`deleteBook.php`文件,完成删除操作并返回列表页。同时,还新增了一个“新增”按钮,优化了用户体验。
15 2
16 PHP实现图书删除功能
|
7天前
|
JavaScript PHP
17 PHP 实现批量删除功能
路老师在本文中继续优化图书删除功能,实现批量删除图书。通过添加删除按钮、表格前的复选框以及实现PHP后端逻辑,展示了完整的删除流程和效果。
21 8
|
7天前
|
数据库连接 PHP
15 PHP实现图书修改功能
路老师分享了如何使用PHP实现图书信息的修改功能。首先,在列表页面点击编辑按钮,跳转至`editBook.php`,通过ID获取图书信息并展示在`edit.html`页面。用户提交修改后,`updateBook.php`处理更新请求,成功后返回到图书列表页。纯干货,技术知识满满。
16 2
|
7天前
|
PHP
14 PHP实现图书添加功能
路老师分享PHP语言知识,帮助大家入门并深入了解PHP。本文介绍如何实现图书添加功能,包括创建HTML表单和PHP后端处理逻辑,最后展示实际效果。
15 2
|
10天前
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
24 3
|
14天前
|
存储 NoSQL PHP
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
|
20天前
|
存储 NoSQL 关系型数据库
PHP 使用 Redis
10月更文挑战第22天
23 6
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
25 2