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

31次阅读
没有评论

共计 1909 个字符,预计需要花费 5 分钟才能阅读完成。

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

前言

在进入今天的主题前,先简单地解释下 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 如何通过位图法记录在线用户的状态”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1909字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)