当前位置: 首页 > news >正文

万网域名管理登录网站优化是做什么的

万网域名管理登录,网站优化是做什么的,wordpress导航 插件,哪个网站做售楼推广好学习目标: 提示:学习如何利用Redisson实现点赞排行榜功能,按照时间顺序 当用户给某一篇文章点赞后,会再数据库中存储一条数据,并且在Redis中存储一条数据为当前博客的点赞用户标识,来区分哪个用户对文章进…

学习目标:

提示:学习如何利用Redisson实现点赞排行榜功能,按照时间顺序
当用户给某一篇文章点赞后,会再数据库中存储一条数据,并且在Redis中存储一条数据为当前博客的点赞用户标识,来区分哪个用户对文章进行了点赞,使用ZSet数据结构对点赞用户进行排序来实现排行榜功能


学习产出:

解决方案:

  1. 点赞后的用户记录在Redis的set数据类型中

1. 准备pom环境

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>5.1.47</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.1</version></dependency>

2. 配置ThreadLocal和过滤器

public class UserHolder {private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate StringRedisTemplate redis;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/code","/user/login","/blog/hot","/shop/**","/shop-type/**","/voucher/**").order(2);registry.addInterceptor(new RefreshTokenInterceptor(redis)).addPathPatterns("/**").order(1);}
}
---------------------------------------------
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {//controller执行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判断是否需要拦截ThreadLocalif (UserHolder.getUser()==null) {response.setStatus(401);return false;}//7.放行return true;}//渲染后返回给前台数据前@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户,避免内存泄露UserHolder.removeUser();}
}
---------------------------------------------------
@Slf4j
public class RefreshTokenInterceptor implements HandlerInterceptor {//这个对象不是由spring管理的所以不能用注解自动注入private StringRedisTemplate redis;public RefreshTokenInterceptor(StringRedisTemplate redis) {this.redis = redis;}//controller执行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}//2.基于token获取redis中的用户//通过key取到hash中的map集合数据Map<Object, Object> userMap = redis.opsForHash().entries("login:token:" + token);//3.判断用户是否存在if (userMap.isEmpty()) {return true;}//5.将查询到的hash数据转为userDto对象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用户信息到ThreadLocal中UserHolder.saveUser(userDTO);//7.刷新token有效期redis.expire(LOGIN_USER_KEY + token, 30, TimeUnit.MINUTES);log.info("我是第一个拦截器当前拦截所有请求的用户为,线程为{},{}",UserHolder.getUser(),Thread.currentThread());//8.放行return true;}

3. Controller层:负责接收请求和向下分配

@RestController
@RequestMapping("/blog")
public class BlogController{@Resourceprivate IBlogService blogService;@PutMapping("/like/{id}")public Result likeBlog(@PathVariable("id") Long id) {return blogService.likeBlog(id);}
}

4. Service层:负责业务的处理逻辑点赞功能,将文章的点赞用户以时间戳为分数存入Redis

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Autowiredprivate IUserService userService;@Resourceprivate StringRedisTemplate redis;@Overridepublic Result likeBlog(Long id) {//1.获取登录用户Long userId = UserHolder.getUser().getId();//2.判断当前用户是否已经点赞String key = "blog:liked:" + id;//获取当前登录用户的分数,若文章中的用户id分数为null说明未点赞Double score = redis.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集合中,文章set集合中记录的是点赞用户的id,//分数是时间戳,可以进行排序if (isSuccess) {//存入Redis的分数值以当前时间戳存入redis.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) {redis.opsForZSet().remove(key, userId.toString());}}return null;}
}

5. 上述为下面的排行榜做铺垫
查询当前文章的点赞排行榜,id是文章id号

	@PutMapping("/likes/{id}")public Result likesBlog(@PathVariable("id") Long id) {return blogService.queryBlogLikes(id);}
@Overridepublic Result queryBlogLikes(Long id) {String key="blog:liked:" + id;//取出前五条数据Set<String> rangeData = redis.opsForZSet().range(key, 0, 4);if (rangeData==null) {return Result.ok(Collections.emptyList());}//将文章点赞的前五条用户id转换为Long类型List<Long> ids = rangeData.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//去数据库把这些用户查询出来,并且数据脱敏返回给前端List<User> users = userService.query().in("id",ids).last("order by field(id,"+idStr+")").list();UserDTO userData = BeanUtil.copyProperties(users, UserDTO.class);return Result.ok(userData);}
http://www.khdw.cn/news/47693.html

相关文章:

  • bs应用网站开发如何给公司做网络推广
  • 织梦怎么查看网站点击常州seo招聘
  • 3d网页游戏排行windows优化大师官方网站
  • 安阳做网站哪家好做seo的公司
  • 中国最大的外包公司有哪些网络推广优化
  • 有趣的网站小游戏网址以网红引流促业态提升
  • 益阳 网站制作维护世界新闻
  • 徐州做网站的公司有哪些html网页制作步骤
  • 衡水哪有建网站的吗seo常见优化技术
  • 每天4元代发广告重庆seo主管
  • 福建微网站建设seo有些什么关键词
  • asp网站开发的实训报告品牌型网站设计推荐
  • 河北省建设工程教育网站百度seo泛解析代发排名
  • 外贸公司网站模板免费关键词指数查询工具
  • 做设计到哪个网站赚钱最近新闻头条
  • 江苏艺居建设有限公司网站营销活动
  • 龙华三网合一网站建设餐饮营销策划方案
  • 南京网站建设网站制作怎么建立自己的网站
  • 化工企业商城网站建设公司网络营销的应用研究论文
  • 宝安做网站公司哈尔滨关键词优化报价
  • 网页美工设计教学郑州网站关键词优化公司哪家好
  • 白酒进货渠道网seo排名优化软件有用
  • 佛山网站建设外包公司网络营销推广方案有哪些
  • html5优秀企业网站网站查询器
  • 广州网页制作设计营销seo图片优化
  • 传奇私服网站怎么做每日关键词搜索排行
  • html导航栏模板推推蛙seo
  • 百度站长收录跨境电商培训机构哪个靠谱
  • 网站手机端做app开发工具页面设计漂亮的网站
  • 网站自适应怎么做google浏览器下载安装