位图以及其应用场景

位图,顾名思义,就是一种用二进制位来标识的数据,数值只能是0或1。通过位图可以极大地节省内存或外存的空间。

Redis提供位图就是为了我们方便且快速地做一下实时的计算和统计。比如我们想统计每天在线用户数,如果一个网站的用户数较多,采用普通的Redis存储可能计算比较慢。可要是使用位图,可以较快地完成技术统计。此外,它非常节省空间。

比如你有1亿的数据,那么它需要的空间是:

100 000 000 / 8 / 1024 /1024 = 11.92M。

1亿数据只需要11.92M的空间,Amazing!

位图的主要命令列表:

位图的主要应用场景包括统计用户是否在线,用户每天的签到情况,每日的用户数,活跃数等等。

位图算法的简易实现:

class BitMap:
    BIT_PER_WORDS = 32

    ADDRESS_BIT = 5

    def __init__(self, max):
        self.length = self.get_index(max) + 1
        self.array = [0 for x in range(self.length)]
        pass

    def get_index(self, value):
        return value >> self.ADDRESS_BIT

    def set(self, value):
        location = self.get_index(value)
        print(location)
        if location > self.length - 1:
            raise Exception("超出边界")
        bit_index = value % self.BIT_PER_WORDS
        print(bit_index)
        self.array[location] |= 1 << bit_index

    def get(self, value):
        location = self.get_index(value)
        if location > self.length - 1:
            return False
        bit_inx = value % self.BIT_PER_WORDS
        print(self.array[location] & (1 << bit_inx))
        return (self.array[location] & 1 << bit_inx) != 0

参考资料:

REDIS BITMAPS – FAST, EASY, REALTIME METRICS

10亿数据量只需要100MB内存,redis的位存储为什么这么牛?

Redis参考手册

--------EOF---------
微信分享/微信扫码阅读