使用ZSet实现访问频率统计,示例使用RedisTemplate
时间: 2024-04-30 15:19:41 浏览: 104
实现统计网站被访问次数功能
好的,下面是一个使用 RedisTemplate 实现访问频率统计的示例:
```java
public class AccessFrequencyCounter {
private RedisTemplate<String, Long> redisTemplate;
public AccessFrequencyCounter(RedisTemplate<String, Long> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void count(String key) {
String today = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
String redisKey = "access:" + today;
redisTemplate.opsForZSet().incrementScore(redisKey, key, 1);
redisTemplate.expire(redisKey, Duration.ofDays(1));
}
public List<String> getTopAccessed(int n) {
String today = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
String redisKey = "access:" + today;
Set<String> keys = redisTemplate.opsForZSet().reverseRange(redisKey, 0, n-1);
return new ArrayList<>(keys);
}
}
```
使用示例:
```java
RedisTemplate<String, Long> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(new JedisConnectionFactory());
redisTemplate.afterPropertiesSet();
AccessFrequencyCounter counter = new AccessFrequencyCounter(redisTemplate);
counter.count("page1");
counter.count("page2");
counter.count("page1");
counter.count("page3");
List<String> topAccessed = counter.getTopAccessed(2);
System.out.println(topAccessed); // 输出 [page1, page3]
```
在这个示例中,我们使用 Redis 的 ZSet 数据结构来保存每个页面的访问次数。对于每个访问,我们将对应页面的分数(即访问次数)加 1。我们将每天的访问数据保存在一个以“access:日期”为 key 的 ZSet 中,并设置过期时间为 1 天。最后,我们提供了一个 getTopAccessed 方法,可以获取访问次数排名前 n 的页面。
阅读全文