Redis 2.8.9版本之后支持Hyperloglog
再次强调:Hyperloglog 用于计算不重复元素的数量,不可获取目标元素。如果需要实现类似UV统计,可以使用bit位图,bit位图,可以获取到具体某些元素!
Hyperloglog 存储基数。但什么是基数?
A {1,3,5,7,9}
B {1,3,3,5,7}
其中A就是基数,B有重复元素就不是基数。本身相当于去重
Hyperloglog在数据了很大的时候,可接受误差!一般用于网站UV,就是用户数量统计!
基数:说白了就是不重复的元素
好处
占用内存是固定的,只需要12KB内存!可存储2的64次方的元素。不管存多少个(数量在2的64次方内),占用内存都是12KB。
Hyperloglog相关命令
- PFADD :添加一个或多个元素到某个key中 参数:key 元素...
- PFCOUNT :获取某个key 或多个key 元素数量 参数:key...
- PFMERGE :合并多个分支 参数:newkey oldkey1 oldkey2 ...
实验:redis-cli 添加元素 查询数量 合并元素
# 添加元素 a - k 到mykey1 (一共 11 个)
pfadd mykey1 a b c d e f g h i j k
# 统计mykey1元素数量
pfcount mykey1
# 添加元素 k - n 到mykey2 (一共 4 个)
pfadd mykey2 k l m n
# 合并mykey1、mykey2为mykey3
pfmerge mykey3 mykey1 mykey2
# 输出mykey3的数量 (因为存储的是基数形式,不会重复,故 k 只计算一次)
pfcount mykey3
注意,没有删除元素
代码实现
试验1.1 添加UV记录
@Test
public void UV统计多次添加同一个Value() {
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
Long addRes = redisTemplate.opsForHyperLogLog().add("UV统计:"+time, "张三IP","张三IP");
}
@Test
public void UV统计多个Value() {
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
Long addRes = redisTemplate.opsForHyperLogLog().add("UV统计:"+time, "李四IP","王五IP");
}
试验1.2 获取添加的UV的结果数
@Test
public void 获取统计结果() {
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
Long 结果数 = redisTemplate.opsForHyperLogLog().size("UV统计:"+time);
System.out.println(结果数);
}
试验2 合并B集合到A集合(合并后自动去重)并输出A的元素数
@Test
public void 将目标月合并指定月并统计的结果() {
Long res1 = redisTemplate.opsForHyperLogLog().add("UV统计:1月", "李四IP","王五IP");
Long res2 = redisTemplate.opsForHyperLogLog().add("UV统计:2月", "王五IP","赵六IP");
Long union1Res = redisTemplate.opsForHyperLogLog().union("UV统计:1月", "UV统计:2月");
System.out.println(union1Res); // 输出3
}
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)