在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
616
2023-02-06
使用 Redis 缓存实现点赞和取消点赞的示例代码
点赞功能是很多平台都会提供的一个功能,那么,我们要如何实现点赞和取消点赞呢?
这篇文章总结了我在项目中实现点赞的方法。
缓存 vs 数据库?
首先我们要考虑的是数据要放到哪里,很多时候我们都会把数据放到数据库(如 mysql),由于关系型数据库的稳定性,大部分场景下我们也都会使用关系数据库来存储数据。
不过,在一些特殊的场景下,传统的关系型数据库很可能无法满足我们的需求。比如,在访问量较大的情况下,数据库很可能会宕机或者访问速度非常慢。这对用户来说是不能容忍的。因此就有了非关系型数据库,如 Redis 作为缓存,将数据放到内存中,实现数据的快速获取。下面我们就来看看如何使用 Redis 缓存实现点赞功能。
Redis 基本数据结构
数据结构
含义
string
字符串变量
list
链表
hash
映射表
set
无序集合
zset
有序集合
具体介绍可以参考这篇博客。
点赞相关操作
对帖子点赞
对帖子取消点赞
查看帖子点赞数
我们可以先定义一个接口,包含了点赞的相关操作:
public interface LikeCacheService {
/**
* 获取更新过的点赞帖子 id
* @return
*/
Set
/**
* 测试用户是否已经对帖子点过赞
* @param userId 点赞用户 id
* @param postId 待测试帖子 id
* @return true if user has liked post
*/
boolean hasLiked(Integer userId, Long postId);
/**
* 获取帖子点赞数
* @param postId 帖子 id
* @return 帖子的点赞数
*/
Integer getLikeCount(Long postId);
/**
* 点赞
* @param uid 用户 id
* @param pid 帖子 id
*/
void like(Integer uid, Long pid);
/**
* 取消点赞
* @param uid 用户 id
* @param pid 帖子 ihttp://d
*/
void unlike(Integer uid, Long pid);
/**
* 某个帖子的点赞数 +1
* @param pid 帖子 id
*/
void incrLikedCount(Long pid);
/**
* 某个帖子的点赞数 -1
* @param pid 帖子 id
*/
void decrLikedCount(Long pid);
/**
* 删除某个帖子的点赞信息
* @param pid 帖子 id
*/
void deletePostLikeSet(Long pid);
/**
* 获取帖子点赞数据列表
*/
List
/**
* 获取帖子点赞数列表
*/
List
/**
* 同步帖子点赞数据到数据库
*/
void syncLikeDataToDatabase();
}
接下来,我们考虑一下要使用哪些数据结构来实现这些功能。
首先,点赞操作和取消点赞不能重复操作的,也就是不能连续点多次赞或者连续取消多次赞,每个用户只能对某帖子点一次赞,因此我们可以使用 set 来存储每个帖子的点赞用户,key 为帖子 id,value 为 每个对该帖子点赞的用户 id 集合。
点赞:将点赞用户 id 加入对应帖子的点赞用户集
取消点赞:将点赞用户 id 从对应帖子的点赞用户集移除
然后就是帖子点赞数的统计,由于每个帖子都对应一个点赞数,因此我们可以使用 hash 结构存储帖子的点赞数,key 为帖子 id,value 为该帖子的点赞数。
点赞:对应 hash 结构的 value + 1
取消点赞:对应 hash 结构的 value - 1
此外,为了保证数据的可恢复性,我们可以将 Redis 缓存中的数据定时写入关系型数据库中,进行数据持久化。
具体的实现代码可以参考这个项目的代码:FmsLikeCacheServiceImpl.java。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~