• Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)


    目录

    Redis 三种特殊的数据类型:

    Geospatial:地理位置

    Geospatial类型常用的命令:

    GEOADD:添加地理位置

    GEOPOS:获取地理位置

    GEODIST:返回两个给定位置之间的距离

    GEORADIUS:以给定的经纬度为中心,找出某一半径内的元素

    GEORADIUSBYMEMBER:找出位于指定范围内的元素,中心点是由给定的位置元素决定

    GEOHASH:返回一个或多个位置元素的Geohash表示

    GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !

    Hyperloglog:基数统计的算法

    例如:

    Bitmaps:位图(位存储)

    例如:


    Redis 三种特殊的数据类型:

    Geospatial:地理位置

    Hyperloglog:基数统计的算法

    Bitmaps:位图(位存储)

    Geospatial:地理位置

    如我需要查询朋友的定位,附近的人,打车所需距离的计算?

    这个功能可以推算地理位置的信息,比如说两地之间的距离,方圆几里之内的人

    可以查询一些测试数据:全国城市经纬度查询-知之小工具 (100xgj.com)

    Geospatial类型常用的命令:

    GEOADD:添加地理位置

     

     #规则:两极是无法直接添加的,我们一般会下载城市数据,直接通过java或者python程序导入!

    1. 按照(经度 纬度 名称)填写哦!!
    2. 如果写错了,可以通过flushdb刷新redis数据库,并通过clear清理页面
    3. 127.0.0.1:6379> GEOADD china:city 39.54 116.28 Beijin
    4. (error) ERR invalid longitude,latitude pair 39.540000,116.280000
    5. 如果出现了如上错误,说明我们写的经纬度超出范围了
    6. 127.0.0.1:6379> AUTH 123456
    7. OK
    8. 127.0.0.1:6379> GEOADD china:city 116.28 39.54 Beijin
    9. (integer) 1
    10. 127.0.0.1:6379> GEOADD china:city 121.47 31.23 Shanghai
    11. (integer) 1
    12. 127.0.0.1:6379> GEOADD china:city 106.50 29.53 Chongqing
    13. (integer) 1
    14. 127.0.0.1:6379> GEOADD china:city 113.18 23.10 Guangzhou 114.05 22.52 Shengzhen
    15. (integer) 2

    GEOPOS:获取地理位置

    1. 127.0.0.1:6379> GEOPOS china:city Beijin # 获取指定城市的经度和纬度
    2. 1) 1) "116.28000229597091675"
    3. 2) "39.54000124957348561"
    4. 127.0.0.1:6379>
    5. 127.0.0.1:6379> GEOPOS china:city Beijin
    6. 1) 1) "116.28000229597091675"
    7. 2) "39.54000124957348561"
    8. 127.0.0.1:6379> GEOPOS china:city Beijin Chongqing
    9. 1) 1) "116.28000229597091675"
    10. 2) "39.54000124957348561"
    11. 2) 1) "106.49999767541885376"
    12. 2) "29.52999957900659211"
    13. 127.0.0.1:6379>

    GEODIST:返回两个给定位置之间的距离

    单位:

    m表示单位为米。

    km表示单位为千米。

    mi表示单位为英里。

    ft表示单位为英尺。

    1. 127.0.0.1:6379> GEODIST china:city Beijin Shanghai
    2. "1036715.8809"
    3. 127.0.0.1:6379>
    4. 127.0.0.1:6379> GEODIST china:city Beijin Shanghai KM #表示千米
    5. "1036.7159"
    6. 127.0.0.1:6379>

    如何查看我附近的人呢?(获得所有的附近的人的地址,定位!通过半径来查询!)

    GEORADIUS:以给定的经纬度为中心,找出某一半径内的元素

    1. 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM #以110 30 这个经度纬度作为中心点。
    2. 1) "Chongqing"
    3. 2) "Shengzhen"
    4. 3) "Guangzhou"
    5. 127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM
    6. 1) "Chongqing"
    7. 127.0.0.1:6379>
    8. 127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM withdist # 显示到中心的距离
    9. 1) 1) "Chongqing"
    10. 2) "341.9374"
    11. 127.0.0.1:6379>
    12. 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 1 #限制查看的数量
    13. 1) 1) "Chongqing"
    14. 2) "341.9374"
    15. 3) 1) "106.49999767541885376"
    16. 2) "29.52999957900659211"
    17. 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 2
    18. 1) 1) "Chongqing"
    19. 2) "341.9374"
    20. 3) 1) "106.49999767541885376"
    21. 2) "29.52999957900659211"
    22. 2) 1) "Guangzhou"
    23. 2) "829.9936"
    24. 3) 1) "113.18000167608261108"
    25. 2) "23.10000005307264104"
    26. 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 3
    27. 1) 1) "Chongqing"
    28. 2) "341.9374"
    29. 3) 1) "106.49999767541885376"
    30. 2) "29.52999957900659211"
    31. 2) 1) "Guangzhou"
    32. 2) "829.9936"
    33. 3) 1) "113.18000167608261108"
    34. 2) "23.10000005307264104"
    35. 3) 1) "Shengzhen"
    36. 2) "924.6408"
    37. 3) 1) "114.04999762773513794"
    38. 2) "22.5200000879503861"
    39. 127.0.0.1:6379>

    GEORADIUSBYMEMBER:找出位于指定范围内的元素,中心点是由给定的位置元素决定

    1. 127.0.0.1:6379> GEORADIUSBYMEMBER china:city Chongqing 1000 km
    2. 1) "Chongqing"
    3. 2) "Guangzhou"
    4. 127.0.0.1:6379>

    GEOHASH:返回一个或多个位置元素的Geohash表示

    1. # 将二维的字符串转换为一维的字符串,如果两个字符串接近,那么距离越近
    2. 127.0.0.1:6379> GEOHASH china:city Beijin Chongqing
    3. 1) "wx48yn090q0"
    4. 2) "wm5xzrybty0"
    5. 127.0.0.1:6379>

    GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !

    1. 127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中所有的元素
    2. 1) "Chongqing"
    3. 2) "Shengzhen"
    4. 3) "Guangzhou"
    5. 4) "Shanghai"
    6. 5) "Beijin"
    7. 127.0.0.1:6379> ZREM china:city Beijin # 移除元素
    8. (integer) 1
    9. 127.0.0.1:6379> ZRANGE china:city 0 -1
    10. 1) "Chongqing"
    11. 2) "Shengzhen"
    12. 3) "Guangzhou"
    13. 4) "Shanghai"
    14. 127.0.0.1:6379>

    Hyperloglog:基数统计的算法

    基数是什么?

    基数是用来表示一个集合中元素个数的概念。它通常用于描述集合的大小或元素的数量。基数可以是非负整数,包括零。基数为零表示集合是空的,没有元素。

    • 如果一个集合包含了3个元素,那么它的基数是3。
    • 如果一个集合为空,那么它的基数是0。

    网页的uV (一个人访问一个网站多次,但是还是算作一个人!)

    传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断!

    这个方式如果保存大量的用户id,就会比较麻烦!因为我们的目的是计数用户数量,而并不是用来保存用户id的。

    优点∶占用的内存是固定,2^64不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选!

    例如:

    1. 127.0.0.1:6379> PFADD mykey a b c d e f g h i j # 创建第一组元素 mykey
    2. (integer) 1
    3. 127.0.0.1:6379> PFCOUNT mykey #统计mykey元素的基数数量
    4. (integer) 10
    5. 127.0.0.1:6379> PFADD mykey2 i jz x c v b n m # 创建第二组元素 mykey2
    6. (integer) 1
    7. 127.0.o.1:6379> PFCOUNT mykey2
    8. (integer) 9
    9. 127.0.0.1:6379>PFMERGE mykey3 mykey mykey2 #合并两组 mykey mykey2 => mykey3并集
    10. OK
    11. 127.0.0.1:6379> PFCOUNT mykey3 #看并集的数量!
    12. (integer) 15

    如果允许容错,那么一定可以使用Hyperloglog !
    如果不允许容错,就使用set或者自己的数据类型即可!

    Bitmaps:位图(位存储)

    统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !

    Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!| 

    例如:

    使用bitmap来记录周一到周日的打卡!

    周一:1  周二:0  周三:0  周四: 1 ..... 

    查看某一天是否打卡

    统计操作:统计打卡的天数(只有三天打卡了)

  • 相关阅读:
    oracle学习44-数据库发展历史
    与AI结对编程式是什么体验 Copilot vs AlphaCode, Codex, GPT-3
    文字转语音的软件哪个最好?分享几个宝藏软件给你们
    IDEA jar看不到反编译后的源码(只有方法那一级/* compiled code*/)
    Redis慢查询日志与监视器
    【C语言】函数
    .net项目与下载包之间不兼容时,如何下载NuGet之前版本的包
    Swoole 介绍以及 编译安装
    【Leetcode】207.课程表
    ViLBERT—(NeurIPS-2019)
  • 原文地址:https://blog.csdn.net/lpfstudy/article/details/132846412