如何在Redis中实现点赞功能?
时间: 2024-09-21 11:08:07 浏览: 32
在Redis中实现点赞功能通常涉及到键值对操作,可以采用集合(Set)数据结构来存储用户的ID和文章的ID之间的关联关系。以下是简单的步骤:
1. **创建用户赞表**:对于每个文章(例如 article_id),创建一个名为 `likes_article_<article_id>` 的集合,用于存储喜欢该文章的所有用户的ID。
```shell
SET likes_article_123 {user1_id, user2_id}
```
2. **增加点赞**:当用户点击“赞”时,检查他们是否已经点赞过,如果没有则添加到集合中。
```shell
SADD likes_article_123 user4_id
```
3. **减少点赞**:如果用户想要取消点赞,从集合中移除他们的ID。
```shell
SREM likes_article_123 user4_id
```
4. **获取点赞数**:查询集合的成员数即可得知某个文章有多少人点赞。
```shell
SLEN likes_article_123
```
5. **遍历点赞记录**:为了展示所有点赞过的用户列表,可以在应用层面上遍历集合并提取用户ID。
需要注意的是,Redis虽然方便实时操作,但如果需要持久化存储并支持大规模并发,可能会选择结合数据库如RDB或AOF以及缓存穿透等问题的处理。另外,安全性方面也需考虑防止恶意请求导致集合膨胀。
相关问题
redis实现点赞功能
Redis 可以很方便地实现点赞功能。以下是一种实现方式:
假设有一个文章,它的 ID 是 1,用户 ID 是 1001。用户点赞这篇文章,可以按照以下步骤操作:
1. 使用 Redis 的 SET 命令将用户 ID 加入文章的点赞集合中:
```
SADD article:1:likes 1001
```
这里的 `article:1:likes` 是集合的键名,代表文章 ID 为 1 的点赞集合。
2. 使用 Redis 的 SCARD 命令获取点赞数:
```
SCARD article:1:likes
```
3. 使用 Redis 的 SISMEMBER 命令检查某个用户是否已经点赞:
```
SISMEMBER article:1:likes 1001
```
如果返回值为 1,则表示用户已经点赞;如果返回值为 0,则表示用户还没有点赞。
4. 使用 Redis 的 SREM 命令取消点赞:
```
SREM article:1:likes 1001
```
这种方式可以很方便地实现点赞功能,并且支持对点赞数进行统计。如果需要支持取消点赞,也很容易实现。同时,因为 Redis 的集合是无序的,所以不需要担心重复点赞的问题。
springboot+redis+QuartzConfig点赞功能的实现
首先,在pom.xml文件中添加redis和quartz依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
```
然后在application.properties文件中添加redis和quartz的配置:
```properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
# Quartz Configuration
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.threadCount = 10
```
接着,创建一个RedisService类来操作Redis:
```java
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Long incr(String key) {
return redisTemplate.opsForValue().increment(key);
}
public Long decr(String key) {
return redisTemplate.opsForValue().decrement(key);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
}
```
然后,创建一个LikeJob类来定时将点赞次数写入数据库:
```java
public class LikeJob implements Job {
@Autowired
private RedisService redisService;
@Autowired
private LikeService likeService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Object likeCount = redisService.get("like_count");
if (likeCount != null) {
int count = Integer.parseInt(likeCount.toString());
likeService.writeLikeCount(count);
redisService.set("like_count", 0);
}
}
}
```
最后,创建一个LikeController类来接收点赞请求:
```java
@RestController
public class LikeController {
@Autowired
private RedisService redisService;
@GetMapping("/like")
public String like() {
redisService.incr("like_count");
return "success";
}
}
```
这样,每次访问 /like 接口时,Redis中的like_count计数器就会加1,而定时任务会在固定时间将计数器的值写入数据库,并将计数器重置为0。这样就实现了点赞功能。
阅读全文