基于redis点赞功能的实现

Util

1 JedisAdapter

package com.cyq.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.List;
//点赞功能利用set实现
@Service
public class JedisAdapter implements InitializingBean {
    private static final Logger logger = LoggerFactory.getLogger(JedisAdapter.class);
    private JedisPool pool;

    @Override
    public void afterPropertiesSet() throws Exception {
    //新建连接池
        pool = new JedisPool("redis://localhost:6379/10");
    }

   //新增
    public long sadd(String key, String value) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.sadd(key, value);
        } catch (Exception e) {
            logger.error("发生异常" + e.getMessage());
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return 0;
    }
   //移除
    public long srem(String key, String value) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.srem(key, value);
        } catch (Exception e) {
            logger.error("发生异常" + e.getMessage());
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return 0;
    }
    //计数
    public long scard(String key) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.scard(key);
        } catch (Exception e) {
            logger.error("发生异常" + e.getMessage());
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return 0;
    }
    //是否存在
    public boolean sismember(String key, String value) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.sismember(key, value);
        } catch (Exception e) {
            logger.error("发生异常" + e.getMessage());
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return false;
    }
}

2 RedisKeyUtil:生成key字段

package com.cyq.util;
public class RedisKeyUtil {
    private static String SPLIT = ":";
    private static String BIZ_LIKE = "LIKE";
    private static String BIZ_DISLIKE = "DISLIKE";
    private static String BIZ_EVENTQUEUE = "EVENT_QUEUE";
   //生成点赞字段
    public static String getLikeKey(int entityType, int entityId) {
        return BIZ_LIKE + SPLIT + String.valueOf(entityType) + SPLIT + String.valueOf(entityId);
    }
  //生成踩字段
    public static String getDisLikeKey(int entityType, int entityId) {
        return BIZ_DISLIKE + SPLIT + String.valueOf(entityType) + SPLIT + String.valueOf(entityId);
    }
    public static String getEventQueueKey() {
        return BIZ_EVENTQUEUE;
    }
}

Service

package com.cyq.service;

import com.cyq.util.JedisAdapter;
import com.cyq.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LikeService {
    @Autowired
    JedisAdapter jedisAdapter;
    //获得点赞数量
    public long getLikeCount(int entityType, int entityId) {
        String likeKey = RedisKeyUtil.getLikeKey(entityType, entityId);
        return jedisAdapter.scard(likeKey);
    }
    //获得点赞状态
    public int getLikeStatus(int userId, int entityType, int entityId) {
        String likeKey = RedisKeyUtil.getLikeKey(entityType, entityId);
        //点赞状态 1
        if (jedisAdapter.sismember(likeKey, String.valueOf(userId))) {
            return 1;
        }
          //踩状态 -1  不踩不点赞0
        String disLikeKey = RedisKeyUtil.getDisLikeKey(entityType, entityId);
        return jedisAdapter.sismember(disLikeKey, String.valueOf(userId)) ? -1 : 0;
    }
   //点赞
    public long like(int userId, int entityType, int entityId) {
        //喜欢加,踩移除
        String likeKey = RedisKeyUtil.getLikeKey(entityType, entityId);
        jedisAdapter.sadd(likeKey, String.valueOf(userId));
        String disLikeKey = RedisKeyUtil.getDisLikeKey(entityType, entityId);
        jedisAdapter.srem(disLikeKey, String.valueOf(userId));
        return jedisAdapter.scard(likeKey);
    }
   //踩
    public long disLike(int userId, int entityType, int entityId) {
          //喜欢移除,踩加
        String disLikeKey = RedisKeyUtil.getDisLikeKey(entityType, entityId);
        jedisAdapter.sadd(disLikeKey, String.valueOf(userId));
        String likeKey = RedisKeyUtil.getLikeKey(entityType, entityId);
        jedisAdapter.srem(likeKey, String.valueOf(userId));
        return jedisAdapter.scard(likeKey);
    }
}

Controller

package com.cyq.controller;

