我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么利用Redis实现点赞功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么利用Redis实现点赞功能

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

下载Word文档

猜你喜欢

怎么利用Redis实现点赞功能

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

利用Redis实现点赞功能的示例代码

目录mysql 和 Redis优缺点1、Redis 缓存设计及实现部分代码如下Redis 存储结构如图2、数据库设计3、开启定时任务持久化存储到数据库部分代码如下提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对我们来说并不陌生,我
2022-06-28

利用Java实现一个短视频点赞功能

这篇文章将为大家详细讲解有关利用Java实现一个短视频点赞功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 这行代码是弹出点赞的时间为18s.18秒后发生了什么呢 ?继续看 可以看到这个弹
2023-05-31

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

本文小编为大家详细介绍“vue怎么实现静态页面点赞和取消点赞功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现静态页面点赞和取消点赞功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:点击
2023-06-29

如何使用Redis实现点赞取消点赞

这篇文章将为大家详细讲解有关如何使用Redis实现点赞取消点赞,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码实现:/** * * @param userId 点赞的人 * @p
2023-06-29

百万用户量redis点赞怎么实现

要实现百万用户量的Redis点赞功能,可以使用Redis的有序集合(Sorted Set)数据结构来实现。首先,需要为每个被点赞的对象(比如文章、评论、图片等)创建一个有序集合,用来存储用户的点赞信息。集合的成员可以是用户的唯一标识符,而分
2023-09-04

PHP+Redis怎么实现点赞效果

这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在PHP+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所
2023-06-04

Android中Listview点赞功能的实现

最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路。 基本思路: 进入界面–》获取数据–》 在Listview中显示–》 通过map集合(position,boolean)保存每一行是否被点
2022-06-06

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

前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等。 直接写入Mysql 直接写
2022-06-04

php如何实现点赞取消功能

本篇内容介绍了“php如何实现点赞取消功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php实现点赞取消功能的方法:首先判断用户是否点赞;
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录