1、位图(bitmap)
一句话:由0和1状态表现的二进制位的bit数组
看需求:
- 用户是否登陆过Y、N,比如软件的每日签到功能
- 电影、广告是否被点击播放过
- 钉钉打卡上下班,签到统计
是什么?
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32=4294967296)
能干嘛?
用于状态统计,Y、N类似AtomicBoolean
基本命令
1.setbit key offset value
setbit 键偏移位 只能零或者1
Bitmap的偏移量从零开始计算的
2.getbit key offset
获取键偏移位的值
3.strlen key
统计字节数占用多少
不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容
4.bitcount key [start end [byte|bit]]
全部键里面包含有1的有多少个
5.bitop operation(AND|OR|XOR|NOT) destkey key [key ...]
案例:连续2天都签到的用户数量
假如某个网站或者系统,它的用户有1000W,我们可以使用redis的HASH结构和bitmap结构做个用户id和位置的映射
2、基数统计(HyperLogLog)
看需求:
用户搜索网站关键词的数量
统计用户每天搜索不同词条个数
统计某个网站的UV、统计某个文章的UV
什么是UV?
Unique Visitor,独立访客,一般理解为客户端IP,需要去重考虑
是什么
去重复统计功能的基数估计算法-就是HyperLogLog
Redis在2.8.9版本添加了HyperLogLog 结构。
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在Redis里面,每个 HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费
内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
基数:是一种数据集,去重复后的真实个数
(全集)={2,4,6,8,77,39,4,8,10}
去掉重复的内容
基数={2,4,6,8,77,39,10} = 7
基数统计:用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算。
一句话:去重脱水后的真实数据
基本命令: