基于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注解