12.2_黑马Redis实战篇达人探店好友关注

2023-12-02 17:36

本文主要是介绍12.2_黑马Redis实战篇达人探店好友关注,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

实战篇03

thinking :提取公共部分为一个方法的快捷键?

thinking:redis中的ismember?

thinking:BooleanUtil.isTrue?

实战篇04

thinking:zscore的用法?

thinking:stream().map().collect?

thinking:引用静态方法?JAVA中的双冒号? 

thinking:StringUtils.join的用法?

thinking:StrUtil.join()?

实战篇05

实战篇06

thinking:在redis中求交集?  用inersect。

实战篇07

实战篇08

thinking:System.currentTimeMillis()?

​编辑 thinking:时间戳?​编辑

实战篇09

实战篇10

​编辑 thinking:JAVA中的long和int有什么区别?

thinking:为什么long类型的变量需要加上L?float类型的变量要加上F?


实战篇03

thinking :提取公共部分为一个方法的快捷键?

ctrl + alt + m

thinking:redis中的ismember?

redis五大集合之一(Set集合常用命令)_redis set ismember-CSDN博客

可以简化为:

thinking:BooleanUtil.isTrue?

hutool工具包快速入门_beanutil.fillbeanwithmap-CSDN博客

package com.hmdp.service.impl;import cn.hutool.core.util.BooleanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.entity.Blog;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Resourceprivate IUserService userService;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> records = page.getRecords();// 查询用户records.forEach(blog -> {this.queryBlogUser(blog);this.isBlockLiked(blog);});return Result.ok(records);}@Overridepublic Result queryBlogById(Long id) {//1. 查询blogBlog blog  =getById(id);if(blog == null){return Result.fail("笔记不存在!");}//2. 查询blog有关的用户queryBlogUser(blog);//3.查询blog是否被点赞isBlockLiked(blog);return Result.ok(blog);}private void isBlockLiked(Blog blog) {//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key ="blog:liked:"+blog.getId();Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());blog.setIsLike(BooleanUtil.isTrue(isMember));}@Overridepublic Result likeBlog(Long id) {//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key ="blog:liked:"+id;Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());if(BooleanUtil.isFalse(isMember)) {//3.如果未点赞,可以点赞//3.1数据库点赞数 +1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//3.2保存用户到Redis的set集合if (isSuccess) {stringRedisTemplate.opsForSet().add(key, userId.toString());}}else {//4如果已点赞,取消点赞//4.1数据库点赞数 -1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//4.2把用户从Redis的set集合移除if (isSuccess) {stringRedisTemplate.opsForSet().remove(key, userId.toString());}}return Result.ok();}private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}
}

实战篇04

thinking:zscore的用法?

Redis zrangebylex的使用 | Redis sorted_set不可不知的秘密_血煞长虹的博客-CSDN博客

thinking:stream().map().collect?

thinking:引用静态方法?JAVA中的双冒号? 

当时看黑马上下部的时候一直没有搞懂的内容之一。现在来恶补一下。

方法引用-02-引用静态方法_哔哩哔哩_bilibili

 

 

 

接着判断它是否符合以下三个要求

接着,我们来看看视频中的例子

Java中Long::valueOf是什么意思_long.valueof-CSDN博客

 有几篇讲JAVA双冒号的文章也挺好的,可以看看。

深入理解Java双冒号(::)运算符的使用(*)_java 双冒号_Firm陈的博客-CSDN博客

Java 中的双冒号“::”_java ::_JFS_Study的博客-CSDN博客  

 发现很多知识点当时很难理解,一段时间之后就突然开窍。

遂决定明年暑假前把JAVA基础篇再二刷一遍。

thinking:StringUtils.join的用法?

StringUtils.join的用法_stringutils.join用法-CSDN博客

thinking:StrUtil.join()?

Hutool Java开发工具包_strutil.join-CSDN博客

 Hutool,轻松玩转字符串操作, 都是案例,值得收藏!_hutool 字符串拼接-CSDN博客

