HyperLogLog和GEO

Redis HyperLogLog

基数简介

  1. 基数:一个数据集中不重复元素的数量
  2. 基数估算:在误差可以接受的范围内,快速计算基数
  3. 实例:
    1. 数据集 {1, 3, 5, 7, 5, 7, 8}
    2. 基数集 {1, 3, 5 ,7, 8}
    3. 基数:5

HyperLogLog简介

  1. HyperLogLog:是一种可以使用少量内存进行基数估算的数据结构(算法)
  2. 特点
    1. HyperLogLog 本身不会存储输入元素的值,不像集合可以返回输入的各个元素;但是可以估算写入出HyperLogLog的基数
    2. HyperLogLog 估算的基数并不一定准确,是一个带有0.81%标准错误的近似值
    3. HyperLogLog 是一个基于基数估算的算法,只能比准确的估算出基值,可以使用极少的固定的内存去存储并识别集合中的唯一元素
    4. HyperLogLog 数据结构占用的空间是固定的12K,理论上可以存储2^64个值个元素(而且每个元素的的空间大小随意);这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比
  3. 用途:使用少量的内存进行各种去重统计(比如注册ip数、每日访问IP数、页面实时UV、在线用户数等)
  4. 实例:要统计访问IP数?
    1. HyperLogLog 可以使用小的内存就可以估算独立IP总数,但是无法知道IP的具体地址是多少(HyperLogLog并没有保存这些值)
    2. 如果想获取独立IP数并且保存值:可以将数据写入Set集合中,这样可以知道数量,也可以获得具体的IP值(但是这样会比较消耗内存)
    3. 比如我们把每日IP记录下来,假设每天有一亿个IP访问,如果使用集合的话,一天的内存使用就是1.5G,假设我们存储一个月的记录,就需要45G容量。但是使用HyperLogLog的话,一天12K,一个月360K。如果我们不需要知道IP具体信息的话,我们完全可以将这些记录留存储在 HyperLogLog中 存在内存中一年(甚至可以不删除,一直存放在内存)

Redis 中的HyperLogLog

  1. Redis 在2.8.9版本中添加了 HyperLogLog 结构
  2. HyperLogLog 是Redis的高级数据结构,是Redis中基数估算的利器
  3. HyperLogLog 可以接受多个元素的输入,返回输入元素的基数估算值

Redis HyperLogLog 的三个命令

  1. pfadd key_name element1...elementN:将一个或多个元素添加到 HyperLogLog 中
    1. pfadd studentID 20 21 22 23 24 25 22 23 24 20 25
    2. pfadd teacherID 30 31 32 33 34 35 33 32 25 24 23
  2. pfcount key_name1...key_nameN:估算 HyperLogLog 中的基数(如果是多个 HyperLogLog,估算多个 HyperLogLog 并集之后基数)
    1. pfcount teacherID
    2. pfcount teacherID studentID
  3. pfmerge destination_key source_key1 ... source_keyN:将多个 HyperLogLog 合并为一个 HyperLogLog
    1. pfmerge schoolID teacherID studentID

Redis GEO(地理空间)

  1. Redis GEO:在 Redis 3.2 版本新增
  2. Redis GEO:主要是用来存储地理空间信息,并且对存储的地理空间信息进行操作
  3. geohash:是一种地址编码算法,可以将二维的空间经纬度数据编码成一个字符串
  4. Redis GEO:使用geohash算法将给定的经纬度变成对应的geohash值(字符串)进行存储

Redis GEO 的六个命令

  1. geoadd key_name longitude1 latitude1 member1 ... longitudeN latitudeN memberN:存储一个或多个地理名称及其经纬度
    1. geoadd city 116.397128 39.916527 BeiJing 120.21201 30.2084 HaZhou 121.48941 31.40527 ShangHai
  2. geohash key_name member1 ... memberN:查询一个或多个地理名称的 geohash 值
    1. geohash city ShangHai BeiJing
  3. geopos key_name member1 ... memberN:查询一个或多个地理名称的经纬度
    1. geopos city ShangHai BeiJing
  4. geodist key_name member1 member2 [m|km|ft|mi]:用于查看两个地理名称间的距离
    1. m :米,默认单位
    2. km :千米
    3. mi :英里
    4. ft :英尺
    5. geodist city ShangHai HaZhou km
  5. georadius key_name longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [COUNT count] [ASC|DESC] :以给定的经纬度为圆心,以给定的radius为半径画圆,返回经纬度在该圆内的所有的地理名称的集合
    1. withcoord:返回地理名称的经纬度
    2. withdist:返回地理名称到圆心的距离
    3. count count:限制返回地理名称的个数
    4. [asc|desc]:按照距离进行排序(asc表示升序;desc表示降序)
    5. georadius city 120.21201 30.2084  200 km withcoord withdist count 1
  6. georadiusmember key_name longitude latitude radius [m|km|ft|mi] [withcoord] [withdist] [count count] [asc|desc]:以给定的地理名称为圆心,以给定的radius为半径画圆,返回经纬度在该圆内的所有的地理名称的集合
    1. georadiusbymember city hazhou 200 km withcoord withdist count 1
posted @ 2020-09-21 15:05  WeiKing  阅读(186)  评论(0编辑  收藏  举报