使用 Redis 缓存实现点赞和取消点赞的示例代码

 更新时间:2021年03月15日 10:44:04   作者:gnulxj  
这篇文章主要介绍了使用 Redis 缓存实现点赞和取消点赞的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

点赞功能是很多平台都会提供的一个功能,那么,我们要如何实现点赞和取消点赞呢?

这篇文章总结了我在项目中实现点赞的方法。

缓存 vs 数据库?

首先我们要考虑的是数据要放到哪里,很多时候我们都会把数据放到数据库(如 MySQL),由于关系型数据库的稳定性,大部分场景下我们也都会使用关系数据库来存储数据。

不过,在一些特殊的场景下,传统的关系型数据库很可能无法满足我们的需求。比如,在访问量较大的情况下,数据库很可能会宕机或者访问速度非常慢。这对用户来说是不能容忍的。因此就有了非关系型数据库,如 Redis 作为缓存,将数据放到内存中,实现数据的快速获取。下面我们就来看看如何使用 Redis 缓存实现点赞功能。

Redis 基本数据结构

数据结构 含义
string 字符串变量
list 链表
hash 映射表
set 无序集合
zset 有序集合

具体介绍可以参考这篇博客

点赞相关操作

  • 对帖子点赞
  • 对帖子取消点赞
  • 查看帖子点赞数

我们可以先定义一个接口,包含了点赞的相关操作:

public interface LikeCacheService {

 /**
  * 获取更新过的点赞帖子 id
  * @return
  */
 Set<Object> listUpdatedPost();

 /**
  * 测试用户是否已经对帖子点过赞
  * @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 帖子 id
  */
 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<FmsUserLikePost> listLikedData();

 /**
  * 获取帖子点赞数列表
  */
 List<FmsLikedCountDTO> listLikedCount();

 /**
  * 同步帖子点赞数据到数据库
  */
 void syncLikeDataToDatabase();
}

接下来,我们考虑一下要使用哪些数据结构来实现这些功能。

首先,点赞操作和取消点赞不能重复操作的,也就是不能连续点多次赞或者连续取消多次赞,每个用户只能对某帖子点一次赞,因此我们可以使用 set 来存储每个帖子的点赞用户,key 为帖子 id,value 为 每个对该帖子点赞的用户 id 集合。

  • 点赞:将点赞用户 id 加入对应帖子的点赞用户集
  • 取消点赞:将点赞用户 id 从对应帖子的点赞用户集移除

然后就是帖子点赞数的统计,由于每个帖子都对应一个点赞数,因此我们可以使用 hash 结构存储帖子的点赞数,key 为帖子 id,value 为该帖子的点赞数。

  • 点赞:对应 hash 结构的 value + 1
  • 取消点赞:对应 hash 结构的 value - 1

此外,为了保证数据的可恢复性,我们可以将 Redis 缓存中的数据定时写入关系型数据库中,进行数据持久化。

具体的实现代码可以参考这个项目的代码:FmsLikeCacheServiceImpl.java

到此这篇关于使用 Redis 缓存实现点赞和取消点赞的实现示例的文章就介绍到这了,更多相关Redis点赞和取消点赞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Data JPA框架的核心概念与Repository接口详解

    Spring Data JPA框架的核心概念与Repository接口详解

    Spring Data JPA是Spring基于JPA规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作,本篇我们来了解Spring Data JPA框架的核心概念与Repository接口
    2022-04-04
  • 使用@PathVariable接收两个参数

    使用@PathVariable接收两个参数

    这篇文章主要介绍了使用@PathVariable接收两个参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 如何解决IDEA使用Tomcat控制台中文出现乱码问题

    如何解决IDEA使用Tomcat控制台中文出现乱码问题

    这篇文章主要介绍了如何解决IDEA使用Tomcat控制台中文出现乱码问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 零基础写Java知乎爬虫之进阶篇

    零基础写Java知乎爬虫之进阶篇

    前面几篇文章,我们都是简单的实现了java爬虫抓取内容的问题,那么如果遇到复杂情况,我们还能继续那么做吗?答案当然是否定的,之前的仅仅是入门篇,都是些基础知识,给大家练手用的,本文我们就来点高大上的东西
    2014-11-11
  • RocketMQ之Consumer整体介绍启动源码分析

    RocketMQ之Consumer整体介绍启动源码分析

    这篇文章主要为大家介绍了RocketMQ源码分析之Consumer整体介绍启动分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java 改造ayui表格组件实现多重排序

    Java 改造ayui表格组件实现多重排序

    layui 的表格组件目前只支持单列排序,在实际应用中并不能很好的支撑我们的业务需求。今天一时手痒,决定改造一番以支持多重排序。
    2021-04-04
  • springboot中poi使用操作方法

    springboot中poi使用操作方法

    在项目中,有很多对excel的操作,大都数时候我们都会使用poi工具类,本文将介绍poi的一些使用方法,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • java修饰类的使用方法以及使用技巧(分享)

    java修饰类的使用方法以及使用技巧(分享)

    下面小编就为大家带来一篇java修饰类的使用方法以及使用技巧(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 一篇文章弄懂Spring MVC的参数绑定

    一篇文章弄懂Spring MVC的参数绑定

    这篇文章主要给大家介绍了关于如何通过一篇文章弄懂Spring MVC的参数绑定,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 详解Java反射创建对象

    详解Java反射创建对象

    今天带大家学习Java的基础知识,文中对Java反射创建对象作了非常详细的介绍及代码示例,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论