基于SpringCloud,用户发起点赞、取消点赞后先存入Redis中,再每隔两小时从Redis读取点赞数据写入数据库中做持久化存储。
点赞功能在很多系统中都有,但别看功能小,想要做好需要考虑的东西还挺多的。
点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存。
至于多久从Redis取一次数据存到数据库中,根据项目的实际情况定吧,我是暂时设了两个小时。
项目需求需要查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简单地做计数。
文章分四部分介绍:
Redis缓存设计及实现数据库设计数据库操作开启定时任务持久化存储到数据库一、Redis缓存设计及实现
1.1Redis安装及运行
Redis安装请自行查阅相关教程。
说下Docker安装运行Redis
dockerrun-d-p:redis:4.0.8
如果已经安装了Redis,打开命令行,输入启动Redis的命令
redis-server
1.2Redis与SpringBoot项目的整合
1.在pom.xml中引入依赖
2.在启动类上添加注释
EnableCaching3.编写Redis配置类RedisConfig
至此Redis在SpringBoot项目中的配置已经完成,可以愉快的使用了。
1.3Redis的数据结构类型
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,也很方便。
在可视化工具RDM中看到的是这样子
1.5操作Redis
将具体操作方法封装到了RedisService接口里
RedisService.java
实现类RedisServiceImpl.java
用到的工具类和枚举类
RedisKeyUtils,用于根据一定规则生成key
LikedStatusEnum用户点赞状态的枚举类
package