使用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如何一键部署脚本
Apr 12 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
使用RedisTemplat实现简单的分布式锁
Nov 20 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
js转换对象为xml
2017/02/17 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
Python新手实现2048小游戏
2015/03/31 Python
python中list常用操作实例详解
2015/06/03 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python中setuptools的作用是什么
2020/06/19 Python
Python 串口通信的实现
2020/09/29 Python
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
入团者的自我评价分享
2013/12/02 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
java调用Restful接口的三种方法
2021/08/23 Java/Android
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