高级数据类型
- Bitmaps
- HyperLogLog
- GEO
高级数据类型用于解决单一业务
1、Bitmaps
1.1、Bitmaps定义
- redis中这种数据类型叫string,只不过前面我们是以string为一个整体进行操作的,现在以string中存储的二进制位来操作的;
- Bitmaps并不是一个全新的数据类型,是string类中的二进制位的一个操作接口!
1.2、Bitmaps类型的基础操作
测试:
- 使用setbit设置bits的0号位上的数字为1;
- 使用getbit获取对应位上的值(如果不存在,也是返回0)
对应位不存在的情况:(也是返回0)
如果在一个很高的位置上,设置一个1,前面的为孩子都会补0,这样很耗时。(如果都是从10000000位开始操作的,建议都先减一个10000000再进行操作)
1.3、Bitmaps类型的扩展操作
1、统计每天某一部电影是否被点播;
将电影做成一个offset,0就没有点播!
2、统计每天有多少部电影被点播;
查下‘1’的数量即可!
3、统计每周/月/年有多少部电影被点播;
将每天的Bitmaps存储下来,然后做逻辑或操作即可!
4、统计年度哪部电影没有被点播;
看看第3个哪个位置为0即可!
测试:
bitcount操作:
对20880808和20880809这两个key进行 或 操作:
结果为5!(也就代表这两天总共有5部电影被看了)
2、HyperLogLog
2.1、统计不重复数据的数量
注意: 2000万的位也是会消耗很大的内存空间的!
2.2、基数统计
基数:
- 基数是数据集去重后元素个数
- HyperLogLog 是用来做基数统计的,运用了LogLog的算法
2.3、HyperLogLog类型的基本操作
测试:
只有2个基数!
2.4、HyperLogLog相关说明
- 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
- 核心是基数估算算法,最终数值存在一定误差
- 误差范围: 基数估计的结果是一个带有 0.81% 标准错误的近似值
- 消耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数
- pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大
- Pfmerge命令合并后占用的存储空间为12K,无论合并之前数据量多少
3、GEO:地理位置
3.1、GEO定义
GEO地理位置: 给你一个地理位置,再给你一个地理位置,能做一些操作。
注意: 计算出来的位置是不考虑垂直方向的距离的,只有水平距离!
3.2、GEO类型的基本操作
key是将若干个坐标点添加到一个容器中!
测试:
1、添加点 和 获取坐标点
将a和b点都放在了geos这个容器中!
2、计算坐标点距离
也可以加上m和km的单位:
现在想看下附近有多少人?
测试:
1、georadiusbymember:根据点求范围内的数据;
求(2,2)这个点附近180km内的范围的点有多少个?
2、georadius:根据坐标求范围内的数据
求1.5 1.5这个坐标的90km范围内的数据!
3、geohash
geohash:自己特有的方法计算出的一个值!