微服务Spring Boot 整合 Redis 实现 好友关注_redis实现关注功能

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    文章目录

    ⛅引言

    本博文参考 黑马 程序员B站 Redis课程系列

    在点评项目中有这样的需求如何实现笔记的好友关注、以及发布笔记后推送消息功能

    使用Redis 的 好友关注、以及发布笔记后推送消息功能

    一、Redis 实现好友关注 – 关注与取消关注

    需求针对用户的操作可以对用户进行关注和取消关注功能。

    在探店图文的详情页面中可以关注发布笔记的作者

    在这里插入图片描述

    具体实现思路基于该表数据结构实现2个接口

    • 关注和取关接口
    • 判断是否关注的接口

    关注是用户之间的关系是博主与粉丝的关系数据表如下

    tb_follow

    CREATE TABLE `tb_follow` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
      `follow_user_id` bigint(20) unsigned NOT NULL COMMENT '关联的用户id',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;
    

    id为自增长简化开发

    核心代码

    FollowController

    //关注
    @PutMapping("/{id}/{isFollow}")
    public Result follow(@PathVariable("id") Long followUserId, @PathVariable("isFollow") Boolean isFollow) {
        return followService.follow(followUserId, isFollow);
    }
    //取消关注
    @GetMapping("/or/not/{id}")
    public Result isFollow(@PathVariable("id") Long followUserId) {
        return followService.isFollow(followUserId);
    }
    

    FollowService

    @Override
    public Result follow(Long followUserId, Boolean isFollow) {
        // 1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        String key = "follows:" + userId;
        // 1.判断到底是关注还是取关
        if (isFollow) {
            // 2.关注新增数据
            Follow follow = new Follow();
            follow.setUserId(userId);
            follow.setFollowUserId(followUserId);
            boolean isSuccess = save(follow);
            if (isSuccess) {
                stringRedisTemplate.opsForSet().add(key, followUserId.toString());
            }
        } else {
            // 3.取关删除 delete from tb_follow where user_id = ? and follow_user_id = ?
            boolean isSuccess = remove(new QueryWrapper<Follow>()
                                       .eq("user_id", userId).eq("follow_user_id", followUserId));
            if (isSuccess) {
                // 把关注用户的id从Redis集合中移除
                stringRedisTemplate.opsForSet().remove(key, followUserId.toString());
            }
        }
        return Result.ok();
    }
    
    @Override
    public Result isFollow(Long followUserId) {
        // 1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        // 2.查询是否关注 select count(*) from tb_follow where user_id = ? and follow_user_id = ?
        Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();
        // 3.判断
        return Result.ok(count > 0);
    }
    

    代码编写完毕进行测试

    代码测试

    点击进行关注用户

    在这里插入图片描述

    关注成功

    取消关注

    在这里插入图片描述

    测试成功

    二、Redis 实现好友关注 – 共同关注功能

    实现共同关注好友功能首先需要进入博主发布的指定笔记页然后点击博主的头像去查看详细信息

    在这里插入图片描述

    核心代码如下

    UserController

    // UserController 根据id查询用户
    @GetMapping("/{id}")
    public Result queryUserById(@PathVariable("id") Long userId){
        // 查询详情
        User user = userService.getById(userId);
        if (user == null) {
            return Result.ok();
        }
        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        // 返回
        return Result.ok(userDTO);
    }
    

    BlogController

    @GetMapping("/of/user")
    public Result queryBlogByUserId(
        @RequestParam(value = "current", defaultValue = "1") Integer current,
        @RequestParam("id") Long id) {
        // 根据用户查询
        Page<Blog> page = blogService.query()
            .eq("user_id", id).page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
        // 获取当前页数据
        List<Blog> records = page.getRecords();
        return Result.ok(records);
    }
    

    那么如何实现共同好友关注功能呢

    需求利用Redis中的数据结构实现共同关注功能。 在博主个人页面展示出当前用户与博主的共同关注

    思路分析 使用Redis的Set集合实现我们把两人关注的人分别放入到一个Set集合中然后再通过API去查看两个Set集合中的交集数据

    在这里插入图片描述

    改造核心代码

    当用户关注某位用户后需要将数据存入Redis集合中方便后续进行共同关注的实现同时取消关注时需要删除Redis中的集合

    FlowServiceImpl

    @Override
    public Result follow(Long followUserId, Boolean isFollow) {
        // 1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        String key = "follows:" + userId;
        // 1.判断到底是关注还是取关
        if (isFollow) {
            // 2.关注新增数据
            Follow follow = new Follow();
            follow.setUserId(userId);
            follow.setFollowUserId(followUserId);
            boolean isSuccess = save(follow);
            if (isSuccess) {
                stringRedisTemplate.opsForSet().add(key, followUserId.toString());
            }
        } else {
            // 3.取关删除 delete from tb_follow where user_id = ? and follow_user_id = ?
            boolean isSuccess = remove(new QueryWrapper<Follow>()
                                       .eq("user_id", userId).eq("follow_user_id", followUserId));
            if (isSuccess) {
                // 把关注用户的id从Redis集合中移除
                stringRedisTemplate.opsForSet().remove(key, followUserId.toString());
            }
        }
        return Result.ok();
    }
    
    // 具体获取好友共同关注代码
    
    @Override
    public Result followCommons(Long id) {
        // 1.获取当前用户
        Long userId = UserHolder.getUser().getId();
        String key = "follows:" + userId;
        // 2.求交集
        String key2 = "follows:" + id;
        Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key, key2);
        if (intersect == null || intersect.isEmpty()) {
            // 无交集
            return Result.ok(Collections.emptyList());
        }
        // 3.解析id集合
        List<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());
        // 4.查询用户
        List<UserDTO> users = userService.listByIds(ids)
            .stream()
            .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
            .collect(Collectors.toList());
        return Result.ok(users);
    }
    

    进行测试

    在这里插入图片描述

    ⛵小结

    以上就是【Bug 终结者】对 微服务Spring Boot 整合 Redis 实现 好友关注 的简单介绍Redis 实现好友关注功能也是 利用Set集合、ZSet集合实现这样一个需求同时采用Redis来实现更加的快速减少系统的消耗更加快速的实现数据展示 下篇博文我们继续 关注 如何 使用Redis 实现推送消息到粉丝收件箱以及滚动分页查询

    如果这篇【文章】有帮助到你希望可以给【Bug 终结者】点个赞👍创作不易如果有对【后端技术】、【前端领域】感兴趣的小可爱也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️我将会给你带来巨大的【收获与惊喜】💝💝💝

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: Springredis