iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么利用Redis实现点赞功能
  • 422
分享到

怎么利用Redis实现点赞功能

2023-07-02 13:07:56 422人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么利用Redis实现点赞功能”,在日常操作中,相信很多人在怎么利用Redis实现点赞功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Redis实现点赞功能”的疑惑有所帮助!接下来

这篇文章主要介绍“怎么利用Redis实现点赞功能”,在日常操作中,相信很多人在怎么利用Redis实现点赞功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Redis实现点赞功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

MySQL 和 Redis优缺点

首先我们来说一下两种方法各自的优缺点:我们以 Mysql 和 Redis 为例。

直接写入数据库

优点:这种方法实现简单,只需完成数据库的增删改查就行;

缺点:数据库读写压力大,如果遇到热门文章在短时间内被大量点赞的情况,直接操作数据库会给数据库带来巨大压力,影响效率。

使用 Redis 缓存

优点:性能高,读写速度快,缓解数据库读写的压力;

缺点:开发复杂,不能保证数据安全性即 redis 挂掉的时候会丢失数据, 同时不及时同步 redis 中的数据, 可能会在 redis 内存置换的时候被淘汰掉。不过对于点赞数据我们不需要那么精确,丢失一点数据问题不大。

接下来就从以下三个方面对点赞功能做详细的介绍

•Redis 缓存设计

•数据库设计

•开启定时任务持久化存储到数据库

1、Redis 缓存设计及实现

Redis 的整合我们在上一篇文章中已经介绍过了,此处就不再赘述了。我们了解到,我们在做点赞的时候需要记录以下几类数据:一类是某用户被其他用户点赞的详细记录,一类是。考虑到查询与存取方便快捷,我这边采用 Hash 结构进行存储,存储结构如下:

(1)某用户被其他用户点赞的详细记录: MAP_USER_LIKED 为键值, 被点赞用户id::点赞用户id 为 filed, 1或者0 为 value

(2)某用户被点赞的数量统计: MAP_USER_LIKED_COUNT 为键值, 被点赞用户id 为 filed, count 为 value

部分代码如下

@Overridepublic void saveLiked2Redis(String likedUserId, String likedPostId) {    String key = RedisKeyUtils.getLikedKey(likedUserId, likedPostId);    redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED,key, LikedStatusEnum.LIKE.getCode());}//取消点赞@Overridepublic void unlikeFromRedis(String likedUserId, String likedPostId) {    String key = RedisKeyUtils.getLikedKey(likedUserId, likedPostId);    redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED,key,LikedStatusEnum.UNLIKE.getCode());}@Overridepublic void incrementLikedCount(String likedUserId) {    redisTemplate.opsForHash().increment(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,likedUserId,1);}//-1@Overridepublic void decrementLikedCount(String likedUserId) {    redisTemplate.opsForHash().increment(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, likedUserId, -1);}@Overridepublic List<UserLikeDetail> getLikedDataFromRedis() {    Cursor<Map.Entry<Object,Object>> scan = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED, ScanOptions.NONE);    List<UserLikeDetail> list = new ArrayList<>();    while (scan.hasNext()){        Map.Entry<Object, Object> entry = scan.next();        String key = (String) entry.geTKEy();        String[] split = key.split("::");        String likedUserId = split[0];        String likedPostId = split[1];        Integer value = (Integer) entry.getValue();        //组装成 UserLike 对象        UserLikeDetail userLikeDetail = new UserLikeDetail(likedUserId, likedPostId, value);        list.add(userLikeDetail);        //存到 list 后从 Redis 中删除        redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED, key);    }    return list;}@Overridepublic List<UserLikCountDTO> getLikedCountFromRedis() {    Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, ScanOptions.NONE);    List<UserLikCountDTO> list = new ArrayList<>();    while(cursor.hasNext()){        Map.Entry<Object, Object> map = cursor.next();        String key = (String) map.getKey();        Integer value = (Integer) map.getValue();        UserLikCountDTO userLikCountDTO = new UserLikCountDTO(key,value);        list.add(userLikCountDTO);        //存到 list 后从 Redis 中删除        redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,key);    }    return list;}

