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

原创
04/22 15:08
阅读数 324

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;
    	}
    
    	/**
    	 * 获取符合条件的keys  上面的方法合并
    	 * @param pattern	表达式
    	 * @return
    	 */
    
    	public Set<String> getKeys(String key){
    		Set<String> stringSet = null;
    		try (Cursor<byte[]> cursor = redisTemplate.execute(
    				(RedisConnection connection) ->
    						connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(key + "*").build()))) {
    			stringSet = new HashSet<>();
    			while (cursor.hasNext()) {
    				String objKey = new String(cursor.next(), StandardCharsets.UTF_8);
    			   	stringSet.add(objKey);
    		   }
    		} catch (IOException e) {
    			e.printStackTrace();
    			return stringSet;
    		}
    		return stringSet;
    	}
    
    

    关于scan取的方式以及介绍,这里查看参考了网上的资料。 资料地址

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部