使用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 14 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
详解Redis瘦身指南
May 26 Redis
解析高可用Redis服务架构分析与搭建方案
Jun 20 Redis
Redis缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
解决 redis 无法远程连接
May 15 Redis
Redis实现短信验证码登录的示例代码
Jun 14 Redis
利用Redis实现点赞功能的示例代码
Jun 28 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
js实现全选和全不选
2020/07/28 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
python mock测试的示例
2020/10/19 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
个人简历的自荐信
2013/10/23 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
绩效工资分配方案
2014/01/18 职场文书
大学生校园创业计划书
2014/02/08 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
喝酒检查书范文
2014/02/23 职场文书
毕业晚会主持词
2014/03/24 职场文书
工会工作先进事迹
2014/08/18 职场文书
红楼梦读书笔记
2015/06/25 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书