Redis 存储结构如图

怎么利用Redis实现点赞功能

怎么利用Redis实现点赞功能

2、数据库设计

这里我们可以和直接将点赞数据存到数据库一样,设计两张表:

(1)用户被其他用户点赞的详细记录:user_like_detail

DROP TABLE IF EXISTS `user_like_detail`;CREATE TABLE `user_like_detail`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `liked_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '被点赞的用户id',  `liked_post_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '点赞的用户id',  `status` tinyint(1) NULL DEFAULT 1 COMMENT '点赞状态,0取消,1点赞',  `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',  `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',  PRIMARY KEY (`id`) USING BTREE,  INDEX `liked_user_id`(`liked_user_id`) USING BTREE,  INDEX `liked_post_id`(`liked_post_id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户点赞表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

(2)用户被点赞的数量统计:user_like_count

DROP TABLE IF EXISTS `user_like_count`;CREATE TABLE `user_like_count`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `like_num` int(11) NULL DEFAULT 0,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

3、开启定时任务持久化存储到数据库

我们使用 Quartz 来实现定时任务,将 Redis 中的数据存储到数据库中,为了演示效果,我们可以设置一分钟或者两分钟存储一遍数据,这个视具体业务而定。在同步数据的过程中,我们首先要将 Redis 中的数据在数据库中进行查重,舍弃重复数据,这样我们的数据才会更加准确。

部分代码如下

//同步redis的用户点赞数据到数据库@Override@Transactionalpublic void transLikedFromRedis2DB() {    List<UserLikeDetail> list = redisService.getLikedDataFromRedis();    list.stream().forEach(item->{        //查重        UserLikeDetail userLikeDetail = userLikeDetailMapper.selectOne(new LambdaQueryWrapper<UserLikeDetail>()           .eq(UserLikeDetail::getLikedUserId, item.getLikedUserId())           .eq(UserLikeDetail::getLikedPostId, item.getLikedPostId()));        if (userLikeDetail == null){            userLikeDetail = new UserLikeDetail();            BeanUtils.copyProperties(item, userLikeDetail);            //没有记录,直接存入            userLikeDetail.setCreateTime(LocalDateTime.now());            userLikeDetailMapper.insert(userLikeDetail);        }else{            //有记录,需要更新            userLikeDetail.setStatus(item.getStatus());            userLikeDetail.setUpdateTime(LocalDateTime.now());            userLikeDetailMapper.updateById(item);        }    });}@Override@Transactionalpublic void transLikedCountFromRedis2DB() {    List<UserLikCountDTO> list = redisService.getLikedCountFromRedis();    list.stream().forEach(item->{        UserLikeCount user = userLikeCountMapper.selectById(item.getKey());        //点赞数量属于无关紧要的操作,出错无需抛异常        if (user != null){            Integer likeNum = user.getLikeNum() + item.getValue();            user.setLikeNum(likeNum);            //更新点赞数量            userLikeCountMapper.updateById(user);        }    });}

到此,关于“怎么利用Redis实现点赞功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么利用Redis实现点赞功能

