• 【Redis入门笔记 03】三种特殊数据类型


    redis

    redis 除了五个常用的基本数据类型,还有三个特殊数据类型:

    • Geospatial(地理位置)
    • Hyperloglog(基数统计)
    • Bitmap(位图)

    🍉地理位置 Geospatial

    在 redis 3.2 版本之后推出了 地理位置 数据类型。用它可以推算出地理位置的信息,两地之间的距离,方圆几里内的人和物体…

    针对地理位置的操作,redis 提供了如下 6 个命令:

    命令说明
    geoadd添加地理位置(经度 维度)
    geodist两地之间的距离,后面可选 m/km/mi/ft,表示单位米/千米/英里/英尺
    geohash将二维的经纬度转换为一维的字符串。如果两个字符串越接近,那么则距离越近
    geopos获得当前位置(坐标值)
    georadius以给定的经纬度为中心, 找出某一半径内的元素
    georadiusbymember以给定的元素为中心, 找出某一半径内的元素

    其中 geoadd 命令的经度有效值:[-180, 180],纬度有效值:[-85.05112878, 85.05112878],南北极无法添加进数据库~

    1

    GEO 底层是基于 Zset 实现的,我们还可以使用 Zset 命令来操作 GEO~

    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "shanghai"
    2) "beijin"
    
    # 删除 北京 的位置信息
    127.0.0.1:6379> zrem china:city beijin
    (integer) 1
    
    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "shanghai"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    🍋基数统计 Hyperloglog

    在 redis 2.8.9 版本加入了一个新的数据类型:Hyperloglog 用来做基数统计。

    基数是什么呢?

    以数据集 A = {1, 3, 5, 7 ,8, 7} 为例,它的基数集合为 {1, 3, 5, 7, 8},基数为 5,也就是数据集中不重复的元素个数。

    redis 中的 Hyperloglog 是一个用来快速计算基数的算法,并且所需的内存非常少。在实际应用中,如果需要统计网站的访问量,同时希望去掉重复的 IP 访问数,亦或者统计不重复的搜索记录数量,在传统的数据库中我们可以使用 distinct count 来计算,但是随着数据的增加,需要占用的空间会越来越大,因此 redis 推出了 Hyperloglog 来进行基数统计,这种算法计算基数是所用的空间是固定的,并且内存占非常用小。

    redis 中每个 Hyperloglog 只需要 12KB 内存就可以统计 2 64 2^{64} 264 个不同元素基数,但是 Hyperloglog 只会统计出数量,并不会存储元素本身,同时 Hyperloglog 的低内存占用是在牺牲了一定精准度下换来的,如果使用场景允许少量的统计误差,基数统计是一个非常合适的选择。

    reids 提供了 3 个命令:

    命令说明
    pfadd创建一组元素
    pfcount统计元素基数数量
    pfmerge整合两组元素

    一个统计不重复元素数量的示例:

    22

    示例中的基数是没有误差的,因为 Hyperloglog 在数据范围比较小的情况下基本不会出现误差~


    🍍位图 Bitmaps

    Bitmap(位图) 是一个通过比特位(bit)来表示某个元素对应的值或状态的数据结构,通过操作二进制位来进行记录,每个位有 0 和 1 两个状态。其中 key 是对应元素本身,常用于用户签到、统计活跃用户等场景…

    比如要统计一个用户一年的打卡情况,常规做法是维护一个数据库表 date - state 来记录 365 天每一天的打卡状态,而使用 Bitmaps 将打卡状态用二进制位表示,一个字节 8 位,只需要 46 个字节左右就可以记录下一年的打卡信息!

    redis 为我们提供了三个命令:

    命令说明
    setbit设置位图值
    getbit获取位图值
    bitcount统计位图值为 1 的值个数

    一个统计周签到信息的示例:

    周一到周五的签到信息如下~

    工作日周一周二周三周四周五
    签到××

    bitmaps


    🚀redis 系列专栏:Redis 快速入门
    ❤整理不易❤ 还请各位读者老爷们三连支持一下╰( ̄ω ̄o)

    footer

  • 相关阅读:
    【C++】:内存管理
    ElasticSearch 一文读懂
    5G NR Polar码简介(一)
    【图像分割】基于粒子群、文化、进化策略算法实现化石图像分割附matlab代码
    计算机毕业设计Java高校教师个人主页网站设计与实现(源码+系统+mysql数据库+lw文档)
    能与远方家人分享生活瞬间的网络相册
    element-plus日历组件el-calendar自定义内容,每天绑定不同的值
    C++中的菱形继承问题及解决方案
    解决恶意IP地址攻击:保卫网络安全的有效方法
    数据库存储过程
  • 原文地址:https://blog.csdn.net/m0_51338272/article/details/127646083