位图操作bitmap

位图操作bitmap

一定义

1、位图不是真正的数据类型,它是定义在字符串类型中
2、一个字符串类型的值最多能存储512M字节的内容,位上限:2^32
1MB = 1024KB
1KB = 1024Byte(字节)
1Byte = 8bit(位)

二强势点

可以实时的进行统计,极其节省空间。官方在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”的时间消耗小于50ms, 占用16MB内存

三设置某一位上的值(setbit)

# 设置某一位上的值(offset是偏移量,从0开始)
setbit key offset value
# 获取某一位上的值
GETBIT key offset
# 统计键所对应的值中有多少个 1  
BITCOUNT key (bitcount key)

示例

# 默认扩展位以0填充
127.0.0.1:6379> set mykey ab
OK
127.0.0.1:6379> get mykey
"ab"
127.0.0.1:6379> SETBIT mykey 0 1
(integer) 0
127.0.0.1:6379> get mykey
"\xe1b"
127.0.0.1:6379> 

四获取某一位上的值

  GETBIT key offset

127.0.0.1:6379> GETBIT mykey 3
(integer) 0
127.0.0.1:6379> GETBIT mykey 0
(integer) 1

五bitcount

统计键所对应的值中有多少个 1

127.0.0.1:6379> SETBIT user001 1 1
(integer) 0
127.0.0.1:6379> SETBIT user001 30 1
(integer) 0
127.0.0.1:6379> bitcount user001
(integer) 2

应用场景案例

网站用户的上线次数统计(寻找活跃用户)

用户名为key,上线的天作为offset,上线设置为1

示例: 用户名为 user001 的用户,今年第1天上线,第30天上线

SETBIT user1:login 1 1

SETBIT user1:login 30 1

BITCOUNT user1:login

import redis

r = redis.Redis(host='192.168.43.49',port=6379,db=0)

# user1,一年之中第1天和第5天登录
r.setbit('user1:login',1,1)
r.setbit('user1:login',5,1)
# user2,一年之中第100天和第200天登录
r.setbit('user2:login',100,1)
r.setbit('user2:login',200,1)
# user3,一年之中好多天登录
for i in range(0,365,2):
    r.setbit('user3:login',i,1)
# user4,一年之中好多天登录
for i in range(0,365,3):
    r.setbit('user4:login',i,1)

user_list = r.keys('user*')
print(user_list)

# 活跃用户
active_users = []
# 不活跃用户
noactive_user = []

for user in user_list:
    # 统计位图中有多少个 1
    login_count = r.bitcount(user)
    if login_count >= 100:
       active_users.append((user,login_count))
    else:
      noactive_user.append((user,login_count))

# 打印活跃用户
for active in active_users:
    print('活跃用户:',active)

 

posted @ 2019-08-06 21:00  maplethefox  阅读(639)  评论(0编辑  收藏  举报