位图操作bitmap
# 设置某一位上的值(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>
127.0.0.1:6379> GETBIT mykey 3 (integer) 0 127.0.0.1:6379> GETBIT mykey 0 (integer) 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
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)