使用 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点赞和取消点赞内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于redis实现的点赞功能设计思路详解

    前言 点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等. 直接写入Mysql 直接写入Mysql是最简单的做法. 做两个表即可, 1.post_like 记录文章被赞的次数,已有多少人赞过这种数据就可以直接从表中查到; 2.user_like_post 记录用户赞过了哪些文章, 当打开文章列表时,显示的有没有赞过的数据就在这里面; 缺点 1.

  • springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

    springboot +redis 实现点赞.浏览.收藏.评论等数量的增减操作 前言 第一次写博客,记录一下: 最近做了一个帖子的收藏.点赞数量的功能,其实之前也做过类似的功能,因为之前一直使用的mysql 总是感觉对于这种频繁需要改变的值,不应该给予Mysql过大的压力,本文章采用的是redis 做了持久化.下面贴出关键代码:DataResponse是项目中使用的结果封装实体类:forumDTO是此功能的参数实体,如果有需要请留言. 常量如下: private static final Str

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

    点赞功能是很多平台都会提供的一个功能,那么,我们要如何实现点赞和取消点赞呢? 这篇文章总结了我在项目中实现点赞的方法. 缓存 vs 数据库? 首先我们要考虑的是数据要放到哪里,很多时候我们都会把数据放到数据库(如 MySQL),由于关系型数据库的稳定性,大部分场景下我们也都会使用关系数据库来存储数据. 不过,在一些特殊的场景下,传统的关系型数据库很可能无法满足我们的需求.比如,在访问量较大的情况下,数据库很可能会宕机或者访问速度非常慢.这对用户来说是不能容忍的.因此就有了非关系型数据库,如 Re

  • 微信小程序实现列表页的点赞和取消点赞功能

    今天开发了一个文章的留言版块,于是想到要为某个留言点赞,点过赞的再次点击会取消点赞,代码如下: /*更新点赞*/ update_zan:function(e){ var that = this; var data = e.currentTarget.dataset; var mid = data.mid; var cookie_mid = wx.getStorageSync('zan') || [];//获取全部点赞的mid var isadd = 1; var newmessage = [];

  • vue实现静态页面点赞和取消点赞功能

    本文实例为大家分享了vue实现静态页面点赞和取消点赞的具体代码,供大家参考,具体内容如下 效果如下: 点击之后 点赞数量+1,红心亮再次点击,点赞数量-1,红心灭 逻辑: 由于列表是动态渲染的(for),数据是mock随机生成,所以绑定点击事件时,应该把当前下标和item的id都传到事件上,在data里面声明空数组,用来存放已经点击的id,点赞点击事件触发,先进行判断,1.当前data内的数组是否有这个点击的id,用indexof方法查找,如果找不到,执行点赞功能,数量+1,红心样式取反,最重要

  • springboot+redis 实现分布式限流令牌桶的示例代码

    1.前言 网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手自定义实现redis令牌桶. 只用到了spring-boot-starter-data-redis包,并且就几行代码. 2.环境准备 a.idea新建springboot项目,引入spring-data-redis包 b.编写令牌桶实现方法RedisLimitExcutor c.测试功能,创建全局拦截器,测试功能 3

  • SpringBoot+Redis实现消息的发布与订阅的示例代码

    目录 1.什么是redis的发布与订阅 2.Redis发布订阅 3.命令行实现功能 订阅主题 模式匹配订阅 发布消息 取消订阅 测试 4.SpringBoot实现功能 Springboot整合Redis 配置消息监听 测试 1.什么是redis的发布与订阅 在官网的文档介绍中有一行介绍:Redis是一个快速稳定的发布/订阅消息系统. 2.Redis发布订阅 机制 Redis提供了发布与订阅的功能,可以用于消息的传输,Redis的发布订阅机制包括三部分,发布者.订阅者和Channel(主题或者队列

  • 微信小程序实现点赞、取消点赞功能

    最近接触到小程序,发现很有意思,在项目中遇到了一点小问题,就是点赞+取消点赞有些冲突,还有就是多项的点击,话不多说咱们直接上代码! 效果图 wxml <block wx:for="{{msg}}"> <image class='imgList' hidden='{{item.show}}' bindtap='zan' data-index='{{index}}' src='../resizeApi.png'></image> <image cl

  • jQuery简单实现QQ空间点赞已经取消点赞

    看到有网友制作了对空间好友的动态点赞,加了个以及取消赞的功能.直接运行的脚本 好友动态点赞代码 jQuery("a.qz_like_btn_v3[data-clicklog='like']").each(function(index,item){ console.log(item); jQuery(item).trigger('click'); }); jQuery(window).scroll(function(){ jQuery("a.qz_like_btn_v3[dat

  • vue实现直播间点赞飘心效果的示例代码

    前言: 在开发公司项目的时候,遇到了直播间的一些功能,其中点赞冒泡飘心,就折腾了好久,canvas学的不好,自己写不来,百度找了一堆都是js原生写法,迁移到vue项目里来好多问题,百度也解决不了.自己试着慢慢解决,竟然在不知不觉中通了!废话不多说,直接上代码,复制粘贴即可使用 示例: 不动就不动吧.png ```第一步```:先在外部新建一个js文件,取名index.js(名字自己随便取) index.js代码内容如下: /** * LikeHeart * @version: 1.0.0 * @

  • js取消单选按钮选中示例代码

    一组单选按钮name都为country 复制代码 代码如下: var country = document.getElementsByName('country'); for(var i=0;i<country.length;i++){ if(country[i].checked) { country[i].checked=false; //不选中 } }

  • 使用Redis实现点赞取消点赞的详细代码

    前言 异步实现 代码实现: /** * * @param userId 点赞的人 * @param type 点赞与取消点赞的表示 * @param textId 文章ID * @param entityUserId -- 被点赞的人,文章作者 */ private void like(long userId,int type,int textId,long entityUserId){ redisTemplate.execute(new SessionCallback() { @Overrid

随机推荐