位图
字符串命令 包含4个相关命令getbit[setbit](http://doc.redisfans.com/string/setbit.html)[bitop](http://doc.redisfans.com/string/bitop.html)[bitcount](http://doc.redisfans.com/string/bitcount.html)
基本语法
GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 O(1)
SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 O(1)
BITCOUNT key [start] [end]
计算给定字符串中,被设置为 1 的比特位的数量。 O(n)
BITOP operation destkey key [key ...]
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 O(n)
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种. 并\或\非\异或
使用
可以用来统计在线人数. 下边代码欢迎指正
class OnlineUser(object):
max_num = 4
rs = ''
rs_key_min_format = 'wxapp_online_users_min_{}'
rs_key_min_expire = max_num * 60 + 10
rs_key_dest = 'wxapp_online_users_dest'
def __init__(self, user_id=None, rs=None):
self.rs = rs if rs else App.get_rs('rs_wxapp')
self.user_id = user_id
self.now = datetime.now()
self.rs_key_min = self.rs_key_min_format.format(self.datetime2str(self.now))
def datetime2str(self, t):
return t.strftime('%Y%m%d-%H%M')
def set_online(self):
if self.user_id and self.user_id < 8000000:
self.rs.setbit(self.rs_key_min, self.user_id, 1)
self.rs.expire(self.rs_key_min, self.rs_key_min_expire)
return True
return False
def get_online(self, t):
if not self.user_id:
return 0
if not t:
rs_key = self.rs_key_min_format.format(self.datetime2str(self.now))
else:
rs_key = self.rs_key_min
return self.rs.getbit(rs_key, self.user_id)
def get_online_user_count(self, kind='min', num=5):
rs_keys = self.get_online_tongji_rs_keys(kind, num)
self.rs.bitop('or', self.rs_key_dest, *rs_keys)
return self.rs.bitcount(self.rs_key_dest)
def get_online_tongji_rs_keys(self, kind='min', num=5):
rs_keys = []
num = min(self.max_num, num)
if kind == 'min':
for i in range(num):
tstr = self.datetime2str(self.now - timedelta(minutes=i))
rs_keys.append(self.rs_key_min_format.format(tstr))
return rs_keys
def add_online_user(view_func):
@wraps(view_func)
def _decorated_func(*args, **kwargs):
wxuser = App.local.player.wxuser
if wxuser.id:
online = OnlineUser(wxuser.id / 10)
print(online.rs_key_min)
online.set_online()
return view_func(*args, **kwargs)
return _decorated_func