功能: 粉丝关注列表,以及关注和未关注的情况去根据redis中查询:

    为什么用redis:

    1.关注量太大了;一直操作数据库的话性能不太好用

    2.redis速度快

    3.都是key value的形式

    有哪些redis的数据结构呢
    String 就是字符串
    hashmap map集合,可以在value里再存一个map,嵌套使用
    ZSET 有序的 集合(score 得分)可以排序 不允许重复
    SET 无序的集合,不允许
    LIST 有序的集合,可以重复(模拟队列,比如说从左侧或则右侧添加插入数据)

    如何使用redis
    1.在redis软件上的使用:
    image.png
    image.png
    image.png
    项目中的需求:
    image.png
    image.png
    image.png

    使用:1.打开redis
    2.引入依赖
    3.配置连接参数
    4.引入对应的redis的操作对象:
    image.png
    redis在项目中的代码:

    package com.heima.user.service.impl;
    import com.heima.common.constants.user.UserRelationConstants;
    import com.heima.common.exception.CustException;
    import com.heima.model.common.dtos.ResponseResult;
    import com.heima.model.common.enums.AppHttpCodeEnum;
    import com.heima.model.threadlocal.AppThreadLocalUtils;
    import com.heima.model.user.dtos.UserRelationDTO;
    import com.heima.model.user.pojos.ApUser;
    import com.heima.user.service.ApUserRelationService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    @Service
    public class ApUserRelationServiceImpl implements ApUserRelationService {
    注入对象
    @Autowired
    StringRedisTemplate redisTemplate;
    @Override
    public ResponseResult follow(UserRelationDTO dto) {
    // 1. 校验参数 authorApUserId 必须登录 operation 0 1
    if(dto.getAuthorApUserId() == null){
    CustException.cust(AppHttpCodeEnum.PARAM_INVALID,”作者对应的userId不存在”);
    }
    Short operation = dto.getOperation();
    if(operation == null || (operation.intValue()!=0 && operation.intValue()!=1)){
    CustException.cust(AppHttpCodeEnum.PARAM_INVALID,”关注类型错误”);
    }
    ApUser user = AppThreadLocalUtils.getUser();
    if(user == null){
    CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
    }
    Integer loginId = user.getId();
    Integer followId = dto.getAuthorApUserId();
    // 判断 自己不可以关注自己
    if(loginId.equals(followId)){
    CustException.cust(AppHttpCodeEnum.DATA_NOT_ALLOW,”不可以自己关注自己哦~”);
    }
    // 校验之前有没有关注过 zscore
    // 参数1: key 参数2: 要查询集合元素
    找到操作对象:
    Double score = redisTemplate.opsForZSet()
    .score(UserRelationConstants.FOLLOW_LIST + loginId, String.valueOf(followId));
    if(operation.intValue() == 0&&score!=null){
    CustException.cust(AppHttpCodeEnum.DATA_EXIST,”您已关注,请勿重复关注”);
    }
    try {
    // 2. 判断operation 是0 是1
    if(operation.intValue() == 0){
    // 没有关注过 zadd follow:我的id 作者id
    // 参数1: key 参数2 集合元素 参数3: score
    redisTemplate.opsForZSet().add(UserRelationConstants.FOLLOW_LIST + loginId,String.valueOf(followId),System.currentTimeMillis());
    // zadd fans:作者id 我的id
    redisTemplate.opsForZSet().add(UserRelationConstants.FANS_LIST + followId,String.valueOf(loginId),System.currentTimeMillis());
    }else {
    // 2.2 是1 取关
    // zrem follow:我的id 作者id
    redisTemplate.opsForZSet().remove(UserRelationConstants.FOLLOW_LIST + loginId,String.valueOf(followId));
    // zrem fans:作者id 我的id
    redisTemplate.opsForZSet().remove(UserRelationConstants.FANS_LIST + followId,String.valueOf(loginId));
    }
    }catch (Exception e){
    e.printStackTrace();
    CustException.cust(AppHttpCodeEnum.SERVER_ERROR);
    }
    return ResponseResult.okResult();
    }
    }