redis分布式缓存一一 帖子点赞解决方案~

Posted SharingOfficer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis分布式缓存一一 帖子点赞解决方案~相关的知识,希望对你有一定的参考价值。

嗨~大家好,这里是SharingOfficer,一起来聊一聊帖子点赞解决方案,咱们往下看😉

点赞业务场景分析

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

点赞的技术方案

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

以上是关于redis分布式缓存一一 帖子点赞解决方案~的主要内容,如果未能解决你的问题,请参考以下文章

Java面试之Redis

redis应用场景

面试干货10——聊一聊Redis的应用吧!(实现分布式锁缓存抽奖热搜点赞商品筛选..)

面试干货10——聊一聊Redis的应用吧!(实现分布式锁缓存抽奖热搜点赞商品筛选..)

Redis中的Sharding分片机制

Redis帖子相关功能实现 (发布笔记查看笔记点赞功能点赞排行榜)