使用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高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
redis requires ruby version2.2.2的解决方案
Jul 15 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis keys命令的具体使用
Jun 05 Redis
利用Redis实现点赞功能的示例代码
Jun 28 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
利用python进行文件操作
2020/12/04 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
创建文明学校实施方案
2014/03/11 职场文书
媒体宣传策划方案
2014/05/25 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
golang为什么要统一错误处理
2022/04/03 Golang