SpringMVC使用注解开发及常见错误的解决

python基础篇(二十五)——总结

  返回  

基于Redis实现关注和粉丝列表分析

2021/8/21 16:44:02 浏览:

基于Redis实现关注和粉丝列表分析

1、定义相关的关注逻辑、我的关注列表、我的粉丝列表

package com.example.service;

import com.example.entity.User;
import com.example.utils.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Auther: 长颈鹿
 * @Date: 2021/08/21/14:24
 * @Description: 关注和粉丝接口
 */
@Service
public class FollowerService {

    @Autowired
    private RedisTemplate redisTemplate;

    // 关注列表
    public static final String FOLLOWEE_SET_KEY = "followee:user:";
    // 粉丝列表
    public static final String FOLLOWER_SET_KEY = "follower:user:";


    /**
     * 关羽 = 2 关注刘备 = 1
     * 张飞 = 3 关注刘备 = 1
     * userId = 2 == followId = 1
     *
     * @param userId = 关羽
     * @param followId = 张飞
     */
    public void follow(Integer userId, Integer followId) {
        // 获取redis的集合对象
        SetOperations<String, Integer> setOperations = redisTemplate.opsForSet();
        // 在刘备的粉丝集合列表中,把关羽和张飞加入到你的集合中
        setOperations.add(FOLLOWER_SET_KEY + followId, userId);
        // 关羽的和张飞关注集合列表中,增加刘备的信息
        setOperations.add(FOLLOWEE_SET_KEY + userId, followId);
    }


    /**
     * 查询我的关注
     *
     * @param userId = 关羽
     */
    public List<User> listMyFollowee(Integer userId) throws IllegalAccessException {
        // 获取redis的集合对象
        SetOperations<String, Integer> setOperations = redisTemplate.opsForSet();
        // 通过members方法,将关注列表的信息查询出来
        Set<Integer> members = setOperations.members(FOLLOWEE_SET_KEY + userId);
        return getUserInfos(members);
    }

    /**
     * 我的粉丝列表
     *
     * @param userId =关羽
     */
    public List<User> listMyFollower(Integer userId) throws IllegalAccessException {
        // 获取redis的集合对象
        SetOperations<String, Integer> setOperations = redisTemplate.opsForSet();
        // 通过members方法,将关注列表的信息查询出来
        Set<Integer> members = setOperations.members(FOLLOWER_SET_KEY + userId);
        return getUserInfos(members);
    }

    /**
     * 把集合和前面的hash集合起来
     *
     * @param userInfos
     * @return
     */
    private List<User> getUserInfos(Set<Integer> userInfos) throws IllegalAccessException {
        // 创建用户集合
        List<User> userList = new ArrayList<>();
        // 从hash中获取属性
        List<String> hasKeys = new ArrayList<>();
        hasKeys.add("id");//list.get(0)
        hasKeys.add("nickname");//list.get(1)
        hasKeys.add("password");//list.get(2)
        hasKeys.add("sex");//list.get(3)

        // 定义一个hash数据操作对象
        HashOperations opsForHash = this.redisTemplate.opsForHash();
        // 循环关注列表的用户ID信息
        for (Integer userId : userInfos) {
            // 获取用户在hash中的注册完整信息对应的key
            String hKey = "reg:user:hash:" + userId;
            // 把"reg:user:hash:1" 的信息从hash数据结构中获取获取,获取id,nickname,password,sex
            List<Object> list = opsForHash.multiGet(hKey, hasKeys);
            // 如果在缓存中没有找到对应的用户信息
            if (list.get(0) == null && list.get(1) == null) {
                // 从数据库中根据用户id去查询
                User user = this.getUserDbCache(userId);
                userList.add(user);
            } else {
                User user = new User();
                user.setId(Integer.valueOf(list.get(0).toString()));
                user.setNickname(list.get(1).toString());
                user.setPassword(list.get(2).toString());
                user.setSex(Integer.parseInt(list.get(3).toString()));
                userList.add(user);
            }
        }
        return userList;
    }


    /**
     * 从数据库去获取用户信息,并且把获取的用户新放入缓存HASH数据结构中
     *
     * @param userId
     * @return
     * @throws IllegalAccessException
     */
    public User getUserDbCache(Integer userId) throws IllegalAccessException {
        // 查询最新的用户信息放入到redis的hash中
//        User user = this.getOne(userId);
//        Map<String, Object> map = ObjectUtils.objectToMap(user);
//        // 准备用存入的key,将用户信息存入到redis的hash中
//        String key = "reg:user:" + user.getId();
//        redisTemplate.opsForHash().putAll(key, map);
//        // 设置key的失效时间一个月
//        redisTemplate.expire(key, 30, TimeUnit.DAYS);
//        return user;
        return null;
    }

}

2、定于controller进行测试

package com.example.controller;

import com.example.entity.User;
import com.example.service.FollowerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Auther: 长颈鹿
 * @Date: 2021/08/21/14:33
 * @Description: 关注和粉丝测试
 */
@RestController
public class FollowerController {

    @Autowired
    private FollowerService followerService;


    /**
     * 关羽 = 2 关注刘备 = 1
     * 张飞 = 3 关注刘备 = 1
     * userId = 1 == followId = 1
     *
     * @param userId = 关羽
     * @param followId = 张飞
     */
    @PostMapping("/user/follow")
    public String follow(Integer userId, Integer followId) {
        followerService.follow(userId, followId);
        return "用户:" + userId + "关注:" + followId + "成功!";
    }


    /**
     * 查询我的关注
     *
     * @param userId =关羽
     */
    @PostMapping("/user/followee")
    public List<User> listMyFollowee(Integer userId) throws IllegalAccessException {
        return followerService.listMyFollowee(userId);
    }

    /**
     * 我的粉丝列表
     *
     * @param userId =关羽
     */
    @PostMapping("/user/fansList")
    public List<User> listMyFollower(Integer userId) throws IllegalAccessException {
        return followerService.listMyFollower(userId);
    }

}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号