来源:juejin.im/post/5bdc257e6fb9a049ba410098
本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。
点赞功能在很多系统中都有,但别看功能小,想要做好须要考虑的东西还挺多的。

点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,以是须要做缓存。
至于多久从 Redis 取一次数据存到数据库中,根据项目的实际情形定吧,我是暂时设了两个小时。
项目需求须要查看都谁点赞了,以是要存储每个点赞的点赞人、被点赞人,不能大略的做计数。
文章分四部分先容:
Redis 缓存设计及实现数据库设计数据库操作开启定时任务持久化存储到数据库一、Redis 缓存设计及实现
1.1 Redis 安装及运行
Redis 安装请自行查阅干系教程。
说下Docker 安装运行 Redis
docker run -d -p 6379:6379 redis:4.0.8
如果已经安装了 Redis,打开命令行,输入启动 Redis 的命令
redis-server
1.2 Redis 与 SpringBoot 项目的整合
3.编写 Redis 配置类 RedisConfig
至此 Redis 在 SpringBoot 项目中的配置已经完成,可以愉快的利用了。
1.3 Redis 的数据构造类型
Redis 可以存储键与5种不同数据构造类型之间的映射,这5种数据构造类型分别为String(字符串)、List(列表)、Set(凑集)、Hash(散列)和 Zset(有序凑集)。
下面来对这5种数据构造类型作大略的先容:
1.4 点赞数据在 Redis 中的存储格式
用 Redis 存储两种数据,一种是记录点赞人、被点赞人、点赞状态的数据,另一种是每个用户被点赞了多少次,做个大略的计数。
由于须要记录点赞人和被点赞人,还有点赞状态(点赞、取消点赞),还要固定时间间隔取出 Redis 中所有点赞数据,剖析了下 Redis 数据格式中 Hash 最得当。
由于 Hash 里的数据都是存在一个键里,可以通过这个键很方便的把所有的点赞数据都取出。这个键里面的数据还可以存成键值对的形式,方便存入点赞人、被点赞人和点赞状态。
设点赞人的 id 为 likedPostId,被点赞人的 id 为 likedUserId ,点赞时状态为 1,取消点赞状态为 0。将点赞人 id 和被点赞人 id 作为键,两个 id 中间用 :: 隔开,点赞状态作为值。
以是如果用户点赞,存储的键为:likedUserId::likedPostId,对应的值为 1 。取消点赞,存储的键为:likedUserId::likedPostId,对应的值为 0 。取数据时把键用 :: 切开就得到了两个id,也很方便。(Redis常见面试题,可以参考这里)
在可视化工具 RDM 中看到的是这样子
1.5 操作 Redis
将详细操作方法封装到了 RedisService 接口里
RedisService.java
实现类 RedisServiceImpl.java
用到的工具类和列举类
RedisKeyUtils, 用于根据一定规则天生 key
二、数据库设计
数据库表中至少要包含三个字段:被点赞用户id,点赞用户id,点赞状态。再加上主键id,创建韶光,修正韶光就行了。
建表语句
对应的工具 UserLike
三、数据库操作
操作数据库同样封装在接口中
LikedService
LikedServiceImpl 实现类
数据库的操作就这些,紧张还是增编削查。
四、开启定时任务持久化存储到数据库
定时任务 Quartz 很强大,就用它了。
Quartz 利用步骤:
1.添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId></dependency>
2.编写配置文件
3.编写实行任务的类继续自 QuartzJobBean
在定时任务中直接调用 LikedService 封装的方法完成数据同步。
以上便是点赞功能的设计与实现,不敷之处还请各位大佬多多指教。
如有更好的实现方案欢迎在评论区互换…
代码出自开源项目 CodeRiver,欢迎围不雅观:https://github.com/cachecats/coderiver