redis的INCRkey实现简单的访问量统计
redis 的 INCR key 实现简单的访问量统计
redis INCR 文档
- 文档
思路
- 例用redis的incr 在详情页面写一个方法,对访问进行自增统计。
- 获取incr 的所有key,进行排序展示
- 这里需要注意,取所有的key 的时候,不能用keys ,因为redis 单线程的,大量的遍历kye,可能会导致redis出现阻塞,所以我们使用scan
代码
存
/**
* Redis Incr 自增
* @param serviceName
* @param id
*/
public void redisCount(String serviceName,String id){
boolean flag = redisTemplate.hasKey(serviceName +":"+ id);
//不存在
if (!flag){
GenericToStringSerializer genericToStringSerializer = new GenericToStringSerializer(Object.class);
redisTemplate.setValueSerializer(genericToStringSerializer);
redisTemplate.opsForValue().set(serviceName +":"+ id, 1);
} else {
redisTemplate.opsForValue().increment(serviceName +":"+ id);
}
}
这里的setValueSerializer,是因为值初始化序列的是String,所以这里需要序列化可以存储数值类型的
- 取
/**
* 通过redis的scan 获取所有的keys
* @param key
* @return
*/
public void scan(String pattern, Consumer<byte[]> consumer) {
this.stringRedisTemplate.execute((RedisConnection connection) -> {
try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(pattern).build())) {
cursor.forEachRemaining(consumer);
return null;
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
});
}
/**
* 获取符合条件的key
* @param pattern 表达式
* @return
*/
public List<String> keys(String pattern) {
List<String> keys = new ArrayList<>();
this.scan(pattern, item -> {
//符合条件的key
String key = new String(item, StandardCharsets.UTF_8);
keys.add(key);
});
return keys;
}
关于scan取的方式以及介绍,这里查看参考了网上的资料。
资料地址
以上是 redis的INCRkey实现简单的访问量统计 的全部内容, 来源链接: utcz.com/z/515750.html