双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

个人技术总结——Redis实现点赞点踩功能

fzu_lsq fzu_lsq 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这个作业属于哪个课程软件工程-23年春季学期
这个作业要求在哪里软件工程实践总结&个人技术总结
这个作业的目标个人技术总结
其他参考文献《构建之法》

目录

  • 一、技术概述
  • 二、技术详述
  • 三、技术使用中遇到的问题和解决过程
  • 四、总结
  • 参考文献

一、技术概述

Redis实现点赞点踩功能,因为点赞功能经常会被使用,热门文章可能在同一时刻会出现大量点赞的情况,
如果由mysql数据库直接进行点赞记录的更新,数据库的压力会很大,所以采用Redis数据库进行优化,
Redis中的数据存储在内存中,内存的读写速度都很快,因此能够满足点赞模块的性能要求。学习该技术
的原因的团队项目需要用到。

二、技术详述

下面基于我们团队项目的实现来讲解,我们的应用场景是对真题进行点赞点踩。

  1. 使用springboot框架来实现点赞,首先在pom.xml文件中导入redis的依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 在application.properties文件中编写配置信息

    //其实下面的配置可以不写,如果不写的话就用的是默认值
    spring.redis.host=127.0.0.1  //redis数据库地址,默认值是127.0.0.1
    spring.redis.port=6379    //redis端口,默认是6379
    spring.redis.database=0   //选择要使用的是几号数据库,默认是0
    spring.redis.password=123456 //如果没有密码,这行可以不写,默认是没有
    
  3. 编写控制层代码(controller)

  • 点赞控制类

    @RestController
    @CrossOrigin
    @RequestMapping("like")
    public class LikeController {
        @Autowired
        StringRedisTemplate redisTemplate;
    
        //点赞
        @PostMapping("like")
        public Result like(@RequestBody LikeArgu likeArgu) {
            String key1 = "likes:" + likeArgu.getT_id();
            String key2 = "dislikes:" + likeArgu.getT_id();
            //添加点赞记录
            redisTemplate.opsForSet().add(key1, likeArgu.getU_id());
            //如果该用户有点踩的话,把踩取消
            redisTemplate.opsForSet().remove(key2, likeArgu.getU_id());
            return Result.success();
        }
    
        //取消点赞
        @PostMapping("unlike")
        public Result unlike(@RequestBody LikeArgu likeArgu) {
            String key = "likes:" + likeArgu.getT_id();
            redisTemplate.opsForSet().remove(key, likeArgu.getU_id());
            return Result.success();
        }
    
        //检查是否点赞,u_id为用户id, t_id为题目id
        @GetMapping("isLiked")
        public Result<Boolean> isLiked(@RequestParam("u_id") String u_id, @RequestParam("t_id") Integer t_id) {
            String key = "likes:" + t_id;
            return Result.success("请求成功", redisTemplate.opsForSet().isMember(key, u_id));
        }
    
        //返回点赞总数,t_id为题目id
        @GetMapping("likeCount")
        public Result<Long> getLikeCount(@RequestParam("t_id") Integer t_id) {
            String key = "likes:" + t_id;
            return Result.success("请求成功", redisTemplate.opsForSet().size(key));
        }
    
    }
    
  • 点踩控制类

    @RestController
    @CrossOrigin
    @RequestMapping("dislike")
    public class DisLikeController {
        @Autowired
        StringRedisTemplate redisTemplate;
    
        //点踩
        @PostMapping("dislike")
        public Result dislike(@RequestBody LikeArgu likeArgu) {
            String key1 = "dislikes:" + likeArgu.getT_id();
            String key2 = "likes:" + likeArgu.getT_id();
            //添加点踩记录
            redisTemplate.opsForSet().add(key1, likeArgu.getU_id());
            //如果该用户有点赞的话,把赞取消
            redisTemplate.opsForSet().remove(key2, likeArgu.getU_id());
            return Result.success();
        }
    
        //取消点踩
        @PostMapping("undislike")
        public Result undislike(@RequestBody LikeArgu likeArgu) {
            String key = "dislikes:" + likeArgu.getT_id();
            redisTemplate.opsForSet().remove(key, likeArgu.getU_id());
            return Result.success();
        }
    
        //检查是否点踩,u_id为用户id, t_id为题目id
        @GetMapping("isDisliked")
        public Result<Boolean> isDisliked(@RequestParam("u_id") String u_id, @RequestParam("t_id") Integer t_id) {
            String key = "dislikes:" + t_id;
            return Result.success("请求成功", redisTemplate.opsForSet().isMember(key, u_id));
        }
    
        //返回点踩总数,t_id为题目id
        @GetMapping("dislikeCount")
        public Result<Long> getDislikeCount(@RequestParam("t_id") Integer t_id) {
            String key = "dislikes:" + t_id;
            return Result.success("请求成功", redisTemplate.opsForSet().size(key));
        }
    }
    
  1. 这里贴上在控制层会用到的参数类和响应类
  • 点赞点踩参数类

    public class LikeArgu {
        String u_id;
        Integer t_id;
    
        public String getU_id() {
            return u_id;
        }
    
        public void setU_id(String u_id) {
            this.u_id = u_id;
        }
    
        public Integer getT_id() {
            return t_id;
        }
    
        public void setT_id(Integer t_id) {
            this.t_id = t_id;
        }
    }
    
  • 响应实体类

    public class Result<T> {
        private Integer code;
        private String msg;
        private T data;
    
        public static Result success() {
            return new Result(200, "请求成功", null);
        }
    
        public static Result success(String msg) {
            return new Result(200, msg, null);
        }
    
        public static <T> Result<T> success(String msg, T data) {
            return new Result(200, msg, data);
        }
    
        public static Result error() {
            return new Result(500, "请求失败", null);
        }
    
        public static Result error(String msg) {
            return new Result(500, msg, null);
        }
    
        public static Result error(Integer code, String msg) {
            return new Result(code, msg, null);
        }
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    }
    

