redis

redis命令参考

位图

字符串命令 包含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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值