使用代码实现上面的问题
时间: 2024-02-23 08:59:53 浏览: 14
好的,这里提供一个简单的实现代码,仅供参考:
1. 引入Redis依赖和配置文件
在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
在application.properties文件中配置Redis连接信息:
```properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
```
2. 定义SearchService类
```java
@Service
public class SearchService {
private final RedisTemplate<String, String> redisTemplate;
private static final String SEARCH_RANK = "search:rank";
public SearchService(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 更新搜索词的热度
public void updateSearchRank(String keyword) {
String key = keyword.trim().toLowerCase();
long timestamp = System.currentTimeMillis() / 1000; // 当前时间戳
redisTemplate.opsForZSet().add(SEARCH_RANK, key, timestamp);
}
// 获取当前热搜榜
public List<String> getSearchRank() {
Set<String> set = redisTemplate.opsForZSet().reverseRange(SEARCH_RANK, 0, 9);
return new ArrayList<>(set);
}
// 处理搜索请求
public void search(String keyword) {
String key = keyword.trim().toLowerCase();
redisTemplate.opsForValue().increment(key);
updateSearchRank(key);
}
}
```
3. 定义Controller类
```java
@RestController
public class SearchController {
private final SearchService searchService;
public SearchController(SearchService searchService) {
this.searchService = searchService;
}
// 搜索接口
@PostMapping("/search")
public void search(@RequestParam String keyword) {
searchService.search(keyword);
}
// 热搜榜接口
@GetMapping("/rank")
public List<String> rank() {
return searchService.getSearchRank();
}
}
```
4. 定义定时任务
```java
@Configuration
@EnableScheduling
public class ScheduleConfig {
private final RedisTemplate<String, String> redisTemplate;
private static final String SEARCH_RANK = "search:rank";
public ScheduleConfig(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 每隔5分钟清除过期的搜索词
@Scheduled(fixedDelay = 5 * 60 * 1000)
public void clearExpiredSearchRank() {
long timestamp = System.currentTimeMillis() / 1000 - 30 * 24 * 60 * 60; // 30天前的时间戳
redisTemplate.opsForZSet().removeRangeByScore(SEARCH_RANK, 0, timestamp);
}
}
```
以上是一个简单的实现代码,可能还需要根据实际情况进行优化和完善。