Redis位图法记录在线用户的状态
Redis位图法记录在线用户的状态
位图
Redis官方文档对于位图的介绍如下:
位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合。由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB,适合于设置 2^32个不同的位。
位操作分为两组:常量时间单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值。对一组位的操作,例如计算指定范围位的置位数量。
位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式。例如,在一个系统中,不同用户由递增的用户 ID 来表示,可以使用 512MB 的内存来表示 400 万用户的单个位信息(例如他们是否需要接收信件)。
简而言之,位图操作是用来操作比特位的,其优点是节省内存空间。为什么可以节省内存空间呢?假如我们需要存储100万个用户的登录状态,使用位图的话最少只需要100万个比特位(比特位1表示登录,比特位0表示未登录)就可以存储了,而如果以字符串的形式存储,比如说以userId为key,是否登录(字符串“1”表示登录,字符串“0”表示未登录)为value进行存储的话,就需要存储100万个字符串了,相比之下使用位图存储占用的空间要小得多,这就是位图存储的优势。
问题引出
如何有效统计:
1:如何记录用户的登陆情况
2:如何查询活跃用户(连续登陆)
思路
构造一个位图,里面存的是二进制数据,如:1 0 1 0 1 0 1,通过修改userId对应位置上的0和1来修改用户在线状态,由于默认值为0,所以1代表用户处于在线状态,0代表用户处于离线状态,如图:
构造了Mon、Thus、Web三个位图,对于Mon来说,userId=1的用户处于在线状态,userId=2的用户处于离线状态,userId=3的用户处于在线状态,当userId=10的用户上线后,就把第10位上值变成1
空间预估 二进制数据1位为1bit 1千兆字节(gb)=8589934592比特(bit) 理论上1G的内存可以记录85亿多的用户状态,如果userId不连贯,有的userId位数超过85亿位,可以使用一些算法、或者对userId按位分段来解决
实例
假设现在有八个用户
Uid: 1 2 3 4 5 6 7 8 周一 : 0 1 0 1 0 0 0 1 周二 : 0 1 1 1 0 1 0 1 周三 : 1 1 0 1 1 0 0 1 周四 : 0 1 0 1 0 1 0 1 周五 : 1 1 0 1 1 0 1 1 周六 : 0 1 0 0 0 1 1 1 周七 : 0 1 0 1 0 0 0 1
我们如何统计一周连续登陆的用户呢?(按位与)
一周连续登陆:01000001:二号用户和八号用户连续登陆
使用命令
setbit key offset value 修改key中,第offset位的值为value
getbit key offset 获取key中,第offset位上的value
bitcount key 统计key中,1的个数
itop op destKey key1 key2 ….. 其中op可以为AND(于)、OR(或)、NOT(非)、XOR(异或)
命令的主要作用是,给key1、key2..等,这种二进制数据,按位做逻辑运算,结果付到destkey中,没有setbit的位置默认为0
演示
Uid: 1 2 3 4 5 6 7 8
周一 : 0 1 0 1 0 0 0 1
周二 : 0 1 1 1 0 1 0 1
周三 : 1 1 0 1 1 0 0 1
redis 127.0.0.1:6379>setbit mon 8 0 (integer) 0 redis 127.0.0.1:6379>setbit mon 2 1 (integer) 0 redis 127.0.0.1:6379>setbit mon 3 1 (integer) 0 redis 127.0.0.1:6379>setbit mon 8 1 (integer) 0 redis 127.0.0.1:6379>setbit feb 8 0 (integer) 0 redis 127.0.0.1:6379>setbit feb 2 1 (integer) 0 redis 127.0.0.1:6379>setbit feb 3 1 (integer) 0 redis 127.0.0.1:6379>setbit feb 4 1 (integer) 0 redis 127.0.0.1:6379>setbit feb 6 1 (integer) 0 redis 127.0.0.1:6379>setbit feb 8 1 (integer) 0 redis 127.0.0.1:6379>setbit wen 8 0 (integer) 0 redis 127.0.0.1:6379>setbit wen 1 1 (integer) 0 redis 127.0.0.1:6379>setbit wen 2 1 (integer) 0 redis 127.0.0.1:6379>setbit wen 4 1 (integer) 0 redis 127.0.0.1:6379>setbit wen 5 1 (integer) 0 redis 127.0.0.1:6379>setbit wen 8 1 (integer) 0 redis 127.0.0.1:6379>bitop and res mon feb wen #最后得出结果
相关文章
- 监测Redis运行状态实时监测(redis运行状态)
- 如何在操作系统中安装 Redis 数据库?(os安装redis)
- 如何快速查看Redis集群状态(怎么查看redis集群)
- 状态深入探索如何查看 Redis 的服务器繁忙程度(怎么查看redis的闲忙)
- 基于微擎的Redis加速网站运行(微擎启用redis)
- 开启新世代微擎20结合Redis的极致性能体验(微擎2.0redis)
- Redis存储实现用户角色权限管理(角色权限存放redis)
- 腾讯云Redis激活精彩用户体验(腾讯云redis活动)
- 腾讯云上查看最新Redis报价(腾讯云redis报价)
- 精准调用,快速响应缓存框架Redis(缓存框架redis)
- Redis缓存高效提升性能(缓存与redis)
- 性检查Redis服务器连接状态简单而有效的方法(检测redis服务器连接)
- 比较直接内存与Redis的优势和劣势(直接内存还是redis)
- 监测Redis更新状态及早发现风险(监控redis是否更新)
- 万万千万百万用户的Redis存储之旅(百万用户redis存储)
- 强化用户黏度Redis的福音(用户黏度 redis)
- 新版Redis让用户更轻松轻松构建因素应用(新版redis)
- 有哪些深入理解Redis它的数据结构有哪些(数据库redis使用的数据结构)
- Redis持久化实现数据永恒存储(什么叫redis持久化)
- 使用SSH远程查看Redis状态(ssh查看redis)
- 基于Redis的流量控制措施(使用redis限制流量)
- 代码监控下Redis的状态变迁(代码监控redis)
- 优惠券减免,Redis储存用户信息(优惠券存储用户redis)
- 安装Redis集群,让用户尽享实时数据服务(redis集群安装用户)
- 谨防Redis链表数据不一致现象(redis链表不一致)
- Redis实现快速索引值删除(redis通过索引删值)