Redis HyperLogLog
基数简介
- 基数:一个数据集中不重复元素的数量
- 基数估算:在误差可以接受的范围内,快速计算基数
- 实例:
- 数据集 {1, 3, 5, 7, 5, 7, 8}
- 基数集 {1, 3, 5 ,7, 8}
- 基数:5
HyperLogLog简介
- HyperLogLog:是一种可以使用少量内存进行基数估算的数据结构(算法)
- 特点
- HyperLogLog 本身不会存储输入元素的值,不像集合可以返回输入的各个元素;但是可以估算写入出HyperLogLog的基数
- HyperLogLog 估算的基数并不一定准确,是一个带有0.81%标准错误的近似值
- HyperLogLog 是一个基于基数估算的算法,只能比准确的估算出基值,可以使用极少的固定的内存去存储并识别集合中的唯一元素
- HyperLogLog 数据结构占用的空间是固定的12K,理论上可以存储2^64个值个元素(而且每个元素的的空间大小随意);这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比
- 用途:使用少量的内存进行各种去重统计(比如注册ip数、每日访问IP数、页面实时UV、在线用户数等)
- 实例:要统计访问IP数?
- HyperLogLog 可以使用小的内存就可以估算独立IP总数,但是无法知道IP的具体地址是多少(HyperLogLog并没有保存这些值)
- 如果想获取独立IP数并且保存值:可以将数据写入Set集合中,这样可以知道数量,也可以获得具体的IP值(但是这样会比较消耗内存)
- 比如我们把每日IP记录下来,假设每天有一亿个IP访问,如果使用集合的话,一天的内存使用就是1.5G,假设我们存储一个月的记录,就需要45G容量。但是使用HyperLogLog的话,一天12K,一个月360K。如果我们不需要知道IP具体信息的话,我们完全可以将这些记录留存储在 HyperLogLog中 存在内存中一年(甚至可以不删除,一直存放在内存)
Redis 中的HyperLogLog
- Redis 在2.8.9版本中添加了 HyperLogLog 结构
- HyperLogLog 是Redis的高级数据结构,是Redis中基数估算的利器
- HyperLogLog 可以接受多个元素的输入,返回输入元素的基数估算值
Redis HyperLogLog 的三个命令
- pfadd key_name element1...elementN:将一个或多个元素添加到 HyperLogLog 中
- pfadd studentID 20 21 22 23 24 25 22 23 24 20 25
- pfadd teacherID 30 31 32 33 34 35 33 32 25 24 23
- pfcount key_name1...key_nameN:估算 HyperLogLog 中的基数(如果是多个 HyperLogLog,估算多个 HyperLogLog 并集之后基数)
- pfcount teacherID
- pfcount teacherID studentID
- pfmerge destination_key source_key1 ... source_keyN:将多个 HyperLogLog 合并为一个 HyperLogLog
- pfmerge schoolID teacherID studentID
Redis GEO(地理空间)
- Redis GEO:在 Redis 3.2 版本新增
- Redis GEO:主要是用来存储地理空间信息,并且对存储的地理空间信息进行操作
- geohash:是一种地址编码算法,可以将二维的空间经纬度数据编码成一个字符串
- Redis GEO:使用geohash算法将给定的经纬度变成对应的geohash值(字符串)进行存储
Redis GEO 的六个命令
- geoadd key_name longitude1 latitude1 member1 ... longitudeN latitudeN memberN:存储一个或多个地理名称及其经纬度
- geoadd city 116.397128 39.916527 BeiJing 120.21201 30.2084 HaZhou 121.48941 31.40527 ShangHai
- geohash key_name member1 ... memberN:查询一个或多个地理名称的 geohash 值
- geohash city ShangHai BeiJing
- geopos key_name member1 ... memberN:查询一个或多个地理名称的经纬度
- geopos city ShangHai BeiJing
- geodist key_name member1 member2 [m|km|ft|mi]:用于查看两个地理名称间的距离
- m :米,默认单位
- km :千米
- mi :英里
- ft :英尺
- geodist city ShangHai HaZhou km
- georadius key_name longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [COUNT count] [ASC|DESC] :以给定的经纬度为圆心,以给定的radius为半径画圆,返回经纬度在该圆内的所有的地理名称的集合
- withcoord:返回地理名称的经纬度
- withdist:返回地理名称到圆心的距离
- count count:限制返回地理名称的个数
- [asc|desc]:按照距离进行排序(asc表示升序;desc表示降序)
- georadius city 120.21201 30.2084 200 km withcoord withdist count 1
- georadiusmember key_name longitude latitude radius [m|km|ft|mi] [withcoord] [withdist] [count count] [asc|desc]:以给定的地理名称为圆心,以给定的radius为半径画圆,返回经纬度在该圆内的所有的地理名称的集合
- georadiusbymember city hazhou 200 km withcoord withdist count 1
posted @
2020-09-21 15:05
WeiKing
阅读(
186)
评论()
编辑
收藏
举报