千家信息网

redis如何通过位图法记录在线用户的状态

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关redis如何通过位图法记录在线用户的状态的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在进入今天的主题前,先简单地解释下Redis中的位图到
千家信息网最后更新 2026年11月01日redis如何通过位图法记录在线用户的状态

这篇文章给大家分享的是有关redis如何通过位图法记录在线用户的状态的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

在进入今天的主题前,先简单地解释下Redis中的位图到底是什么。Redis官方文档对于位图的介绍如下:

位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合。由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB,适合于设置 2^32个不同的位。

位操作分为两组:常量时间单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值。对一组位的操作,例如计算指定范围位的置位数量。

位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式。例如,在一个系统中,不同用户由递增的用户 ID 来表示,可以使用 512MB 的内存来表示 400 万用户的单个位信息(例如他们是否需要接收信件)。

简而言之,位图操作是用来操作比特位的,其优点是节省内存空间。为什么可以节省内存空间呢?假如我们需要存储100万个用户的登录状态,使用位图的话最少只需要100万个比特位(比特位1表示登录,比特位0表示未登录)就可以存储了,而如果以字符串的形式存储,比如说以userId为key,是否登录(字符串"1"表示登录,字符串"0"表示未登录)为value进行存储的话,就需要存储100万个字符串了,相比之下使用位图存储占用的空间要小得多,这就是位图存储的优势。

这几天在工作中,遇到一个case,就是需要自己实现一个IM在线用户状态的记录,当时查了很多中实现方式,今天来分享一下

主要思想

构造一个位图,里面存的是二进制数据,如:1 0 1 0 1 0 1,通过修改userId对应位置上的0和1来修改用户在线状态,由于默认值为0,所以1代表用户处于在线状态,0代表用户处于离线状态,如图:


构造了Mon、Thus、Web三个位图

构造了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按位分段来解决

使用命令

setbit key offset value 修改key中,第offset位的值为value

Setbit

getbit key offset 获取key中,第offset位上的value

getbit

bitcount key 统计key中,1的个数

bitcount

bitop op destKey key1 key2 ….. 其中op可以为AND(于)、OR(或)、NOT(非)、XOR(异或)
命令的主要作用是,给key1、key2..等,这种二进制数据,按位做逻辑运算,结果付到destkey中,没有setbit的位置默认为0

举个栗子

构造了Mon、Thus、Web三个位图,作为近三天登录状态的位图


构造了Mon、Thus、Web三个位图

第一天
userId=10000,userId=9999,userId=8888的用户登录了

setbit mon 10000 1; setbit mon 9999 1; setbit mon 8888 1;

统计第一天在线用户量

bitcount mon

有三个用户登录

第一天有三个用户登录

第二天

userId=9999,userId=7777的用户登录了

setbit thus 9999 1; setbit thus 7777 1;

获取userId=7777用户在线状态

getbit thus 7777

7777用户处于登录状态

第三天
userId=9999,userId=6666的用户登录了

setbit web 9999 1;  setbit web 6666 1;

获取三天都登录的用户数

bitop and resultand mon thus web;

获取三天都登录的用户数

获取三天内登陆过的用户数

bitop or resultor mon thus web;

获取三天内登陆过的用户数

redis使用位图法记录在线用户的状态就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。

感谢各位的阅读!关于"redis如何通过位图法记录在线用户的状态"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

用户 位图 状态 登录 在线 存储 三个 字符 字符串 二进制 空间 内存 数据 用户数 类型 不同 最大 代表 优势 位置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 科技互联网产品 九亚互联网科技 互联网科技论文 电子科技大学互联网 火传媒上海互联网科技 多迪互联网科技有限公司 科技赋能互联网健康 创业天下互联网科技有限公司 现代互联网科技股 互联网科技创新服务 互联网为啥属于高科技 消费医药和互联网科技 乌鲁木齐新华智原互联网科技学校 广州新华互联网科技学校电竞方面 徐州市互联网科技有限公司 梅州GM互联网络科技有限公司 黑云互联网科技有限公司 宁波跨境商互联网科技有限公司 10位科技互联网大佬 互联网科技深圳 互联网核心科技是什么 盈实互联网科技 互联网科技公司做什么 银川新华互联网科技职业技术培训学校图片 河南猎农互联网科技有限公司 合肥互联网科技公司公章图片 神州科技互联网有限公司 珠海东科互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司
0