package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Blog;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;import static com.hmdp.utils.RedisConstants.BLOG_LIKED_KEY;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Resourceprivate IUserService userService;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> records = page.getRecords();// 查询用户records.forEach(blog -> {this.queryBlogUser(blog);this.isBlockLiked(blog);});return Result.ok(records);}@Overridepublic Result queryBlogById(Long id) {//1. 查询blogBlog blog  =getById(id);if(blog == null){return Result.fail("笔记不存在!");}//2. 查询blog有关的用户queryBlogUser(blog);//3.查询blog是否被点赞isBlockLiked(blog);return Result.ok(blog);}private void isBlockLiked(Blog blog) {//1.获取登录用户UserDTO user = UserHolder.getUser();if(user == null){//用户未登录,无需查询是否点赞return;}//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key ="blog:liked:"+blog.getId();Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());blog.setIsLike(score != null);}@Overridepublic Result likeBlog(Long id) {//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key =BLOG_LIKED_KEY+id;Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());if(score == null) {//3.如果未点赞,可以点赞//3.1数据库点赞数 +1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//3.2保存用户到Redis的set集合if (isSuccess) {stringRedisTemplate.opsForZSet().add(key, userId.toString(),System.currentTimeMillis());}}else {//4如果已点赞,取消点赞//4.1数据库点赞数 -1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//4.2把用户从Redis的set集合移除if (isSuccess) {stringRedisTemplate.opsForZSet().remove(key, userId.toString());}}return Result.ok();}@Overridepublic Result queryBlogLikes(Long id) {String key =BLOG_LIKED_KEY + id;//1.查询top5的点赞用户 zrange key 0 4Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);if(top5 ==null || top5.isEmpty()){return  Result.ok(Collections.emptyList());}//2.解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//3.根据用户id查询用户List<UserDTO> userDTOS = userService.query().in("id",ids).last("ORDER BY FIELD(id,"+idStr + ")").list().stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());//4.返回return Result.ok(userDTOS);}private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}
}

实战篇05

package com.hmdp.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hmdp.dto.Result;
import com.hmdp.entity.Follow;
import com.hmdp.mapper.FollowMapper;
import com.hmdp.service.IFollowService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.UserHolder;
import org.springframework.stereotype.Service;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {@Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//1.判断到底是关注还是取关if(isFollow){//2.关注,新增数据Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);save(follow);}else{//3.取关,删除remove(new QueryWrapper<Follow>().eq("user_id",userId).eq("follow_user_id",followUserId));}return Result.ok();}@Overridepublic Result isFollow(Long followUserId) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.查询是否关注Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();return Result.ok(count > 0 );}
}

实战篇06

thinking:在redis中求交集?  用inersect。

package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Follow;
import com.hmdp.mapper.FollowMapper;
import com.hmdp.service.IFollowService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IUserService;
import com.hmdp.utils.CacheClient;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate IUserService userService;@Overridepublic 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){//把关注用户的id,放入redis的set集合stringRedisTemplate.opsForSet().add(key,followUserId.toString());}} else{//3.取关,删除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();}@Overridepublic Result isFollow(Long followUserId) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.查询是否关注Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();return Result.ok(count > 0 );}@Overridepublic 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);}
}

实战篇07

实战篇08

对于数据经常发生变化的,用sortset处理分页问题 

thinking:System.currentTimeMillis()?

System.currentTimeMillis()用法及其计算方式与时间的单位转换_Tan.]der的博客-CSDN博客

Java获取当前系统时间-CSDN博客

 thinking:时间戳?

 获取系统时间以及时间戳的理解与使用_系统时间戳-CSDN博客

