位图以及其应用场景
位图,顾名思义,就是一种用二进制位来标识的数据,数值只能是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的位存储为什么这么牛?
--------EOF---------
微信分享/微信扫码阅读
微信分享/微信扫码阅读