一、通过 SET 结构实现
SADD
- 语法:SADD key member [member …]
- 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
- 假如 key 不存在,则创建一个只包含 member 元素作成员的集合
- 当 key 不是集合类型时,返回一个错误
SCARD
- 语法:SCARD key
- 返回集合 key 的基数(集合中元素的数量)
代码实践
127.0.0.1:6379> sadd 'index.uv.20210331' 'user_1'
(integer) 1
127.0.0.1:6379> sadd 'index.uv.20210331' 'user_2'
(integer) 1
127.0.0.1:6379> sadd 'index.uv.20210331' 'user_3'
(integer) 1
127.0.0.1:6379> sadd 'index.uv.20210331' 'user_2'
(integer) 0
127.0.0.1:6379> sadd 'index.uv.20210331' 'user_1'
(integer) 0
127.0.0.1:6379> scard 'index.uv.20210331'
(integer) 3
以上方案只使用与小型站点,对于大型站点会耗费大量的 Redis 存储空间
二、HyperLogLog
PFADD
- 语法:PFADD key element [element …]
- 如果给定键已经是一个 HyperLogLog , 那么这种调用不会产生任何效果
- 但如果给定的键不存在, 那么命令会创建一个空的 HyperLogLog , 并向客户端返回 1
PFCOUNT
- 语法:PFCOUNT key [key …]
代码实践
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_1'
(integer) 1
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_2'
(integer) 1
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_3'
(integer) 1
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_2'
(integer) 0
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_2'
(integer) 0
127.0.0.1:6379> pfadd 'home.uv.20210331' 'user_2'
(integer) 0
127.0.0.1:6379> pfcount 'home.uv.20210331'
(integer) 3