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天内活跃过的用户列表。
下面表格表示对应一天,一周,一个月统计时所花费的时间。
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
相关推荐
1. **Bitmap的创建与设置**:源代码会展示如何使用`SETBIT`命令创建一个空的Bitmap,并通过`SETBIT`或`INCRBY`命令设置特定用户ID的点赞状态。例如,`SETBIT bitmap_key user_id 1`表示用户ID为`user_id`的用户点赞...
通过 Spring Boot 和 Redis Bitmap 的结合使用,可以高效地实现用户签到功能。这种方法不仅能够节省存储空间,还能显著提高查询速度。开发者可以根据自身项目的实际情况调整相关的配置和策略,以满足不同的业务需求...
标题中的“利用Redis统计网站在线活跃用户的方法”指的是使用Redis这一内存数据存储系统来实时跟踪并统计网站的活跃用户数量。Redis支持多种数据结构,其中一种是基于字符串的位操作,即Bitmaps,这对于统计在线用户...
这在用户行为分析和活跃用户统计中非常有效。 3. HyperLogLog(HLL):Redis的HLL是用于估算唯一元素数量的高效数据结构。在UV(独立访客)统计中,我们需要记录每天访问网站的不同用户。传统的做法可能需要存储每...
通过 `BITCOUNT` 命令,我们可以快速统计任何用户在特定时间段内的活跃天数,或者通过 `BITOP` 操作比较不同用户之间的活跃度。 总之,Redis 的 Bitmap 类型是一种强大的数据结构,它可以有效利用内存并提供高效的...
Redis中的Bitmap是一个非常...例如,统计活跃用户总数、记录用户登录状态等,都是Bitmap的典型应用。通过巧妙地利用Bitmap,可以设计出高效、节省存储空间的解决方案,这对于大数据分析和实时监控等场景具有重要意义。
4. Bitmap:使用 SETBIT 和 GETBIT 命令可以实现 Bitmap,例如统计用户的行为。 setbit user:behavior 0 1 getbit user:behavior 0 Redis 提供了丰富的命令来处理不同的数据类型和场景,开发者可以根据不同的需求...
在Redis中,BitMap是基于字符串(String)实现的,通过`setbit`, `getbit`, `bitcount`等命令进行操作。例如,我们可以使用`setbit`命令设置或获取某个比特位的值,`bitcount`则用来计算整个字符串中1的个数。在实际...
在Redis中,位图(Bitmap)是一种非常高效的数据结构,常用于存储和处理大量二进制数据。在本文中,我们将深入探讨2位图数组在Redis中的应用。 首先,了解位图的基本概念:位图是一种特殊的数组,其中每个元素(或...
### Redis的介绍与深入使用详解 #### 一、Redis简介 Redis是一个开源的内存数据库,作为NoSQL数据库的一种,以其高性能、丰富的数据结构支持、持久化能力、复制、集群及发布/订阅等特性而广受好评。由于这些特性,...
Set 适用于标签系统、唯一用户统计等场景。 **Sorted Set (Zset)** Sorted Set 是有序的集合,每个成员都有一个分数(score),根据分数进行排序。常用命令有 `zadd`、`zrem`、`zrange`、`zrevrange`、`zscore`。...
- **位图(Bitmap)**:用于处理位级别的数据,通常用于统计或计数,例如`SETBIT`、`GETBIT`、`BITCOUNT`等。 #### 八、数据库管理 - **EXISTS key**:检查给定`key`是否存在于当前数据库。 - **TYPE key**:返回`key...
### Redis 数据结构详解 #### 3.1 字符串(String) - **定义与用途**:字符串是 Redis 最基础的数据...通过这些知识点的学习,可以更好地理解 Redis 的工作原理和应用场景,从而在实际项目中更加高效地使用 Redis。
例如,统计特定用户在一年内任意日期的登录情况可以通过使用Bitmap来实现。在Redis中,String本质上是由字节数组表示的。因此,通过位操作,我们可以将一个字符串转换为其对应的ASCII码,并进一步转换为二进制表示,...
│ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....
│ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....
│ 03-签到思路分析及bitmap-setbit命令.mp4 │ 04-bitmap-bitfield命令及对应的java代码练习.mp4 │ 05-bitmap补充.mp4 │ 06-签到-1.mp4 │ 07-签到-2.mp4 │ 08-新增积分.mp4 │ 09-查询我的今日积分情况....