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

回到顶部