(仿牛客社区项目)Java开发笔记7.6:热帖排行

news/2024/2/27 22:08:19

文章目录

  • 热帖排行
  • 1.util包
  • 2.dao层
  • 3.service层
  • 4.controller层
  • 5.config包
  • 6.quartz包
  • 7. view层
  • 8.功能分析
    • 8.1 将需要更新分数的帖子添加到Redis数据库中
    • 8.2 借助quartz更新帖子分数
    • 8.3 主页按热度查看帖子
  • 9.功能测试

热帖排行

NowCoder_35_1

1.util包

RedisKeyUtil类添加相关键。

package com.gerrard.community.util;public class RedisKeyUtil {private static final String PREFIX_POST = "post";//帖子分数 post:score->【需要重新计算分数的帖子id集合】public static String getPostScoreKey(){return PREFIX_POST+SPLIT+"score";}}

2.dao层

DiscussPostMapper类中添加updateScore方法,重构selectDiscussPosts方法,方法中添加orderMode字段。

package com.gerrard.community.dao;import com.gerrard.community.entity.DiscussPost;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface DiscussPostMapper {List<DiscussPost> selectDiscussPosts(int userId, int offset, int limit, int orderMode);// @Param注解用于给参数取别名,// 如果只有一个参数,并且在<if>里使用,则必须加别名.int selectDiscussPostRows(@Param("userId") int userId);int insertDiscussPost(DiscussPost discussPost);DiscussPost selectDiscussPostById(int id);int updateCommentCount(int id, int commentCount);int updateType(int id, int type);int updateStatus(int id, int status);int updateScore(int id, double score);}

discusspost-mapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gerrard.community.dao.DiscussPostMapper"><sql id="selectFields">id, user_id, title, content, type, status, create_time, comment_count, score</sql><sql id="insertFields">user_id, title, content, type, status, create_time, comment_count, score</sql><select id="selectDiscussPosts" resultType="DiscussPost">select <include refid="selectFields"></include>from discuss_postwhere status != 2<if test="userId!=0">and user_id = #{userId}</if><if test="orderMode==0">order by type desc, create_time desc</if><if test="orderMode==1">order by type desc, score desc, create_time desc</if>limit #{offset}, #{limit}</select><update id="updateScore">update discuss_post set score = #{score} where id = #{id}</update></mapper>

3.service层

DiscussPostService类中重构findDiscussPosts方法,DiscussPostService类中添加updateScore方法。

package com.gerrard.community.service;import com.gerrard.community.dao.DiscussPostMapper;
import com.gerrard.community.entity.DiscussPost;
import com.gerrard.community.util.SensitiveFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.util.HtmlUtils;import java.util.List;@Service
public class DiscussPostService {@Autowiredprivate DiscussPostMapper discussPostMapper;@Autowiredprivate SensitiveFilter sensitiveFilter;public List<DiscussPost> findDiscussPosts(int userId, int offset, int limit, int orderMode) {return discussPostMapper.selectDiscussPosts(userId, offset, limit, orderMode);}public int updateScore(int id, double score) {return discussPostMapper.updateScore(id, score);}}

4.controller层

(1)DiscusspostController类:发帖,加精方法添加“计算帖子分数”代码。

package com.gerrard.community.controller;import com.gerrard.community.entity.*;
import com.gerrard.community.event.EventProducer;
import com.gerrard.community.service.CommentService;
import com.gerrard.community.service.DiscussPostService;
import com.gerrard.community.service.LikeService;
import com.gerrard.community.service.UserService;
import com.gerrard.community.util.CommunityConstant;
import com.gerrard.community.util.CommunityUtil;
import com.gerrard.community.util.HostHolder;
import com.gerrard.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.*;@Controller
@RequestMapping("/discuss")
public class DiscussPostController implements CommunityConstant {@Autowiredprivate DiscussPostService discussPostService;@Autowiredprivate HostHolder hostHolder;@Autowiredprivate UserService userService;@Autowiredprivate CommentService commentService;@Autowiredprivate LikeService likeService;@Autowiredprivate EventProducer eventProducer;@Autowiredprivate RedisTemplate redisTemplate;@RequestMapping(path = "/add", method = RequestMethod.POST)@ResponseBodypublic String addDiscussPost(String title, String content) {User user = hostHolder.getUser();if (user == null) {return CommunityUtil.getJSONString(403, "你还没有登录哦!");}DiscussPost post = new DiscussPost();post.setUserId(user.getId());post.setTitle(title);post.setContent(content);post.setCreateTime(new Date());discussPostService.addDiscussPost(post);// 触发发帖事件Event event = new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(post.getId());eventProducer.fireEvent(event);// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, post.getId());// 报错的情况,将来统一处理.return CommunityUtil.getJSONString(0, "发布成功!");}// 置顶@RequestMapping(path = "/top", method = RequestMethod.POST)@ResponseBodypublic String setTop(int id) {discussPostService.updateType(id, 1);// 触发发帖事件Event event = new Event().setTopic(TOPIC_PUBLISH).setUserId(hostHolder.getUser().getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(id);eventProducer.fireEvent(event);return CommunityUtil.getJSONString(0);}// 加精@RequestMapping(path = "/wonderful", method = RequestMethod.POST)@ResponseBodypublic String setWonderful(int id) {discussPostService.updateStatus(id, 1);// 触发发帖事件Event event = new Event().setTopic(TOPIC_PUBLISH).setUserId(hostHolder.getUser().getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(id);eventProducer.fireEvent(event);// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, id);return CommunityUtil.getJSONString(0);}// 删除@RequestMapping(path = "/delete", method = RequestMethod.POST)@ResponseBodypublic String setDelete(int id) {discussPostService.updateStatus(id, 2);// 触发删帖事件Event event = new Event().setTopic(TOPIC_DELETE).setUserId(hostHolder.getUser().getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(id);eventProducer.fireEvent(event);return CommunityUtil.getJSONString(0);}}

(2)CommentController类:addComment方法添加“计算帖子分数”代码。

package com.gerrard.community.controller;import com.gerrard.community.entity.Comment;
import com.gerrard.community.entity.DiscussPost;
import com.gerrard.community.entity.Event;
import com.gerrard.community.event.EventProducer;
import com.gerrard.community.service.CommentService;
import com.gerrard.community.service.DiscussPostService;
import com.gerrard.community.util.CommunityConstant;
import com.gerrard.community.util.HostHolder;
import com.gerrard.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Date;@Controller
@RequestMapping("/comment")
public class CommentController implements CommunityConstant {@Autowiredprivate CommentService commentService;@Autowiredprivate HostHolder hostHolder;@Autowiredprivate EventProducer eventProducer;@Autowiredprivate DiscussPostService discussPostService;@Autowiredprivate RedisTemplate redisTemplate;@RequestMapping(path = "/add/{discussPostId}", method = RequestMethod.POST)public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment) {comment.setUserId(hostHolder.getUser().getId());comment.setStatus(0);comment.setCreateTime(new Date());commentService.addComment(comment);// 触发评论事件Event event = new Event().setTopic(TOPIC_COMMENT).setUserId(hostHolder.getUser().getId()).setEntityType(comment.getEntityType()).setEntityId(comment.getEntityId()).setData("postId", discussPostId);if (comment.getEntityType() == ENTITY_TYPE_POST) {DiscussPost target = discussPostService.findDiscussPostById(comment.getEntityId());event.setEntityUserId(target.getUserId());} else if (comment.getEntityType() == ENTITY_TYPE_COMMENT) {Comment target = commentService.findCommentById(comment.getEntityId());event.setEntityUserId(target.getUserId());}eventProducer.fireEvent(event);if (comment.getEntityType() == ENTITY_TYPE_POST) {// 触发发帖事件event = new Event().setTopic(TOPIC_PUBLISH).setUserId(comment.getUserId()).setEntityType(ENTITY_TYPE_POST).setEntityId(discussPostId);eventProducer.fireEvent(event);// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, discussPostId);}return "redirect:/discuss/detail/" + discussPostId;}}

(3)LikeController类:like方法添加“计算帖子分数”代码。

package com.gerrard.community.controller;import com.gerrard.community.entity.Event;
import com.gerrard.community.entity.User;
import com.gerrard.community.event.EventProducer;
import com.gerrard.community.service.LikeService;
import com.gerrard.community.util.CommunityConstant;
import com.gerrard.community.util.CommunityUtil;
import com.gerrard.community.util.HostHolder;
import com.gerrard.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@Controller
public class LikeController implements CommunityConstant {@Autowiredprivate LikeService likeService;@Autowiredprivate HostHolder hostHolder;@Autowiredprivate EventProducer eventProducer;@Autowiredprivate RedisTemplate redisTemplate;@RequestMapping(path = "/like", method = RequestMethod.POST)@ResponseBodypublic String like(int entityType, int entityId, int entityUserId, int postId) {User user = hostHolder.getUser();// 点赞likeService.like(user.getId(), entityType, entityId, entityUserId);// 数量long likeCount = likeService.findEntityLikeCount(entityType, entityId);// 状态int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);// 返回的结果Map<String, Object> map = new HashMap<>();map.put("likeCount", likeCount);map.put("likeStatus", likeStatus);// 触发点赞事件if (likeStatus == 1) {Event event = new Event().setTopic(TOPIC_LIKE).setUserId(hostHolder.getUser().getId()).setEntityType(entityType).setEntityId(entityId).setEntityUserId(entityUserId).setData("postId", postId);eventProducer.fireEvent(event);}if(entityType == ENTITY_TYPE_POST) {// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, postId);}return CommunityUtil.getJSONString(0, null, map);}}

(4)HomeController类中修改getIndexPage方法,添加orderMode字段。

package com.gerrard.community.controller;import com.gerrard.community.entity.DiscussPost;
import com.gerrard.community.entity.Page;
import com.gerrard.community.entity.User;
import com.gerrard.community.service.DiscussPostService;
import com.gerrard.community.service.LikeService;
import com.gerrard.community.service.UserService;
import com.gerrard.community.util.CommunityConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
public class HomeController implements CommunityConstant {@Autowiredprivate DiscussPostService discussPostService;@Autowiredprivate UserService userService;@Autowiredprivate LikeService likeService;@RequestMapping(path = "/index", method = RequestMethod.GET)public String getIndexPage(Model model, Page page,@RequestParam(name = "orderMode", defaultValue = "0") int orderMode) {// 方法调用钱,SpringMVC会自动实例化Model和Page,并将Page注入Model.// 所以,在thymeleaf中可以直接访问Page对象中的数据.page.setRows(discussPostService.findDiscussPostRows(0));page.setPath("/index?orderMode=" + orderMode);List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit(), orderMode);List<Map<String, Object>> discussPosts = new ArrayList<>();if (list != null) {for (DiscussPost post : list) {Map<String, Object> map = new HashMap<>();map.put("post", post);User user = userService.findUserById(post.getUserId());map.put("user", user);long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, post.getId());map.put("likeCount", likeCount);discussPosts.add(map);}}model.addAttribute("discussPosts", discussPosts);model.addAttribute("orderMode", orderMode);return "/index";}@RequestMapping(path = "/error", method = RequestMethod.GET)public String getErrorPage() {return "/error/500";}@RequestMapping(path = "/denied", method = RequestMethod.GET)public String getDeniedPage() {return "/error/404";}
}

5.config包

在QuartzConfig类中新配置刷新帖子分数任务。

package com.gerrard.community.config;import com.gerrard.community.quartz.AlphaJob;
import com.gerrard.community.quartz.PostScoreRefreshJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;// 配置 -> 数据库 -> 调用
@Configuration
public class QuartzConfig {// FactoryBean可简化Bean的实例化过程:// 1.通过FactoryBean封装Bean的实例化过程.// 2.将FactoryBean装配到Spring容器里.// 3.将FactoryBean注入给其他的Bean.// 4.该Bean得到的是FactoryBean所管理的对象实例.// 配置JobDetail// @Beanpublic JobDetailFactoryBean alphaJobDetail() {JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();factoryBean.setJobClass(AlphaJob.class);factoryBean.setName("alphaJob");factoryBean.setGroup("alphaJobGroup");factoryBean.setDurability(true);factoryBean.setRequestsRecovery(true);return factoryBean;}// 配置Trigger(SimpleTriggerFactoryBean, CronTriggerFactoryBean)// @Beanpublic SimpleTriggerFactoryBean alphaTrigger(JobDetail alphaJobDetail) {SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();factoryBean.setJobDetail(alphaJobDetail);factoryBean.setName("alphaTrigger");factoryBean.setGroup("alphaTriggerGroup");factoryBean.setRepeatInterval(3000);factoryBean.setJobDataMap(new JobDataMap());return factoryBean;}// 刷新帖子分数任务@Beanpublic JobDetailFactoryBean postScoreRefreshJobDetail() {JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();factoryBean.setJobClass(PostScoreRefreshJob.class);factoryBean.setName("postScoreRefreshJob");factoryBean.setGroup("communityJobGroup");factoryBean.setDurability(true);factoryBean.setRequestsRecovery(true);return factoryBean;}@Beanpublic SimpleTriggerFactoryBean postScoreRefreshTrigger(JobDetail postScoreRefreshJobDetail) {SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();factoryBean.setJobDetail(postScoreRefreshJobDetail);factoryBean.setName("postScoreRefreshTrigger");factoryBean.setGroup("communityTriggerGroup");factoryBean.setRepeatInterval(1000 * 60 * 5);factoryBean.setJobDataMap(new JobDataMap());return factoryBean;}}

6.quartz包

在quarz包下新建PostScoreRefreshJob类。

package com.gerrard.community.quartz;import com.gerrard.community.entity.DiscussPost;
import com.gerrard.community.service.DiscussPostService;
import com.gerrard.community.service.ElasticsearchService;
import com.gerrard.community.service.LikeService;
import com.gerrard.community.util.CommunityConstant;
import com.gerrard.community.util.RedisKeyUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.RedisTemplate;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class PostScoreRefreshJob implements Job, CommunityConstant {private static final Logger logger = LoggerFactory.getLogger(PostScoreRefreshJob.class);@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate DiscussPostService discussPostService;@Autowiredprivate LikeService likeService;@Autowiredprivate ElasticsearchService elasticsearchService;// 牛客纪元private static final Date epoch;static {try {epoch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-08-01 00:00:00");} catch (ParseException e) {throw new RuntimeException("初始化牛客纪元失败!", e);}}@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {String redisKey = RedisKeyUtil.getPostScoreKey();BoundSetOperations operations = redisTemplate.boundSetOps(redisKey);if (operations.size() == 0) {logger.info("[任务取消] 没有需要刷新的帖子!");return;}logger.info("[任务开始] 正在刷新帖子分数: " + operations.size());while (operations.size() > 0) {this.refresh((Integer) operations.pop());}logger.info("[任务结束] 帖子分数刷新完毕!");}private void refresh(int postId) {DiscussPost post = discussPostService.findDiscussPostById(postId);if (post == null) {logger.error("该帖子不存在: id = " + postId);return;}// 是否精华boolean wonderful = post.getStatus() == 1;// 评论数量int commentCount = post.getCommentCount();// 点赞数量long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, postId);// 计算权重double w = (wonderful ? 75 : 0) + commentCount * 10 + likeCount * 2;// 分数 = 帖子权重 + 距离天数double score = Math.log10(Math.max(w, 1))+ (post.getCreateTime().getTime() - epoch.getTime()) / (1000 * 3600 * 24);// 更新帖子分数discussPostService.updateScore(postId, score);// 同步搜索数据post.setScore(score);elasticsearchService.saveDiscussPost(post);}}

7. view层

修改index.html页面。

NowCoder_35_2

8.功能分析

8.1 将需要更新分数的帖子添加到Redis数据库中

用户发帖;版主加精;用户评论,用户点赞【都是针对帖子】,将帖子id添加到Redis数据库中。

		// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, post.getId());//post:score->【需要重新计算分数的帖子id集合】

8.2 借助quartz更新帖子分数

每隔5分钟执行PostScoreRefreshJob类中的refresh方法:

1.查看Redis数据库中post:score键中是否存有帖子id,没有则结束;

2.如果存有帖子id集合,则pop遍历集合,对每个帖子计算对应指标,算出帖子的分数,再更新帖子的分数。

8.3 主页按热度查看帖子

在index主页点击最热按钮,则帖子展示顺序为帖子种类,帖子得分,帖子创建时间。

		<if test="orderMode==0">order by type desc, create_time desc</if><if test="orderMode==1">order by type desc, score desc, create_time desc</if>

9.功能测试

NowCoder_35_3

进行加精操作:

NowCoder_35_4

查看Redis数据库:

NowCoder_35_5

更新分数:

NowCoder_35_6

再次查看Redis数据库:
NowCoder_35_7

查看主页:

NowCoder_35_8

NowCoder_35_9


http://www.ppmy.cn/news/259652.html

相关文章

redis排行榜_java_【Redis 源码日志】- Redis 应用:积分排行榜 - Java 技术驿站-Java 技术驿站...

积分排行榜是 Redis 的经典应用。 倘若数据都存在数据库中,每次访问网页都需要对所有的数据做排序,对于日访问量大的网站来说,不仅服务器吃不消,用户体验也不佳。在 Redis 中提供了 sorted set 数据结构——有序集合,其底层实现是跳表,因此插入和删除的效率都很高,适用于…

Redis实现热搜排行榜

整体思路是采用redis的zset来实现&#xff0c;每条热搜的内容是一个member&#xff0c;每条热搜的热度值是一个score&#xff08;zset中的元素会自动排序&#xff0c;只需要取集合中前多少条就行了&#xff09; 一、首先确定热度计算算法 如 热度评论数转发数点赞数 二、排行榜…

RPC、HTTP、DSF、Dubbo,每个都眼熟,就是不知道有什么联系?

一、HTTP 和 RPC 首先&#xff0c;http 与 rpc 有什么区别这个问题不太严谨&#xff0c;因为这俩就不是一个层级的东西。 HTTP 这个大家太熟悉了吧&#xff1f;日常接触最多的恐怕就是各种http协议的接口了。 没错&#xff0c;http它是一个协议。 其他在这里就不打算铺开了…

移动端布局之flex布局2:flex布局父项常见属性、flex布局子项常见属性、案例:携程网首页案例制作(曾经的版本)1

移动端布局之flex布局2 flex布局父项常见属性flex-flow属性 flex布局子项常见属性flex属性&#xff08;重要&#xff09;align-self控制子项自己在侧轴上的排列方式order属性定义项目的排列顺序 案例&#xff1a;携程网首页案例制作(曾经的版本)技术选型搭建相关文件夹结构设置…

ENTJ型人格适合选择哪些专业?

ENTJ型人格代表外向、理性、自信和决断的特点&#xff0c;他们的领导能力强&#xff0c;善于组织和领导团队&#xff0c;有明确的目标和计划&#xff0c;并能有效地推动实施。独立工作能力强&#xff0c;有着自己的想法和价值观&#xff0c;并且坚定地追求自己的目标&#xff0…

【区块链 | L2】Optimistic Rollups Vs Zero-Knowledge Rollups(乐观汇总与零知识汇总)

乐观汇总与零知识汇总 以太坊的崛起为许多行业带来了良好的前景,同时也带来了重大挫折。以太坊为DeFi和NFT等许多新的创新趋势的发展提供了理想的基础。您会注意到以太坊和去中心化生态系统如何随着新的应用程序和创新而逐渐扩展。另一方面,网络活动的急剧增长也导致了关于确…

49 张图 26 个问题详解什么是 WiFi ?

1、什么是 CSMA/CA &#xff1f; 以太网用 CSMA/CD 进行传输控制&#xff0c;而 IEEE 802.11 的 WLAN 采用的是 CSMA/CA 。 CSMA/CD &#xff0c;全称 Carrier Sense Multiple Access with Collision Detection &#xff0c;即 载波侦听多路访问/冲突检测协议。 载波侦听&am…

我为什么读博

用讲道理的方式去说服一个人接受你的观点&#xff0c;通常是很难的&#xff0c;那我就讲讲自己的故事吧&#xff0c;很长&#xff0c;要表达的&#xff0c;都在里面了。 时间拉回到十六年前&#xff0c;2004年的第一场雪&#xff0c;比以往来的更早一些。我和师兄、师姐蹲在冷呵…

雷军为什么要挖常程?

作者 | 胡巍巍 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2020年1月2日&#xff0c;是腊八节&#xff0c;我猜你喝的十有八九是八宝粥。 雷军就不一样了&#xff0c;亲自用用“电磁炉”熬了碗小米粥。 此话怎讲&#xff1f; 2日上午&#xff0c;雷军微博官宣…

OpenAI Triton 初探

Triton 2021年发布了1.0&#xff0c;我在调研GPU使用方法的时候知道了有这个东西&#xff0c;但是当时还不了解OpenAI&#xff0c;觉得这个项目太新太小众&#xff0c;并没有深究。现在GPT大火之后&#xff0c;再回过头看看他们的这个东西。 现在相关文档还是很少&#xff0c;…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建&#xff0c;InnoDB 引擎会自动创建。另外&#xff0c;在 InnoDB 引擎中&#xff0c;聚簇索引就是数据的存储方式。 它有 2 个特点&#xff1a; 特点 1 使用记录主键…

家电零部件展丨家电供应链展CAEE,家电上游企业的新机遇

我国的家电产业链中&#xff0c;家电上游部分主要是各种零部件、元器件、原料、辅料、生产技术设备等&#xff0c;他们为下游家电企业的生产制造提供了不可缺少的核心零部件&#xff1b;而家电下游则是各种家电成品企业&#xff0c;生产的家电主要包括空调、冰箱、热水器等大家…

【动态规划】-最小路径和(java)

最小路劲和--动态规划和内存压缩 最小路径和题目描述 动态规划解题思路&#xff1a;代码演示动态规划的内存压缩动态规划专题 最小路径和 题目描述 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 沿途只可以向下或者向右走&#xff0c…

【2611. 老鼠和奶酪】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有两只老鼠和 n 块不同类型的奶酪&#xff0c;每块奶酪都只能被其中一只老鼠吃掉。 下标为 i 处的奶酪被吃掉的得分为&#xff1a; 如果第一只老鼠吃掉&#xff0c;则得分为 reward1[i] 。如果第二…

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时&#xff0c;有的面试官可能会问Appium的运行原理&#xff0c;以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

【毕设狗】【单片机毕业设计】基于单片机的智能吹风机的设计–实物设计

仿真链接&#xff1a; 基于单片机的智能吹风机的设计-仿真设计 论文链接&#xff1a; 基于单片机的智能吹风机的设计-参考论文 软件安装&#xff1a; Keil5&#xff1a;点击下载Proteus7.8&#xff1a;点击下载AD&#xff1a;点击下载Visio&#xff1a;点击下载 设计简介…

高速吹风筒方案浅谈

随着戴森2016年推出高速吹风筒以后&#xff0c;越来越多的国内公司进入这个领域。 高速风筒相比传统吹风机优势&#xff1a; 智能恒温&#xff0c;过载保护 负离子保湿&#xff0c;增加头发水分&#xff0c;去毛躁 吹干速度更快&#xff0c;节能高效。 主控芯片&#xff1a;32位…

【单片机毕业设计】【mcuclub-jj-024】基于单片机的吹风机的设计

最近设计了一个项目基于单片机的吹风机系统&#xff0c;与大家分享一下&#xff1a; 一、基本介绍 项目名&#xff1a;吹风机 项目编号&#xff1a;mcuclub-jj-024 单片机类型&#xff1a;STC89C52 具体功能&#xff1a; 1、通过三个按键控制吹风机的加热模式&#xff0c;包括…

游戏盾是什么防御DDOS攻击的

游戏盾是一种专门用于防御分布式拒绝服务&#xff08;DDoS&#xff09;攻击的安全工具。DDoS攻击是指攻击者利用大量的计算机或设备同时向目标服务器发送海量的请求&#xff0c;以使目标服务器超负荷运行&#xff0c;无法正常提供服务。游戏盾通过一系列智能的防护措施&#xf…

2023面试题合集(建议收藏)

写在前面 个人强烈感觉面试因人而异&#xff0c;对于简历上有具体项目经历的同学&#xff0c;个人感觉面试官会着重让你介绍自己的项目&#xff0c;包括但不限于介绍一次真实攻防/渗透/挖洞/CTF/代码审计的经历 > 因此对于自己的项目&#xff0c;面试前建议做一次复盘&…
最新文章