使用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
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
Redis缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis 限流器
May 15 Redis
Redis特殊数据类型bitmap位图
Jun 01 Redis
Redis集群节点通信过程/原理流程分析
redis数据一致性的实现示例
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 #Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
You might like
php字符串截取问题
2006/11/28 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
js自定义事件代码说明
2011/01/31 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
node.js require() 源码解读
2015/12/13 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python制作简单五子棋游戏
2019/06/18 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
校园运动会广播稿
2015/08/19 职场文书