使用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 相关文章推荐
解决redis sentinel 频繁主备切换的问题
Apr 12 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
Redis分布式锁Redlock的实现
Aug 07 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
redis中lua脚本使用教程
Nov 01 Redis
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
国内咖啡文化
2021/03/03 咖啡文化
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
用Python实现一个简单的线程池
2015/04/07 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
运动会入场解说词300字
2014/01/25 职场文书
计算机系本科生求职信
2014/05/31 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
服务器间如何实现文件共享
2022/05/20 Servers
redis lua限流算法实现示例
2022/07/15 Redis