import com.cyq.async.EventModel;
import com.cyq.async.EventProducer;
import com.cyq.async.EventType;
import com.cyq.model.Comment;
import com.cyq.model.EntityType;
import com.cyq.model.HostHolder;
import com.cyq.service.CommentService;
import com.cyq.service.LikeService;
import com.cyq.service.MessageService;
import com.cyq.util.WendaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class LikeController {
    @Autowired
    LikeService likeService;
    @Autowired
    HostHolder hostHolder;
    @Autowired
    CommentService commentService;
    @Autowired
    EventProducer eventProducer;
     //点赞
    @RequestMapping(path = {"/like"}, method = {RequestMethod.POST})
    @ResponseBody
    public String like(@RequestParam("commentId") int commentId) {
        if (hostHolder.getUser() == null) {
            //未登录状态
            return WendaUtil.getJSONString(999);
        }
        //通过id获得评论
        Comment comment = commentService.getCommentById(commentId);    
        long likeCount = likeService.like(hostHolder.getUser().getId(), EntityType.ENTITY_COMMENT, commentId);
        return WendaUtil.getJSONString(0, String.valueOf(likeCount));
    }
    //踩
    @RequestMapping(path = {"/dislike"}, method = {RequestMethod.POST})
    @ResponseBody
    public String dislike(@RequestParam("commentId") int commentId) {
        if (hostHolder.getUser() == null) {
            return WendaUtil.getJSONString(999);
        }

        long likeCount = likeService.disLike(hostHolder.getUser().getId(), EntityType.ENTITY_COMMENT, commentId);
        return WendaUtil.getJSONString(0, String.valueOf(likeCount));
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot整合Redis点赞功能的简单实现步骤如下: 1. 首先,需要在pom.xml文件中添加Redis和Jedis的依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3..1</version> </dependency> ``` 2. 在application.properties文件中配置Redis的连接信息: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= ``` 3. 创建一个RedisUtil类,用于连接Redis并提供点赞相关的方法: ``` @Component public class RedisUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; public void like(String key, String value) { redisTemplate.opsForSet().add(key, value); } public void unlike(String key, String value) { redisTemplate.opsForSet().remove(key, value); } public boolean isLiked(String key, String value) { return redisTemplate.opsForSet().isMember(key, value); } public long countLikes(String key) { return redisTemplate.opsForSet().size(key); } } ``` 4. 在Controller中使用RedisUtil提供的方法实现点赞功能: ``` @RestController public class LikeController { @Autowired private RedisUtil redisUtil; @PostMapping("/like") public void like(@RequestParam String key, @RequestParam String value) { redisUtil.like(key, value); } @PostMapping("/unlike") public void unlike(@RequestParam String key, @RequestParam String value) { redisUtil.unlike(key, value); } @GetMapping("/isLiked") public boolean isLiked(@RequestParam String key, @RequestParam String value) { return redisUtil.isLiked(key, value); } @GetMapping("/countLikes") public long countLikes(@RequestParam String key) { return redisUtil.countLikes(key); } } ``` 以上就是Spring Boot整合Redis点赞功能的简单实现。 ### 回答2: Spring Boot和Redis都是非常流行的技术,它们都可以轻松地实现各种功能,其中包括点赞功能。本篇文章主要介绍如何使用Spring Boot和Redis实现一个简单的点赞功能。 1. 首先,我们要在pom.xml文件中添加Spring Boot的依赖,以及Jedis依赖。Jedis是一个专门与Redis交互的Java客户端,可以方便地操作Redis。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.3</version> </dependency> ``` 2. 接下来,我们要在application.properties文件中配置Redis连接信息。 ```properties spring.redis.database=0 spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 ``` 3. 然后,我们要创建一个RedisTemplate实例,以便于操作Redis。 ```java @Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } } ``` 4. 接下来,我们要创建一个点赞服务实现类并注入RedisTemplate实例。 ```java @Service public class VoteServiceImpl implements VoteService { private final RedisTemplate<String, Object> redisTemplate; @Autowired public VoteServiceImpl(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public void vote(String userId, Long itemId) { String key = "vote:" + itemId; redisTemplate.opsForSet().add(key, userId); } @Override public Long count(Long itemId) { String key = "vote:" + itemId; return redisTemplate.opsForSet().size(key); } } ``` 在这个实现类中,我们创建了两个方法,vote和count,分别用来进行点赞和获取点赞数量。通过使用RedisTemplate实例的opsForSet方法,我们可以方便地对集合进行添加元素和获取元素的操作。 5. 最后,我们可以在Controller中调用这个服务类,实现点赞功能。 ```java @RestController public class VoteController { private final VoteService voteService; @Autowired public VoteController(VoteService voteService) { this.voteService = voteService; } @PostMapping("/vote") public void vote(@RequestParam String userId, @RequestParam Long itemId) { voteService.vote(userId, itemId); } @GetMapping("/count") public Long count(@RequestParam Long itemId) { return voteService.count(itemId); } } ``` 至此,我们就只需要发送一个POST请求到"/vote"路径,并附带上userId和itemId参数,就可以对该itemId进行点赞了。而发送一个GET请求到"/count"路径,并附带上itemId参数,则可以获取到该itemId的点赞数。 短短几行代码就实现点赞功能,而且使用Redis做后台存储,性能和稳定性都更好。在实际开发过程中,如果需要高并发、高可用的点赞功能Redis就是一种非常好的选择。 ### 回答3: SpringBoot是基于Spring框架的快速开发脚手架,而Redis是著名的内存数据库,具有高性能、分布式、数据持久化等特点。在实现点赞功能时,我们常常使用Redis来存储点赞信息,以提高访问效率和减轻数据库的压力。 下面是SpringBoot整合Redis点赞功能的简单实现步骤: 1. 引入相关依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接信息 在application.properties文件中配置Redis连接信息,例如: ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 ``` 3. 创建Redis操作类 创建一个RedisUtil类,用于实现Redis的操作。例如: ``` @Component public class RedisUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; public void increment(String key) { redisTemplate.opsForValue().increment(key); } public Long get(String key) { return (Long) redisTemplate.opsForValue().get(key); } public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } } ``` 在该类中,我们使用@Autowired注解注入了RedisTemplate实例,调用其相关方法实现Redis的操作,例如增加点赞数、获取点赞数、设置点赞信息等。 4. 实现点赞功能实现点赞功能的Controller中,我们可以使用RedisUtil来操作Redis,例如: ``` @RestController public class LikeController { @Autowired private RedisUtil redisUtil; @GetMapping("/like/{id}") public String like(@PathVariable Long id) { String key = "article:like:" + id; redisUtil.increment(key); // 点赞数增加1 return "点赞成功"; } @GetMapping("/like/count/{id}") public Long count(@PathVariable Long id) { String key = "article:like:" + id; return redisUtil.get(key); // 获取点赞数 } } ``` 在这里,我们可以将Redis的键名定义为“article:like:{文章id}”,并使用increment方法实现点赞数的增加。需要注意的是,我们可以使用String类型来存储点赞数,但是如果需要保证点赞数的原子性操作,我们可以使用Redis中提供的incr命令。 这样,我们就实现点赞功能的简单实现。在实际生产中,我们可能还需要考虑点赞数的过期时间、防止重复点赞等问题,但是这里仅仅是提供了一个基础的实现思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值