zoukankan      html  css  js  c++  java
  • 位图操作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)
  • 相关阅读:
    安装centos后无法引导启动windows7的解决方法
    Ubuntu14.04 搜索不到WIFI或连接不上的解决方法。
    ubuntu磁盘分区问题
    Cenos7下nginx+mysql+php环境的搭建
    PHP发送邮件
    php使用数据库的并发问题(乐观锁与悲观锁)
    总结一些php的面试题
    遇到高并发一些处理方法
    PHP中9大缓存技术总结
    php并发加锁示例
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11311821.html
Copyright © 2011-2022 走看看