阅读 140

redis分布式缓存(二十二)一一 帖子点赞解决方案

点赞业务场景分析

  • 点赞或取消点赞,用户点击功能

  • 看帖子信息:通过用户id和帖子id,查看该帖子的点赞数、该用户是否点赞状态。

image.png

点赞的技术方案

点赞的关键技术就是要判断该用户是否点赞,已重复点赞的不允许再点赞,即过滤重复,虽然业务不复杂,可以采用数据库直接实现,但是对于微博这种高并发的场景,不可能查数据库的,一般是缓存,即redis

  1. 点赞或取消点赞,用户点击功能

采用的是redis的set数据结构,key=like:postid    value={userid}

采用sadd命令,添加点赞

127.0.0.1:6379> sadd like:1000 101 (integer) 1 127.0.0.1:6379> sadd like:1000 102 (integer) 1 127.0.0.1:6379> sadd like:1000 103 (integer) 1 127.0.0.1:6379> smembers like:1000 1) "101" 2) "102" 3) "103"  复制代码

采用srem命令,取消点赞

127.0.0.1:6379> srem like:1000 101 (integer) 1 127.0.0.1:6379> smembers like:1000 1) "102" 2) "103" 复制代码

  1. 查看帖子信息:通过用户id 和帖子id,查看该帖子的点赞数、该用户是否点赞状态。

采用scard命令,点赞总数

127.0.0.1:6379> smembers like:1000 1) "102" 2) "103" 127.0.0.1:6379> scard like:1000 (integer) 2 复制代码

采用sismember命令,判断是否点赞

127.0.0.1:6379> smembers like:1000 1) "102" 2) "103" 127.0.0.1:6379> sismember like:1000 102 (integer) 1 127.0.0.1:6379> sismember like:1000 101 (integer) 0 复制代码

案例实战:SpringBoot+Redis 实现微博点赞

点赞

     /**      * 点赞      */     @GetMapping(value = "/dolike")     public String dolike(int postid,int userid) {         String result="";         try {             String key=Constants.LIKE_KEY+postid;             long object = this.redisTemplate.opsForSet().add(key,userid);             if (object==1){                 result="点赞成功";             }else{                 result="你已重复点赞";             }             log.info("查询结果:{}", object);         } catch (Exception ex) {             log.error("exception:", ex);         }         return result;     } 复制代码

取消点赞

    /**      * 取消点赞      */     @GetMapping(value = "/undolike")     public String undolike(int postid,int userid) {         String result="";         try {             String key=Constants.LIKE_KEY+postid;             long object = this.redisTemplate.opsForSet().remove(key,userid);             if (object==1){                 result="取消成功";             }else{                 result="你已重复取消点赞";             }             log.info("查询结果:{}", object);         } catch (Exception ex) {             log.error("exception:", ex);         }         return result;     } 复制代码

帖子点赞总数和是否点赞

    /**      * 根据postid userid查看帖子信息,返回结果是点赞总数和是否点赞      */     @GetMapping(value = "/getpost")     public Map getpost(int postid,int userid) {         Map map=new HashMap();         String result="";         try {             String key=Constants.LIKE_KEY+postid;             long size = this.redisTemplate.opsForSet().size(key);             boolean bo=this.redisTemplate.opsForSet().isMember(key,userid);             map.put("size",size);             map.put("isLike",bo);             log.info("查询结果:{}", map);         } catch (Exception ex) {             log.error("exception:", ex);         }         return map;     } 复制代码

点赞明细

    /**      * 查看点赞明细,就是有哪些人      */     @GetMapping(value = "/likedetail")     public Set likedetail(int postid) {         Set set=null;         try {             String key=Constants.LIKE_KEY+postid;             set = this.redisTemplate.opsForSet().members(key);             log.info("查询结果:{}", set);         } catch (Exception ex) {             log.error("exception:", ex);         }         return set;     }


作者:小伙子vae
链接:https://juejin.cn/post/7035118058297360421


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