PHP结合redis实现点赞功能

简介: 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'];
    }
}

目录
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
831 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
440 32
|
运维 JavaScript 应用服务中间件
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
本文介绍了OS Copilot在ECS上 Alibaba Cloud Linux的安装与使用,并对其多项参数进行了功能测评。OS Copilot是为操作系统提供智能化辅助的工具,支持自动化任务、智能推荐、故障排查等功能。安装时需检查是否已安装(`rpm -q os-copilot`),若未安装则用`yum install os-copilot`命令安装,并配置AccessKey信息连接阿里云服务。通过测试不同参数命令,如`-t`参数,展示了其自动化执行和智能生成回答的能力,显著提升运维效率。
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
|
存储 监控 NoSQL
使用Redis实现延迟消息发送功能
使用 Redis 的密码认证功能,为实例设置密码以防止未授权访问。为消息提供适当加密,确保消息内容在网络传输过程中不被窃取或篡改。
509 16
|
存储 NoSQL Redis
采用Redis的Bitmaps实现类似Github连续提交状态的功能。
在现实世界的应用开发中,实现类似于Github提交跟踪系统时,还可能需要考虑用户时区、闰年等日期相关的边界条件,以及辅助数据的存储和查询优化,例如对活跃用户的即时查询和统计等。不过这些都可以在Bitmaps的基础功能之上通过额外的代码逻辑来实现。
290 0
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
|
PHP 数据库
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
1327 13
|
JavaScript PHP UED
16 PHP实现图书删除功能
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入了解PHP。本文介绍了如何实现图书删除功能,通过点击删除按钮触发`deleteBook.php`文件,完成删除操作并返回列表页。同时,还新增了一个“新增”按钮,优化了用户体验。
16 PHP实现图书删除功能
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
810 4