本文链接: https://www.lsjlt.com/news/342191.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么利用Redis实现点赞功能
    这篇文章主要介绍“怎么利用Redis实现点赞功能”,在日常操作中,相信很多人在怎么利用Redis实现点赞功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Redis实现点赞功能”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • Redis中怎么实现点赞、取消点赞功能
    Redis中怎么实现点赞、取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现1.1 Redis 安装及运...
    99+
    2022-10-18
  • 利用Redis实现点赞功能的示例代码
    目录mysql 和 Redis优缺点1、Redis 缓存设计及实现部分代码如下Redis 存储结构如图2、数据库设计3、开启定时任务持久化存储到数据库部分代码如下提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对...
    99+
    2022-06-28
    Redis 点赞功能 Redis 点赞
  • Spring Cloud中怎么使用Redis实现点赞和取消点赞功能
    Spring Cloud中怎么使用Redis实现点赞和取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现...
    99+
    2022-10-18
  • java实现点赞功能
    本文实例为大家分享了java实现点赞功能的具体代码,供大家参考,具体内容如下 实现思路: 将点赞的数据先保存到redis中,然后定时同步到数据库 第一步: 在redis中创建二个ha...
    99+
    2022-11-13
  • 点赞功能使用MySQL还是Redis
    目录1. 新手常犯的错误2. 使用Iterator的remove()方法3. 使用for循环正序遍历4. 使用for循环倒序遍历5. 使用Iterator的remove()方法6. ...
    99+
    2022-11-12
  • 利用Java实现一个短视频点赞功能
    这篇文章将为大家详细讲解有关利用Java实现一个短视频点赞功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 这行代码是弹出点赞的时间为18s.18秒后发生了什么呢 ?继续看&nb...
    99+
    2023-05-31
    java ava 点赞
  • vue怎么实现静态页面点赞和取消点赞功能
    本文小编为大家详细介绍“vue怎么实现静态页面点赞和取消点赞功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现静态页面点赞和取消点赞功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:点击...
    99+
    2023-06-29
  • 如何使用Redis实现点赞取消点赞
    这篇文章将为大家详细讲解有关如何使用Redis实现点赞取消点赞,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码实现:    private void&n...
    99+
    2023-06-29
  • PHP+Redis怎么实现点赞效果
    这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在PHP+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所...
    99+
    2023-06-04
  • 百万用户量redis点赞怎么实现
    要实现百万用户量的Redis点赞功能,可以使用Redis的有序集合(Sorted Set)数据结构来实现。首先,需要为每个被点赞的对...
    99+
    2023-09-04
    redis
  • java实现简单点赞功能
    本文实例为大家分享了java实现简单点赞功能的具体代码,供大家参考,具体内容如下 需求分析 分析: 1.必须先登录,否则提示2.第一次点赞(顶),点赞操作,点赞数+1,提示顶成功3...
    99+
    2022-11-13
  • SpringBoot实现物品点赞功能
    前后端分离项目–二手交易平台小程序 SpringBoot----物品收藏功能实现 SpringBoot----评论回复功能实现(数据库设计) SpringBoot----文件(图片)...
    99+
    2022-11-12
  • iOS实现抖音点赞功能
    目录前言实现原理三角形的贝塞尔曲线原理代码实现创建 CAShapeLayer创建初始位置的贝塞尔path结束前言 很多人肯定都是玩过抖音的吧,那也肯定为了某位美女或者帅哥偷偷作死的点...
    99+
    2022-11-13
  • vue实现静态页面点赞和取消点赞功能
    本文实例为大家分享了vue实现静态页面点赞和取消点赞的具体代码,供大家参考,具体内容如下 效果如下: 点击之后 点赞数量+1,红心亮再次点击,点赞数量-1,红心灭 逻辑: 由于列...
    99+
    2022-11-13
  • 基于redis实现的点赞功能设计思路详解
    前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysq...
    99+
    2022-06-04
    详解 思路 功能设计
  • 使用Redis实现点赞取消点赞的详细代码
    前言 异步实现 代码实现: private void like(long userId,int type,int textId,long entityUserId){ ...
    99+
    2022-11-13
  • Android中Listview点赞功能的实现
    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路。 基本思路: 进入界面–》获取数据–》 在Listview中显示–》 通过...
    99+
    2022-06-06
    listview Android
  • Android PraiseTextView实现朋友圈点赞功能
    PraiseTextView 说明 我是将朋友圈分成了几个独立模块单独自定义的View,通过回调完成交互,耦合性算是非常低了,主要有以下及部分: 1.评论布局(自定义TextV...
    99+
    2022-06-06
    朋友圈 Android
  • JavaScript如何实现评论点赞功能
    这篇文章主要为大家展示了“JavaScript如何实现评论点赞功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何实现评论点赞功能”这篇文...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作