使用Redis实现点赞取消点赞的详细代码


Posted in Redis onMarch 20, 2022

前言

异步实现

代码实现:

/**
     *
     * @param userId 点赞的人
     * @param type 点赞与取消点赞的表示
     * @param textId   文章ID
     * @param entityUserId -- 被点赞的人,文章作者
     */
    private void like(long userId,int type,int textId,long entityUserId){
        redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);
                String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
                boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);
                //多个更新操作,需要事务
                operations.multi();
                if (isMember) {
                    //取消赞
                    redisTemplate.opsForSet().remove(entityLikeKey, userId);
                    redisTemplate.opsForValue().decrement(userLikeKey);
                } else {
                    //点赞
                    redisTemplate.opsForSet().add(entityLikeKey, userId);
                    redisTemplate.opsForValue().increment(userLikeKey);
                }
                return operations.exec();
            }
        });

    }

    /**
     *查询某实体(帖子,评论等)点赞数量
     * @param type 1点赞,2评论。0表示取消点赞
     * @param textId
     * @return
     */
    private long findEntityLikeCount(int type, int textId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);
        return redisTemplate.opsForSet().size(entityLikeKey);
    }

    /**
     * 查询某人对某文章的点赞状态
     * @param textId 帖子ID
     * @param userId
     * @return
     */
    private int findEntityLikeStatus(int textId,long userId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(1, textId);
        //此处返回int,是为了进行扩展。比如扩展踩,为止2.等等情况
        return redisTemplate.opsForSet().isMember(entityLikeKey,userId)?1:0;
    }

    /**
     * 查询某个用户获得赞,用于在个人主页查看收获了多少赞
     * @param userId
     * @return
     */
    private int findUserLikeCount(long userId){
        String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
        Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);
        // count.intValue()数据的整数形式;
        return count==null?0:count.intValue();
    }

Redis–key设置

public class RedisKeyUtil {
    private static final String SPLIT = ":";
    private static final String PREFIX_ENTITY_LIKE = "like:entity";
    private static final String PREFIX_USER_LIKE = "like:user";
    private static final String PREFIX_USER_COMMENTS="comments:user";
    /**
     *某个实体收到的赞,如帖子,
     * like:entity:entityType:entityId -> set(userId) 对应set,存入userId
     * @param entityType
     * @param entityId
     * @return
     */
    public static String getEntityLikeKey(int entityType, int entityId) {
        return PREFIX_ENTITY_LIKE + entityType + SPLIT + entityId;
    }
     *某个用户收到的总赞数
     * like:user:userId ->long
     * @param userId
    public static String getUserLikeKey(long userId) {
        return PREFIX_USER_LIKE + SPLIT + userId;
     * 汇总某个帖子的评论数量
    public static String getUserCommentsKey(int articleId) {
        return PREFIX_USER_COMMENTS + SPLIT + articleId;

到此这篇关于Redis实现点赞取消点赞的文章就介绍到这了,更多相关Redis实现点赞取消点赞内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
php 禁止页面缓存输出
2009/01/07 PHP
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
Python 26进制计算实现方法
2015/05/28 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
社团成立邀请函
2014/01/08 职场文书
合作意向书格式及范文
2014/03/31 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
讲文明倡议书
2015/04/29 职场文书
英语读书笔记
2015/07/02 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python