bitmap
是什么? Bitmap是用String 类型作为底层数据结构实现的一种统计二值状态 的数据类型。String类型是会保存为二进制的字节数组 ,所以,Redis就把字节数组的每个bit位 利用起来,用来表示一个元素的二值状态 。你可以把Bitmap 看作是一个bit数组 。
redis提供了 SETBIT、 GETBIT、BITCOUNT、BITOP 四个命令用于处理bitmap。
-
SETBIT 用于设置 位数组指定偏移量 上的二进制位 的值, 位数组的偏移量从0开始计数, 而二进制位的值则可以是0或者1 -
GETBIT 用于获取 位数组指定偏移量上的二进制位的值 -
BITCOUNT 用于统计 位数组里面, 值为1的二进制位的数量 -
BITOP 可以对多个位数组进行按位与( and )、 按位或( or )、 按位异或( xor)、按位取反( not ) 运算
HyperLogLog基数统计(去重统计)
是什么 HyperLogLog是一种用于基数统计(去重) 的数据类型,它的最大优势就在于,当集合元素数量非常多时,它计算基数所需的空间总是固定的并且还很小 。
典型应用场景: 一天内有多少用户登录,因为用户可能重复登录,但是只记一次,所以需要利用HyperLogLog进行去重。
存在以下的特点:
- 能够使用极少的内存来统计巨量的数据,在 Redis 中实现的 HyperLogLog,只需要
12K内存 就能统计2^64 个数据。 - 计数存在一定的误差,误差率整体较低。标准误差为 0.81% 。
- 误差可以通过设置辅助计算因子进行降低。
常用的基本命令
PFADD key element [element ...]
PFCOUNT key [key ...]
PFMERGE destkey sourcekey [sourcekey ...]
实现原理 内部维护了16384 个桶来记录各自桶的元素数量,当添加元素时,通过 hash 算法将这个元素分派到其中的一个桶中,同样的元素总是会散列到同样的桶。这样总的去重计数就是所有非零桶 的总和。
GEO(LBS)
将用户给定的地理位置信息 储存起来,并对这些信息进行操作。 GEO常用语LBS(Location-Based Service)
GeoHash的编码方法 为了能高效地对经纬度进行比较,Redis采用了业界广泛使用的GeoHash 编码方法,这个方法的基本原理就是“二分区间,区间编码” 。 当我们要对一组经纬度进行GeoHash 编码时,我们要先对经度和纬度分别编码,然后再把经纬度各自的编码组合成一个最终编码 。
首先,我们来看下经度和纬度的单独编码 过程。
对于一个地理位置信息来说,它的经度范围是[-180,180] 。GeoHash编码会把一个经度值编码成一个N位的二进制值,我们来对经度范围[-180,180]做N次的二分区操作,其中N可以自定义。
在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0)和[0,180](我称之为左、右分区)。此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。如果是落在左分区,我们就用0表示;如果落在右分区,就用1表示。这样一来,每做完一次二分区,我们就可以得到1位编码值。
然后,我们再对经度值所属的分区再做一次二分区,同时再次查看经度值落在了二分区后的左分区还是右分区,按照刚才的规则再做1位编码。
当做完N次的二分区后,经度值就可以用一个N bit 的数来表示了。
当一组经纬度值都编完码后,我们再把它们的各自编码值组合在一起. 组合的规则是:最终编码值的偶数位上依次是经度的编码值,奇数位上依次是纬度的编码值,其中,偶数位从0开始,奇数位从1开始。
常用命令:
GEOADD 命令:用于把一组经纬度信息和相对应的一个ID记录到GEO类型集合中;GEORADIUS 命令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。当然,我们可以自己定义这个范围。
|