一、Bitmaps
基础
- 特点: 伪数据类型,基于String实现,最大长度512M,适合设置成2^32个不同字节。
- 常用命令:SETBIT,GETBIT,BITCOUNT
使用场景
- 给定范围内bit统计(例如人口统计)
- 日活统计,ip登录统计。
- 布隆过滤器。
注意事项
- 存储与对象ID关联的节省空间并且高性能的布尔信息。
- 如果用户起始id很大,会造成前面的空间浪费。
实现原理
Bitmaps不是真实的数据结构,而是String类型上的一组面向bit操作的集合; 因为redis的key和value本身就支持二进制的存储方式,所以bitmaps只是string的独特扩展。
二、HyperLogLog
基础
- 特点: 基数统计的算法,不是真实数据结构。
- 常用命令:PFADD,PFCOUNT,PFMERGE。
使用场景
- 日活统计,ip统计。
- 统计APP或网页的一个页面,访问情况
注意事项
- HLL准错误小于1%的估计度量,通常是0.81%左右。
- HLL只会根据输入元素来计算基数,而不会储存输入元素本身;因此HLL不能像集合那样,返回输入的元素。
- 每个HLL键最多只需要花费12KB内存。
实现原理
- HLL每个KEY最多占用12K的内存空间,可以计算接近2^64个不同元素的基数;
- HLL存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数基数个数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,转变成稠密矩阵之后才会占用12K的内存空间。
三、Geo
基础
- 特点:地理信息定位。
- 常用命令:GEOADD,GEOHASH,GEOPOS
使用场景
- 实附近的人、两地理位置间距离计算等功能。
注意事项
- 支持某一个事物的经纬度位置保存。
- 支持点附近点的匹配。
- 支持根据事物的ID查询事物具体信息。
实现原理
Redis GEO的底层实现是zset;GeoHash原理简单来看:二分区间,区间编码。
总结
在实际的应用开发中redis高级数据类型用的不多,bitmaps实现的布隆过滤器,HyperLogLog统计日活、埋点。Geo略显鸡肋,Elastic search的geo要更具有一些优势。redis的geo在数据量很大的情况下,会造成整个redis查询缓慢,要另起一个集群维护成本比较高,es不需要。