业务实现层:
@Override public ResultData<RelationshipUsersAndFansDto> getRelationshipUsersAndFans(String userId, String followId) { List<B8UserUserinfoEntity> myself = userinfoMapper.getRelationshipUsersAndFans(userId); List<String> myselfIds = myself.stream().map(B8UserUserinfoEntity::getFollowId).collect(Collectors.toList()); for (String myselfId : myselfIds) { //我关注的人的id集合 redisService.redisTemplate.opsForSet().add("myselfFollowUsers",myselfId); } //进入大V主页他关注的人的id集合 List<B8UserUserinfoEntity> bigV = userinfoMapper.getRelationshipUsersAndFans(followId); List<String> bigvIds = bigV.stream().map(B8UserUserinfoEntity::getFollowId).collect(Collectors.toList()); for (String bigvId : bigvIds) { //把我们二个关注的人丢到集合中 redisService.redisTemplate.opsForSet().add("bigvFollowUsers",bigvId); } //获取我们共同关注的人id集合 Set intersectSet = redisService.redisTemplate.opsForSet().intersect("myselfFollowUsers", "bigvFollowUsers"); List<String> intersectList = new ArrayList<>(intersectSet); //共同关注的数量 int intersectSize = intersectList.size(); //我关注的人也关注这个大V,但是大V没有关注他,取差集 Set differenceSet = redisService.redisTemplate.opsForSet().difference("myselfFollowUsers", "bigvFollowUsers"); List<String> differenceList = new ArrayList<>(differenceSet); //差集的数量 int differenceSize = differenceList.size(); //封装 RelationshipUsersAndFansDto relationshipUsersAndFansDto = new RelationshipUsersAndFansDto(); if(!CollectionUtils.isEmpty(intersectList)){ //获取共同关注的用户信息 List<B8UserUserinfoEntity> myselfList = userinfoMapper.getUserByIds(intersectList); relationshipUsersAndFansDto.setMyself(myselfList); } if(!CollectionUtils.isEmpty(differenceList)){ //获取我关注的人也关注他的用户信息 List<B8UserUserinfoEntity> bigvList = userinfoMapper.getUserByIds(differenceList); relationshipUsersAndFansDto.setBigV(bigvList); } relationshipUsersAndFansDto.setIntersectSize(intersectSize); relationshipUsersAndFansDto.setDifferenceSize(differenceSize); return ResultData.success(relationshipUsersAndFansDto); }
redisService:
import lombok.extern.slf4j.Slf4j; 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.ValueOperations; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * spring redis 工具类 **/ @SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component @Slf4j public class RedisService { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 */ public <T> void setCacheObject(final String key, final T value) { redisTemplate.opsForValue().set(key, value); } /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeUnit 时间颗粒度 */ public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } /** * 获得缓存的基本对象。 * * @param key 缓存键值 * @return 缓存键值对应的数据 */ public <T> T getCacheObject(final String key) { ValueOperations<String, T> operation = redisTemplate.opsForValue(); return operation.get(key); } /** * 删除单个对象 * * @param key */ public boolean deleteObject(final String key) { return redisTemplate.delete(key); } /** * 删除集合对象 * * @param collection 多个对象 * @return */ public long deleteObject(final Collection collection) { return redisTemplate.delete(collection); } /** * 缓存List数据 * * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @return 缓存的对象 */ public <T> long setCacheList(final String key, final List<T> dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } /** * 获得缓存的list对象 * * @param key 缓存的键值 * @return 缓存键值对应的数据 */ public <T> List<T> getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); } /** * 缓存Set * * @param key 缓存键值 * @param dataSet 缓存的数据 * @return 缓存数据的对象 */ public <T> long setCacheSet(final String key, final Set<T> dataSet) { Long count = redisTemplate.opsForSet().add(key, dataSet); return count == null ? 0 : count; } /** * 获得缓存的set * * @param key * @return */ public <T> Set<T> getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); } /** * 缓存Map * * @param key * @param dataMap */ public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } } /** * 获得缓存的Map * * @param key * @return */ public <T> Map<String, T> getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * * @param key Redis键 * @param hKey Hash键 * @param value 值 */ public <T> void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 获取Hash中的数据 * * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ public <T> T getCacheMapValue(final String key, final String hKey) { HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } /** * 获取多个Hash中的数据 * * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * 获得缓存的基本对象列表 * * @param pattern 字符串前缀 * @return 对象列表 */ public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); } /** * 向一张hash表中放入数据,如果不存在将创建 * * @param key 键 * @param item 项 * @param value 值 * @return true 成功 false失败 */ public Boolean hset(String key, String item, Object value) { try { redisTemplate.opsForHash().put(key, item, value); return true; } catch (Exception e) { log.error(e.getMessage(), e); return false; } } /** * HashGet * * @param key 键 不能为 null * @param item 项 不能为 null * @return 值 */ public Object hget(String key, String item) { return redisTemplate.opsForHash().get(key, item); } /** * 删除hash表中的值 * * @param key 键 不能为 null * @param item 项 可以使多个不能为 null */ public void hdel(String key, Object... item) { redisTemplate.opsForHash().delete(key, item); } /** * 判断 key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public Boolean hasKey(String key) { try { return redisTemplate.hasKey(key); } catch (Exception e) { log.error(e.getMessage(), e); return false; } } }