现有如下要求,模拟博客系统中展示本周热议文章;现实体类、数据层、控制层都已书写完毕,需将业务补全。 文章Post实体如下: @Data @Accessors(chain = true) @TableName("m_post") public class Post implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; private Date created; private Date modified; /** * 标题 */ @NotBlank(message = "标题不能为空") private String title; /** * 内容 */ @NotBlank(message = "内容不能为空") private String content; @NotNull(message = "分类不能为空") private Long categoryId; /** * 评论数量 */ private Integer commentCount; //其他省略 } PostMapper 数据层接口如下,注意,使用的是mybatis-plus: @Component public interface PostMapper extends BaseMapper<Post> { } 现需将业务操作补全: @Service public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService { @Autowired private RedisTemplate redisTemplate; /** * 本周热议初始化 */ @Override public void initWeekRank() { // 数据库查询获取最近7天发表的文章 // 初始化文章的总评论量,按照评论数量倒序将文章信息缓存到redis中, // 其中key值为文章id,value为文章对象,并设置7天后自动过期,注意有效时间的//计算 } }
时间: 2024-01-29 19:03:43 浏览: 79
实现本周热议文章的业务,可以按照以下步骤进行:
1. 获取最近7天发表的文章,可以使用PostMapper中的方法进行查询,例如:
```java
List<Post> posts = baseMapper.selectList(new QueryWrapper<Post>()
.ge("created", LocalDate.now().minusDays(7))
.orderByDesc("comment_count"));
```
上述代码使用了mybatis-plus提供的QueryWrapper类来构建查询条件,查询条件为created字段大于等于7天前的日期,并按照comment_count字段倒序排序,即评论数多的文章排在前面。
2. 初始化文章的总评论量,可以直接更新数据库中的comment_count字段,例如:
```java
posts.forEach(post -> {
int commentCount = commentService.count(new QueryWrapper<Comment>()
.eq("post_id", post.getId()));
post.setCommentCount(commentCount);
baseMapper.updateById(post);
});
```
上述代码使用了mybatis-plus提供的updateById方法更新数据库中的记录,并且在更新时计算了文章的评论数量并赋值给commentCount字段。
3. 将文章信息缓存到redis中,可以使用redisTemplate的opsForValue方法进行操作,例如:
```java
long expireTime = 7 * 24 * 60 * 60; // 7天的秒数
posts.forEach(post -> {
String key = "week:rank:" + post.getId();
redisTemplate.opsForValue().set(key, post, expireTime, TimeUnit.SECONDS);
});
```
上述代码将文章对象存储到redis中,并且设置了7天后自动过期,过期时间的计算使用了TimeUnit提供的SECONDS常量。
完整的PostServiceImpl代码如下:
```java
@Service
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private CommentService commentService;
/**
* 本周热议初始化
*/
@Override
public void initWeekRank() {
// 数据库查询获取最近7天发表的文章
List<Post> posts = baseMapper.selectList(new QueryWrapper<Post>()
.ge("created", LocalDate.now().minusDays(7))
.orderByDesc("comment_count"));
// 初始化文章的总评论量
posts.forEach(post -> {
int commentCount = commentService.count(new QueryWrapper<Comment>()
.eq("post_id", post.getId()));
post.setCommentCount(commentCount);
baseMapper.updateById(post);
});
// 按照评论数量倒序将文章信息缓存到redis中
long expireTime = 7 * 24 * 60 * 60; // 7天的秒数
posts.forEach(post -> {
String key = "week:rank:" + post.getId();
redisTemplate.opsForValue().set(key, post, expireTime, TimeUnit.SECONDS);
});
}
}
```
上述代码中,注入了CommentService来计算文章的评论数量,具体实现可以根据实际情况进行编写。另外,需要注意缓存的key值命名规则,这里使用了"week:rank:"作为前缀。
阅读全文