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

经验分享 程序员 微信小程序 职场和发展