使用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 查看所有的key方式
May 07 Redis
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
Redis Stream类型的使用详解
Nov 11 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis高并发缓存架构性能优化
May 15 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
PHP 简单日历实现代码
2009/10/28 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php输出xml属性的方法
2015/03/19 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
python实现简单多人聊天室
2018/12/11 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
《蒲公英》教学反思
2014/02/28 职场文书
工作鉴定评语
2014/05/04 职场文书
银行进社区活动总结
2014/07/07 职场文书
给校长的一封检讨书
2014/09/20 职场文书
工作失职检讨书500字
2014/10/17 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
交通事故调解协议书
2015/05/20 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
python实现网络五子棋
2021/04/11 Python
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
golang 语言中错误处理机制
2021/08/30 Golang
python编程实现清理微信重复缓存文件
2021/11/01 Python
win10更新失败无限重启解决方法
2022/04/19 数码科技