PHP结合redis实现点赞功能

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
目录
相关文章
|
3天前
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
15 3
|
7天前
|
存储 NoSQL PHP
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
|
13天前
|
存储 NoSQL 关系型数据库
PHP 使用 Redis
10月更文挑战第22天
22 6
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
25 2
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
24 2
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
49 2
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
1月前
|
缓存 NoSQL 数据处理
原生php实现redis缓存配置和使用方法
通过上述步骤,你可以在PHP项目中配置并使用Redis作为高性能的缓存解决方案。合理利用Redis的各种数据结构和特性,可以有效提升应用的响应速度和数据处理效率。记得在实际应用中根据具体需求选择合适的缓存策略,如设置合理的过期时间,以避免内存过度消耗。
45 0
|
2月前
|
PHP
深入浅出PHP之文件上传功能
【9月更文挑战第26天】本文将带你了解PHP中的文件上传功能,从基本概念到实战操作,一步步教你如何实现文件上传。我们将通过代码示例和详细的解释,让你轻松掌握这一技能。
下一篇
无影云桌面