基于redis的点赞功能的实现
概要
实现
数据库的结构
| Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+-------------------+-----------------------------------------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | liked_user_id | varchar(32) | NO | MUL | NULL | | | liked_post_id | varchar(32) | NO | MUL | NULL | | | status | tinyint(1) | YES | | 1 | | | create_time | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | update_time | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
对应的对象类
导入redis的依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
设置redis的连接依赖
spring.redis.database=0 spring.redis.host=xx.xx.xx.xxx spring.redis.password=xxxxx spring.redis.port=6379
启动类
加上@Cacheable注解
功能接口
接口的实现
工具类
主要实现两个id之间的合并,来作为redis存储的key。
数据库的操作
数据库操作的接口
接口的实现
@Service
public class LikedServiceImpl implements LikedService {
@Autowired
UserLikeRepository likeRepository;
@Autowired
RedisService redisService;
@Autowired
UserService userService;
@Override
@Transactional
public UserLike save(UserLike userLike) {
return likeRepository.save(userLike);
}
@Override
@Transactional
public List<UserLike> saveAll(List<UserLike> list) {
return likeRepository.saveAll(list);
}
@Override
public Page<UserLike> getLikedListByLikedUserId(String likedUserId, Pageable pageable) {
return likeRepository.findByLikedUserIdAndStatus(likedUserId, LikedStatusEnum.LIKE.getCode(), pageable);
}
@Override
public Page<UserLike> getLikedListByLikedPostId(String likedPostId, Pageable pageable) {
return likeRepository.findByLikedPostIdAndStatus(likedPostId, LikedStatusEnum.LIKE.getCode(), pageable);
}
@Override
public UserLike getByLikedUserIdAndLikedPostId(String likedUserId, String likedPostId) {
return likeRepository.findByLikedUserIdAndLikedPostId(likedUserId, likedPostId);
}
@Override
@Transactional
public void transLikedFromRedis2DB() {
List<UserLike> list = redisService.getLikedDataFromRedis();
for (UserLike like : list) {
UserLike ul = getByLikedUserIdAndLikedPostId(like.getLikedUserId(), like.getLikedPostId());
if (ul == null){
//没有记录,直接存入
save(like);
}else{
//有记录,需要更新
ul.setStatus(like.getStatus());
save(ul);
}
}
}
@Override
@Transactional
public void transLikedCountFromRedis2DB() {
}
}
定时任务
采用spring自带的schedule定时任务
添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
定时任务
启动类
需要加上@EnableScheduling注解
