美文网首页
redis Redis高级数据类型GEO&HyperLogLog

redis Redis高级数据类型GEO&HyperLogLog

作者: dylan丶QAQ | 来源:发表于2020-09-15 22:45 被阅读0次

    起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访问数据库带来的压力,从而加快运行速度。


    1、Redis高级数据类型GEO&HyperLogLog详解

    1.1. zset扩展类型geo

    1.1.1. GEO功能介绍

    GEO功能是在Redis 3.2版本后提供的,支持存储地理坐标的一个数据结构,可以用来做类似摇一摇,附近的人,周边搜索的功能

    # 语法类型
    geoadd key 经度 纬度 成员 [经度 纬度 成员...]
    # geoadd命令必须以标准的x y member结构来接受参数,必须先输入经度后输入纬度
    

    geoadd能够记录的坐标是有限:

    • 非常接近两极的区域无法索引
    • 精确的坐标限制是由 EPSG:900913等坐标系统定义
    • 经度:-180到180度之间
    • 纬度:-85.05112878到85.05112878度之间
    • 如果超出这个范围则会报错

    1.1.2. 新增和查询

    # 添加一批城市
    geoadd china:city 116.408 39.904 beijing 121.445 31.213 shanghai 113.265 23.108 guangzhou 114.109 22.544 shenzhen 108.969 34.285 xian 108.55 34.09 changan 
    # 查询
    geopos china:city beijing shanghai
    

    1.1.3.获得节点间距离

    geodist china:city shanghai beijing km
    

    unit:

    • m : 米
    • km :千米
    • mi :英里
    • ft : 英尺
    • 默认是m
    • 会有0.5%的误差

    1.1.4. 周边搜索

    georadius china:city 121.445 31.213 1300 km withdist withcoord
    georadius china:city 121.445 31.213 1300 km withdist withcoord asc count 3
    georadiusbymember china:city beijing 1300 km withdist withcoord asc count 3
    
    • withdist : 返回节点距离
    • withcoord : 带上坐标
    #节点hash
    geohash china:city xian changan
    1) "wqj7p9ku9e0"
    2) "wqj1yjgswk0"
    

    1.1.5. 删除节点

    zrem china:city changan
    

    1.1.6. 业务实现

    x y name1 x y nam2
    x y canyin:123 x y canyin:456

    1.2. hyperloglog

    这个数据类型其实就做了一件事,统计不重复的数据量
    比如要记录我们网站的UV量

    sadd 20200208 1 2 3 4 5 6 5 4 3 2 1
    scard 20200208
    

    只用来存放基数

    pfadd 20200207 1 2 3 4 5 6 5 4 3 2 1 #添加记录基数
    pfadd 20200206 1 2 3 4 5 6 7 8 9 10
    pfcount 20200206 #返回基数
    pfmerge 202002 20200206 20200207 #pfmerge newkey sourcekey1 sourcekey2 合并生成了一个新key,原来的key不会消失
    

    还有一个问题

    • hyperloglog是一个基数估算算法,有一定误差的
    • 误差值在0.81%
    • hyperloglog的key占用空间很小只有12K,而你用set就需要把这些value都要保存,set存一年数据有多大

    不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

    相关文章

      网友评论

          本文标题:redis Redis高级数据类型GEO&HyperLogLog

          本文链接:https://www.haomeiwen.com/subject/krpqyktx.html