package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Blog;
import com.hmdp.entity.Follow;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IFollowService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;import static com.hmdp.utils.RedisConstants.BLOG_LIKED_KEY;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Resourceprivate IUserService userService;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate IFollowService followService;@Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> records = page.getRecords();// 查询用户records.forEach(blog -> {this.queryBlogUser(blog);this.isBlockLiked(blog);});return Result.ok(records);}@Overridepublic Result queryBlogById(Long id) {//1. 查询blogBlog blog  =getById(id);if(blog == null){return Result.fail("笔记不存在!");}//2. 查询blog有关的用户queryBlogUser(blog);//3.查询blog是否被点赞isBlockLiked(blog);return Result.ok(blog);}private void isBlockLiked(Blog blog) {//1.获取登录用户UserDTO user = UserHolder.getUser();if(user == null){//用户未登录,无需查询是否点赞return;}//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key ="blog:liked:"+blog.getId();Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());blog.setIsLike(score != null);}@Overridepublic Result likeBlog(Long id) {//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key =BLOG_LIKED_KEY+id;Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());if(score == null) {//3.如果未点赞,可以点赞//3.1数据库点赞数 +1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//3.2保存用户到Redis的set集合if (isSuccess) {stringRedisTemplate.opsForZSet().add(key, userId.toString(),System.currentTimeMillis());}}else {//4如果已点赞,取消点赞//4.1数据库点赞数 -1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//4.2把用户从Redis的set集合移除if (isSuccess) {stringRedisTemplate.opsForZSet().remove(key, userId.toString());}}return Result.ok();}@Overridepublic Result queryBlogLikes(Long id) {String key =BLOG_LIKED_KEY + id;//1.查询top5的点赞用户 zrange key 0 4Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);if(top5 ==null || top5.isEmpty()){return  Result.ok(Collections.emptyList());}//2.解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//3.根据用户id查询用户List<UserDTO> userDTOS = userService.query().in("id",ids).last("ORDER BY FIELD(id,"+idStr + ")").list().stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());//4.返回return Result.ok(userDTOS);}@Overridepublic Result saveBlog(Blog blog) {//1 获取登录用户UserDTO user = UserHolder.getUser();blog.setUserId(user.getId());//2 保存探店笔记boolean isSuccess = save(blog);if (!isSuccess){return Result.fail("新增笔记失败!");}//3 查询笔记作者的所有粉丝List<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();//4 推送笔记id给所有粉丝for(Follow follow : follows){//4.1 获取粉丝idLong userId = follow.getUserId();//4.2推送String key = "feed:" + userId;stringRedisTemplate.opsForZSet().add(key,blog.getId().toString(),System.currentTimeMillis());}//5 返回idreturn Result.ok(blog.getId());}private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}
}

实战篇09

实战篇10

 thinking:JAVA中的long和int有什么区别?

 java long 区别_java中long和int的区别-CSDN博客

thinking:为什么long类型的变量需要加上L?float类型的变量要加上F?

运算符-04-05-隐式转换和强制转换_哔哩哔哩_bilibili

意思就是说:30本身是int类型,可是你现在想要它变成long类型。

而JAVA中的隐形转化,会自动将int类型转化未long类型。

因此,JAVA把你想做的事情帮你做了。因此,long num1 = 30 才可以成立

而1111111111111111111超过了int的取值范围,就已经出bug了。无法再帮你转long类型了

而double的取值范围最大,就无法自动转化了。得自己手动转化才可以。 

为什么定义long类型跟float类型的变量时要加L和F_java中long类型为什么要加l_Cristo_Li的博客-CSDN博客

【Java】double|float 区别_java float和double-CSDN博客

 

listByIds 无法保证在数据库中按照一定的顺序进行查找,因此要用自定义sql语句才可以完成这个操作。

