zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    深入JavaScript之获取cookie以及删除cookie
    js 首次进入弹窗
    jquery 点击加载更多
    express 设置允许跨域访问
    微信小程序之全局储存
    jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作)
    我也想聊聊 OAuth 2.0 —— 基本概念
    一行代码,发送邮件
    【Git使用】强制推送代码到多个远程仓库
    一秒钟生成自己的iOS客户端
  • 原文地址:https://www.cnblogs.com/WeiKing/p/13703687.html
Copyright © 2011-2022 走看看