`
m635674608
  • 浏览: 5043798 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

redis 用setbit(bitmap)统计活跃用户

 
阅读更多

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)

具体的代码类似下面这样:

redis.setbit(play:yyyy-mm-dd, user_id, 1)

这样一次记录的复杂度是O(1),在Redis中速度非常快。
而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。
如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。

下面表格表示对应一天,一周,一个月统计时所花费的时间。

Period Time (ms)
Daily 50.2
Weekly 392.0
Monthly 1624.8

下面是具体的java代码片断:

1.算出一天的活跃用户数量

import redis.clients.jedis.Jedis;
import java.util.BitSet;
...
  Jedis redis = new Jedis("localhost");
...
  public int uniqueCount(String action, String date) {
    String key = action + ":" + date;
    BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
    return users.cardinality();
  }

2.计算某几个内活跃用户的数量(某一天活跃就算,所以是取并集)

import redis.clients.jedis.Jedis;
import java.util.BitSet;
...
  Jedis redis = new Jedis("localhost");
...
  public int uniqueCount(String action, String... dates) {
    BitSet all = new BitSet();
    for (String date : dates) {
      String key = action + ":" + date;
      BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
      all.or(users);
    }
    return all.cardinality();
  }

具体的用法还很多,比如你还可以对独特终端的用户单独记一个bitmap,这样就可以统计不同终端用户的活跃情况。有的同学会说用set也能实现同样的效果。但使用set在内存使用量上是会大很多的。

 

http://www.dataguru.cn/article-265-1.html

http://blog.csdn.net/lglgsy456/article/details/39394961

分享到:
评论

相关推荐

    redis 的bitmap点赞功能的应用源码.zip

    1. **Bitmap的创建与设置**:源代码会展示如何使用`SETBIT`命令创建一个空的Bitmap,并通过`SETBIT`或`INCRBY`命令设置特定用户ID的点赞状态。例如,`SETBIT bitmap_key user_id 1`表示用户ID为`user_id`的用户点赞...

    Springboot如何使用Redis bitmap实现签到功能含完整代码(值得珍藏)

    通过 Spring Boot 和 Redis Bitmap 的结合使用,可以高效地实现用户签到功能。这种方法不仅能够节省存储空间,还能显著提高查询速度。开发者可以根据自身项目的实际情况调整相关的配置和策略,以满足不同的业务需求...

    利用Redis统计网站在线活跃用户的方法

    标题中的“利用Redis统计网站在线活跃用户的方法”指的是使用Redis这一内存数据存储系统来实时跟踪并统计网站的活跃用户数量。Redis支持多种数据结构,其中一种是基于字符串的位操作,即Bitmaps,这对于统计在线用户...

    Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

    这在用户行为分析和活跃用户统计中非常有效。 3. HyperLogLog(HLL):Redis的HLL是用于估算唯一元素数量的高效数据结构。在UV(独立访客)统计中,我们需要记录每天访问网站的不同用户。传统的做法可能需要存储每...

    redis 的bitmap类型.pdf

    通过 `BITCOUNT` 命令,我们可以快速统计任何用户在特定时间段内的活跃天数,或者通过 `BITOP` 操作比较不同用户之间的活跃度。 总之,Redis 的 Bitmap 类型是一种强大的数据结构,它可以有效利用内存并提供高效的...

    Redis的bitmap从基础到业务

    Redis中的Bitmap是一个非常...例如,统计活跃用户总数、记录用户登录状态等,都是Bitmap的典型应用。通过巧妙地利用Bitmap,可以设计出高效、节省存储空间的解决方案,这对于大数据分析和实时监控等场景具有重要意义。

    Redis 常用命令和场景使用.docx

    4. Bitmap:使用 SETBIT 和 GETBIT 命令可以实现 Bitmap,例如统计用户的行为。 setbit user:behavior 0 1 getbit user:behavior 0 Redis 提供了丰富的命令来处理不同的数据类型和场景,开发者可以根据不同的需求...

    Redis中3种特殊的数据类型(BitMap、Geo和HyperLogLog)

    在Redis中,BitMap是基于字符串(String)实现的,通过`setbit`, `getbit`, `bitcount`等命令进行操作。例如,我们可以使用`setbit`命令设置或获取某个比特位的值,`bitcount`则用来计算整个字符串中1的个数。在实际...

    2 位图数组在 Redis 中的应用 1

    在Redis中,位图(Bitmap)是一种非常高效的数据结构,常用于存储和处理大量二进制数据。在本文中,我们将深入探讨2位图数组在Redis中的应用。 首先,了解位图的基本概念:位图是一种特殊的数组,其中每个元素(或...

    Redis的介绍和使用(超详细概念介绍)

    ### Redis的介绍与深入使用详解 #### 一、Redis简介 Redis是一个开源的内存数据库,作为NoSQL数据库的一种,以其高性能、丰富的数据结构支持、持久化能力、复制、集群及发布/订阅等特性而广受好评。由于这些特性,...

    Redis系列之常有数据类型应用场景

    Set 适用于标签系统、唯一用户统计等场景。 **Sorted Set (Zset)** Sorted Set 是有序的集合,每个成员都有一个分数(score),根据分数进行排序。常用命令有 `zadd`、`zrem`、`zrange`、`zrevrange`、`zscore`。...

    Redis 命令参考 2019.pdf

    - **位图(Bitmap)**:用于处理位级别的数据,通常用于统计或计数,例如`SETBIT`、`GETBIT`、`BITCOUNT`等。 #### 八、数据库管理 - **EXISTS key**:检查给定`key`是否存在于当前数据库。 - **TYPE key**:返回`key...

    Javs实战之Redis入门精华讲解

    ### Redis 数据结构详解 #### 3.1 字符串(String) - **定义与用途**:字符串是 Redis 最基础的数据...通过这些知识点的学习,可以更好地理解 Redis 的工作原理和应用场景,从而在实际项目中更加高效地使用 Redis。

    Redis中最常用的String数据结构.docx

    例如,统计特定用户在一年内任意日期的登录情况可以通过使用Bitmap来实现。在Redis中,String本质上是由字节数组表示的。因此,通过位操作,我们可以将一个字符串转换为其对应的ASCII码,并进一步转换为二进制表示,...

    springcloudalibaba+vue分布式微服务 天机学堂 实战课程 下载因为太大存百度云盘1.zip

    │ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....

    springcloudalibaba+vue分布式微服务 天机学堂 实战课程 下载因为太大存百度云盘2.zip

    │ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....

    springcloudalibaba+vue分布式微服务 天机学堂 实战课程 下载因为太大存百度云盘4.zip

    │ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....

Global site tag (gtag.js) - Google Analytics