三、技术使用中遇到的问题和解决过程

  1. 问题

    • 在对StringRedisTemplate类进行依赖注入时出现的报错问题

      Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'redisTemplate' is expected to be of type 'org.springframework.data.redis.core.StringRedisTemplate' but was actually of type 'org.springframework.data.redis.core.RedisTemplate'
      
    • 具体问题是依赖注入的类型不对,它把RedisTemplate注入到StringRedisTemplate类型上了,所以导致了程序报错。

    • 具体报错的代码为

      @Resource
      StringRedisTemplate redisTemplate;
      
  2. 具体原因和解决过程

四、总结

使用redis来优化mysql能带来效率上的很大提升,但直接使用redis会出现一些问题,比如redis的持久化问题,以及redis的内存不足问题,在实际项目中往往还是redis+mysql来实现点赞功能,在redis中存储热门文章的点赞信息,前端需要点赞信息时首先去redis中查找,如果未找到则去mysql数据库中查询,并将数据缓存到redis中,并定期将redis数据库中的数据刷新到mysql中,因此,我还有许多东西需要学习,希望自己能继续努力。

参考文献

Redis教程

...全文

相关推荐

基于Java_SpringBoot_Mybatis_Velocity技术栈开发的仿知乎SNS资讯社交平台_包含用户注册登录_问题发布与敏感词过滤_评论站内信_Redis点赞踩_异步.zip

基于Java_SpringBoot_Mybatis_Velocity技术栈开发的仿知乎SNS资讯社交平台_包含用户注册登录_问题发布与敏感词过滤_评论站内信_Redis点赞踩_异步.zip

gaoxu666666

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

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

weixin_38704701

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

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

weixin_38730331

redis实现点赞功能模块.rar

java结合redis实现点赞功能,配置文件、代码都已打包,注意我的是linux服务器下的redis

谦风(Java)

php+mysql+ajax点赞和踩的功能

php+mysql+ajax点赞和踩的功能,自己总结的一点经验,希望能帮到大家

尔霜水也
评论
收藏 已收藏
分享
返回顶部