使用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
Redis实现订单自动过期功能的示例代码
May 08 Redis
redis三种高可用方式部署的实现
May 11 Redis
解析Redis Cluster原理
Jun 21 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
Redis集群的关闭与重启操作
Jul 07 Redis
缓存替换策略及应用(以Redis、InnoDB为例)
Jul 25 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 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 八种基本的数据类型小结
2011/06/01 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
Javascript模块模式分析
2008/05/16 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python django model联合主键的例子
2019/08/06 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
详解python的变量缓存机制
2021/01/24 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
学校经典推荐信
2013/10/30 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
积极分子思想汇报
2014/01/04 职场文书
财务会计自荐信范文
2014/02/21 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
目标责任书范本
2014/04/16 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
场地使用证明模板
2014/10/25 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书