zoukankan      html  css  js  c++  java
  • Redis 使用 Bitmap

     

    redis数据类型 String、Set、Zset、List、hash       Bitmap 

    四种统计类型:

    1. 二值状态统计;
    2. 聚合统计;
    3. 排序统计;
    4. 基数统计

    二值状态统计:

    就是集合中的元素的值只有 0 和 1 两种,在签到打卡和用户是否登陆的场景中,只需记录签到(1)或 未签到(0)已登录(1)未登陆(0)

    在判断用户是否登陆的场景中使用 Redis 的 String 类型实现(key -> userId,value -> 0 表示下线,1 - 登陆),假如存储 100 万个用户的登陆状态,如果以字符串的形式存储,就需要存储 100 万个字符串了,内存开销太大。【注;String 类型除了记录实际数据以外,还需要额外的内存记录数据长度、空间使用等信息。】

    当保存的数据包含字符串,String 类型就使用简单动态字符串(SDS)结构体来保存,如下图所示:

                                                                                      <SDS>

    • len:占 4 个字节,表示 buf 的已用长度。
    • alloc:占 4 个字节,表示 buf 实际分配的长度,通常 > len。
    • buf:字节数组,保存实际的数据,Redis 自动在数组最后加上一个 “\0”,额外占用一个字节的开销。

    所以,在 SDS 中除了 buf 保存实际的数据, len 与 alloc 就是额外的开销。

    另外,还有一个 RedisObject 结构的开销,因为 Redis 的数据类型有很多,而且,不同数据类型都有些相同的元数据要记录(比如最后一次访问的时间、被引用的次数等)。

    所以,Redis 会用一个 RedisObject 结构体来统一记录这些元数据,同时指向实际数据。

     对于二值状态场景,我们就可以利用 Bitmap 来实现。比如登陆状态我们用一个 bit 位表示,一亿个用户也只占用 一亿 个 bit 位内存 ≈ (100000000 / 8/ 1024/1024)12 MB

    Bitmap 的底层数据结构用的是 String 类型的 SDS 数据结构来保存位数组,Redis 把每个字节数组的 8 个 bit 位利用起来,每个 bit 位 表示一个元素的二值状态(不是 0 就是 1)。

    可以将 Bitmap 看成是一个 bit 为单位的数组,数组的每个单元只能存储 0 或者 1,数组的下标在 Bitmap 中叫做 offset 偏移量。

    Bitmap 提供了 GETBIT、SETBIT 操作,通过一个偏移值 offset 对 bit 数组的 offset 位置的 bit 位进行读写操作,需要注意的是 offset 从 0 开始。

    只需要一个 key = login_status 表示存储用户登陆状态集合数据, 将用户 ID 作为 offset,在线就设置为 1,下线设置 0。通过 GETBIT判断对应的用户是否在线。50000 万 用户只需要 6 MB 的空间。

     

    命令:

    SETBIT 命令

    SETBIT <key> <offset> <value>

    设置或者清空 key 的 value 在 offset 处的 bit 值(只能是 0 或者 1)。

    GETBIT 命令

    GETBIT <key> <offset>

    获取 key 的 value 在 offset 处的 bit 位的值,当 key 不存在时,返回 0。

    ======》

    Redis 提供了 BITPOS key bitValue [start] [end]指令,返回数据表示 Bitmap 中第一个值为 bitValue 的 offset 位置

  • 相关阅读:
    HttpClient——POST请求方法
    【Httpclient+TestNG】接口自动化测试——GET请求示例
    一些杂碎的小知识点
    搭建linux服务器的环境
    javase(1)
    事务处理
    数据库优化
    表单重复提交--->使用Session防止表单重复提交
    两个小程序
    java基础小知识(2)
  • 原文地址:https://www.cnblogs.com/KL2016/p/15118051.html
Copyright © 2011-2022 走看看