• redis使用场景之位操作(大数据处理)


    在学习redis的过程了,看到了redis还能用于大数据处理,具体场景如下:

    腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多,腾讯光这个得多花多少钱。。)

    原理是:

    redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,就能实现上述场景。用到的命令是:setbit、getbit、bitcount

    先来说说setbit、getbit、bitcount这三个指令的用法:

    在学习这几个命令之前,我们得先了解下redis中字符串的存储方式,redis中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:

    我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。我们BIT相关命令都是对这个二进制数据进行操作

    GETBIT

    GETBIT命令可以返回key对应的value在offset(偏移)处的bit值,以上文提到的kk为例,a对应的二进制数据是01100001,所以当offset为0时,对应的bit值为0;offset为1时,对应的bit值为1;offset为2时,对应的bit值为1;offset为3时,对应的bit值为0,依此类推….,如下:

    通过上述结果,可以看到offset从0到7,就是01100001,也就是说offset是从左往右计数的,也就是从高位往低位。当超过位数时,结果是0

    BITCOUNT

    BITCOUNT可以用来统计这个二进制数据中1的个数,如下:




    官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:

    SETBIT

    我们通过SETBIT 命令将 andy中的 'a' 变成 'b' 应该怎么变呢?

    也就是将 01100001 变成 01100010 (b的ASCII码是98),这个很简单啦,也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0。如下图:

    大家可能也发现了,每次SETBIT完毕之后,有一个(integer) 0或者(integer)1的返回值,这个是在你进行SETBIT 之前,该offset位的比特值。

    另外使用 BITPOS 指令可以用来获取二进制位串中第一个1或者0的位置,如下:

  • 相关阅读:
    SRS之SrsRtmpConn::service_cycle详解
    SRS之SrsRtmpServer::connect_app详解
    SRS之RTMP连接处理线程conn:接收客户端推流
    SRS之RTMP handshake
    SRS之RTMP的TCP线程(即监听线程)
    CSPS模拟 77
    CSPS模拟 76
    CSPS模拟 75
    CSPS模拟 74
    CSPS模拟 73
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/8885376.html
Copyright © 2020-2023  润新知