redis 的 INCR key 实现简单的访问量统计

和自甴很熟 提交于 2020-04-22 16:26:31

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取的方式以及介绍,这里查看参考了网上的资料。 资料地址

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!