将redis的哈希点赞数量同步到MySQL用springboot实现
时间: 2023-05-27 18:01:59 浏览: 90
首先,在Spring Boot项目中,需要引入Redis和MySQL的相关依赖。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
```
接着,需要配置Redis和MySQL的连接参数。在application.properties中添加以下配置:
```properties
# Redis
spring.redis.host=localhost
spring.redis.port=6379
# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
```
然后,创建一个RedisUtil工具类,实现Redis数据的存储和读取。具体实现过程如下:
```java
@Component
public class RedisUtil {
private RedisTemplate<String, Object> redisTemplate;
@Autowired
public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 存储键值对
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
// 获取键对应的值
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
// 哈希存储
public void hset(String key, String hashKey, Object value) {
redisTemplate.opsForHash().put(key, hashKey, value);
}
// 哈希读取
public Object hget(String key, String hashKey) {
return redisTemplate.opsForHash().get(key, hashKey);
}
}
```
接下来,我们需要创建一个服务类来实现点赞数量的同步。首先,需要定义一个点赞实体类Like。该类包含两个属性:点赞用户ID和点赞时间。
```java
@Entity
public class Like {
@Id
private Long userId;
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
// Getters and Setters
}
```
然后,创建点赞服务LikeService,用于实现两个功能:记录点赞和获取点赞数量。具体实现如下:
```java
@Service
public class LikeService {
@Autowired
private RedisUtil redisUtil;
@Autowired
private LikeRepository likeRepository;
// 记录点赞
public void like(Long postId, Long userId) {
// 1. 更新Redis中的点赞数量
String key = "posts:" + postId + ":likes";
redisUtil.hset(key, String.valueOf(userId), true);
// 2. 记录点赞用户ID和时间
Like like = new Like();
like.setUserId(userId);
like.setTimestamp(new Date());
likeRepository.save(like);
}
// 获取点赞数量
public Long getLikeCount(Long postId) {
String key = "posts:" + postId + ":likes";
Map<Object, Object> resultMap = redisUtil.redisTemplate.opsForHash().entries(key);
return Long.valueOf(resultMap.size());
}
}
```
上述代码中,记录点赞时,我们先通过RedisUtil将点赞数量保存到Redis中。同时,我们还要将点赞用户ID和时间记录到MySQL中。在获取点赞数量时,我们先通过RedisUtil从Redis中读取点赞数量,如果Redis中没有相应的记录,就从MySQL中读取点赞数量。最后,将点赞数量返回。
最后,我们需要在Controller中实现点赞操作和获取点赞数量的接口。具体实现如下:
```java
@RestController
@RequestMapping("/posts")
public class PostController {
@Autowired
private LikeService likeService;
// 点赞接口
@PostMapping("/{postId}/like")
public ResponseEntity<ApiResponse> like(@PathVariable Long postId,
@RequestParam Long userId) {
likeService.like(postId, userId);
return ResponseEntity.ok(ApiResponse.success());
}
// 获取点赞数量接口
@GetMapping("/{postId}/likeCount")
public ResponseEntity<ApiResponse> getLikeCount(@PathVariable Long postId) {
Long likeCount = likeService.getLikeCount(postId);
Map<String, Object> data = new HashMap<>();
data.put("likeCount", likeCount);
return ResponseEntity.ok(ApiResponse.success(data));
}
}
```
以上就是将Redis的哈希点赞数量同步到MySQL用Spring Boot实现的方法。通过这种方式,可以大大提高系统的性能和并发处理能力。