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取的方式以及介绍,这里查看参考了网上的资料。 资料地址
-
来源:oschina
链接:https://my.oschina.net/u/2971292/blog/3304768