• Redis_三种特殊数据类型


    三种特殊数据类型

    1. geospatial

    1. 概述

    朋友的定位, 附近的人, 打车距离实现

    Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息: 两地之间的距离, 方圆几里的人

    所有的geospatial命令都是geo开头的

    2. 相关命令

    1. geoadd

    添加地理位置

    127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
    (integer) 3
    127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
    (integer) 3
    

    规则

    • 地球的两极无法直接添加, 我们一般会下载城市数据, 通过java程序一次性导入!
    • 参数 key 经度(longitude) 纬度(latitude) 名称

    2. geopos

    获取指定的成员的经度和纬度

    127.0.0.1:6379> geopos china:city taiyuan manjing
    1) 1) "112.54999905824661255"
       2) "37.86000073876942196"
    2) 1) "118.75999957323074341"
       2) "32.03999960287850968"
    

    获得当前定位, 一定是一个坐标值!

    3. geodist

    如果不存在, 返回空

    单位如下

    • m
    • km
    • mi 英里
    • ft 英尺
    127.0.0.1:6379> geodist china:city taiyuan shenyang m
    "1026439.1070"
    127.0.0.1:6379> geodist china:city taiyuan shenyang km
    "1026.4391"
    

    4. georadius

    附近的人 ==> 获得所有附近的人的地址, 定位, 通过半径来查询

    获得指定数量的人

    127.0.0.1:6379> georadius china:city 110 30 1000 km			以 100,30 这个坐标为中心, 寻找半径为1000km的城市
    1) "xian"
    2) "hangzhou"
    3) "manjing"
    4) "taiyuan"
    127.0.0.1:6379> georadius china:city 110 30 500 km
    1) "xian"
    127.0.0.1:6379> georadius china:city 110 30 500 km withdist
    1) 1) "xian"
       2) "483.8340"
    127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
    1) 1) "xian"
       2) "483.8340"
       3) 1) "108.96000176668167114"
          2) "34.25999964418929977"
    2) 1) "manjing"
       2) "864.9816"
       3) 1) "118.75999957323074341"
          2) "32.03999960287850968"
    

    参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]

    5. georadiusbymember

    显示与指定成员一定半径范围内的其他成员

    127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
    1) "manjing"
    2) "taiyuan"
    3) "xian"
    127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
    1) 1) "taiyuan"
       2) "0.0000"
       3) 1) "112.54999905824661255"
          2) "37.86000073876942196"
    2) 1) "xian"
       2) "514.2264"
       3) 1) "108.96000176668167114"
          2) "34.25999964418929977"
    

    参数与 georadius 一样

    6. geohash(较少使用)

    该命令返回11个字符的hash字符串

    127.0.0.1:6379> geohash china:city taiyuan shenyang
    1) "ww8p3hhqmp0"
    2) "wxrvb9qyxk0"
    

    将二维的经纬度转换为一维的字符串, 如果两个字符串越接近, 则距离越近

    3. 底层

    geo底层的实现原理实际上就是Zset, 我们可以通过Zset命令来操作geo

    127.0.0.1:6379> type china:city
    zset
    

    查看全部元素 删除指定的元素

    127.0.0.1:6379> zrange china:city 0 -1 withscores
     1) "xian"
     2) "4040115445396757"
     3) "hangzhou"
     4) "4054133997236782"
     5) "manjing"
     6) "4066006694128997"
     7) "taiyuan"
     8) "4068216047500484"
     9) "shenyang"
    10) "4072519231994779"
    11) "shengzhen"
    12) "4154606886655324"
    127.0.0.1:6379> zrem china:city manjing
    (integer) 1
    127.0.0.1:6379> zrange china:city 0 -1
    1) "xian"
    2) "hangzhou"
    3) "taiyuan"
    4) "shenyang"
    5) "shengzhen"
    

    2. hyperloglog

    基数 ---- 不重复的元素, 可以接受误差

    1. 简介

    • Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!

    • Hyperloglog是基数统计的算法

    • 用于统计网页的 UV (一个人访问一个网站多册, 但是还是算作一个人)

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

      • 这种方式如果保存大量的用户 id, 就会比较麻烦
      • 我们的目的是为了计数, 而不是保存用户 id
    • 优点

      • 占用的内存是固定的 (存放 2^64 不同元素的基数, 只需要使用 12KB 的内存)
      • 有 0.81% 的错误率, 对于统计 UV , 可以忽略不计
    • 命令都是pf开头的

    • 如果允许容差, 可以使用Hyperloglog统计数量

    • 如果不允许容错, 就使用 set 或者自己的数据类型即可

    2.测试使用

    127.0.0.1:6379> pfadd mykey a b c d e f g h i j
    (integer) 1
    127.0.0.1:6379> pfcount mykey
    (integer) 10
    127.0.0.1:6379> pfadd mykey2 i j z x c v b n m
    (integer) 1
    127.0.0.1:6379> pfcount mykey2
    (integer) 9
    127.0.0.1:6379> pfmerge mykey3 mykey mykey2
    OK
    127.0.0.1:6379> pfcount mykey3
    (integer) 15
    
    • pfadd 创建一组元素
    • pfcount 统计元素中的基数数量
    • pfmerge 合并两组 参数为 pfmerge 并集 来源... 会去掉相同的元素

    3. bitmaps

    1. 简介

    位存储, one hot编码

    统计用户信息, 活跃, 不活跃! 登录, 未登录! 打卡, 365打卡!

    只有两个状态的, 都可以使用bitmaps!

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

    例如 : 365 天 = 365 bit 1字节 = 8 bit ==> 只需要 46 个字节左右就可以存储用户的一年打卡的信息了!

    2. 测试

    image-20201022133457211

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

    周一: 1 周二: 0 ...

    判断有几天是 1 就可以了

    127.0.0.1:6379> setbit sign 0 1
    (integer) 0
    127.0.0.1:6379> setbit sign 1 0
    (integer) 0
    127.0.0.1:6379> setbit sign 2 0
    (integer) 0
    127.0.0.1:6379> setbit sign 3 1
    (integer) 0
    127.0.0.1:6379> setbit sign 4 1
    (integer) 0
    127.0.0.1:6379> setbit sign 5 1
    (integer) 0
    127.0.0.1:6379> setbit sign 6 0
    (integer) 0
    
    • setbit key offset value
      • value只能为0 和 1
      • offset从0开始

    查看某一天是否有打卡 getbit key value

    127.0.0.1:6379> getbit sign 5
    (integer) 1
    

    同级操作, 统计打卡的天数( 1的个数 ) bitcount key

    127.0.0.1:6379> bitcount sign
    (integer) 4
    
  • 相关阅读:
    Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
    Android启动过程以及各个镜像的关系
    程序员如何利用空余时间挣零花钱?
    hcharts实现堆叠柱形图
    [慕课笔记] node+mongodb建站攻略
    【每周一图】蜂鸟
    [慕课笔记]Node入口文件分析和目录初始化
    [慕课笔记] node+mongodb建站攻略
    hcharts实现堆叠柱形图
    程序员常用的六大技术博客类
  • 原文地址:https://www.cnblogs.com/wang-sky/p/13857787.html
Copyright © 2020-2023  润新知