package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.dto.ScrollResult;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Blog;
import com.hmdp.entity.Follow;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IFollowService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;import static com.hmdp.utils.RedisConstants.BLOG_LIKED_KEY;
import static com.hmdp.utils.RedisConstants.FEED_KEY;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Resourceprivate IUserService userService;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate IFollowService followService;@Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> records = page.getRecords();// 查询用户records.forEach(blog -> {this.queryBlogUser(blog);this.isBlockLiked(blog);});return Result.ok(records);}@Overridepublic Result queryBlogById(Long id) {//1. 查询blogBlog blog  =getById(id);if(blog == null){return Result.fail("笔记不存在!");}//2. 查询blog有关的用户queryBlogUser(blog);//3.查询blog是否被点赞isBlockLiked(blog);return Result.ok(blog);}private void isBlockLiked(Blog blog) {//1.获取登录用户UserDTO user = UserHolder.getUser();if(user == null){//用户未登录,无需查询是否点赞return;}//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key ="blog:liked:"+blog.getId();Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());blog.setIsLike(score != null);}@Overridepublic Result likeBlog(Long id) {//1.判断当前登录用户Long userId = UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞String key =BLOG_LIKED_KEY+id;Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());if(score == null) {//3.如果未点赞,可以点赞//3.1数据库点赞数 +1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//3.2保存用户到Redis的set集合if (isSuccess) {stringRedisTemplate.opsForZSet().add(key, userId.toString(),System.currentTimeMillis());}}else {//4如果已点赞,取消点赞//4.1数据库点赞数 -1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//4.2把用户从Redis的set集合移除if (isSuccess) {stringRedisTemplate.opsForZSet().remove(key, userId.toString());}}return Result.ok();}@Overridepublic Result queryBlogLikes(Long id) {String key =BLOG_LIKED_KEY + id;//1.查询top5的点赞用户 zrange key 0 4Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);if(top5 ==null || top5.isEmpty()){return  Result.ok(Collections.emptyList());}//2.解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//3.根据用户id查询用户List<UserDTO> userDTOS = userService.query().in("id",ids).last("ORDER BY FIELD(id,"+idStr + ")").list().stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());//4.返回return Result.ok(userDTOS);}@Overridepublic Result saveBlog(Blog blog) {//1 获取登录用户UserDTO user = UserHolder.getUser();blog.setUserId(user.getId());//2 保存探店笔记boolean isSuccess = save(blog);if (!isSuccess){return Result.fail("新增笔记失败!");}//3 查询笔记作者的所有粉丝List<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();//4 推送笔记id给所有粉丝for(Follow follow : follows){//4.1 获取粉丝idLong userId = follow.getUserId();//4.2推送String key = "feed:" + userId;stringRedisTemplate.opsForZSet().add(key,blog.getId().toString(),System.currentTimeMillis());}//5 返回idreturn Result.ok(blog.getId());}@Overridepublic Result queryBlogOfFollow(Long max, Integer offset) {//1.获取当前用户Long userId = UserHolder.getUser().getId();//2.查询收件箱String key = FEED_KEY + userId;Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);//3.非空判断if(typedTuples == null || typedTuples.isEmpty()){return Result.ok();}//4.解析数据 :blogId minTime(时间戳) offsetList<Long> ids =new ArrayList<>(typedTuples.size());long minTime =0;int os = 1;for(ZSetOperations.TypedTuple<String> tuple : typedTuples){//4.1 获取idids.add(Long.valueOf(tuple.getValue()));//4.2 获取分数(时间戳)long time = tuple.getScore().longValue();if(time == minTime){os++;}else{minTime = time ;os = 1 ;}}//5.根据id查询blogString idStr = StrUtil.join(",",ids);List<Blog> blogs = query().in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list();for (Blog blog : blogs) {//5.1 查询blog有关的用户queryBlogUser(blog);//5.2 查询blog是否被点赞isBlockLiked(blog);}//6 封装并返回ScrollResult r = new ScrollResult();r.setList(blogs);r.setOffset(os);r.setMinTime(minTime);return Result.ok(r);}private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}
}

这篇关于12.2_黑马Redis实战篇达人探店好友关注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446213

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

Redis的rehash机制

在Redis中,键值对(Key-Value Pair)存储方式是由字典(Dict)保存的,而字典底层是通过哈希表来实现的。通过哈希表中的节点保存字典中的键值对。我们知道当HashMap中由于Hash冲突(负载因子)超过某个阈值时,出于链表性能的考虑,会进行Resize的操作。Redis也一样。 在redis的具体实现中,使用了一种叫做渐进式哈希(rehashing)的机制来提高字典的缩放效率,避

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

【C++ Primer Plus习题】12.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "String.h"using namespace std;int main(){String s1(" and I am a

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这

Redis-主从集群

主从架构 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 全量同步 主从第一次建立连接时,会执行全量同步,将master节点的所有数据都拷贝给slave节点,流程: 判断是否是第一次同步,如果是,返回版本信息(replication id 和offset),将salve节点的版本信息变为master的

Redis安装使用总结

一、下载安装 从 github 下载:https://github.com/MSOpenTech/redis/releases 或者 https://github.com/ServiceStack/redis-windows 解压缩,如图: 二、配置 打开redis.windows-sevice.conf文件, 2.1 绑定ip:搜索127.0.0.1 ,发现bind 127.0.0.