使用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 限制内存使用大小的实现
May 08 Redis
基于Redis过期事件实现订单超时取消
May 08 Redis
详解Redis主从复制实践
May 19 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Redis缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
Redis命令处理过程源码解析
Feb 12 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
PHP单例模式详细介绍
2015/07/01 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
js实现随机抽奖
2020/03/19 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Python接口自动化测试的实现
2020/08/28 Python
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
大型营销活动计划书
2014/04/28 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
2014个人年度工作总结
2014/12/15 职场文书
普通员工辞职信范文
2015/05/12 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python