读完Can someone explain redis setbit command?后
和http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ (在redis文档中引用)
我仍然很难确定在SET上使用SET的用例。上述来源似乎引用了使用SETBIT存储事件和二进制“可数”数据集的驱动因素,因为它有助于大幅减少所需存储的数据量,同时仍然保持访问方便。
在位图100000001中存储userID网站的每日唯一访问次数(从0中抵消)--其中只有ID 0和8的用户是唯一进行访问的用户--是否比仅仅设置时间戳:userID更好?请解释一下。谢谢。
我很抱歉,这显然是个新来的问题。
发布于 2015-05-24 20:31:41
的答案是:它取决于.,在上面的用法中,它取决于您每天有多少登录(位掩码中有多少位是活动的)。如果您有2个登录名或随机的用户it,最好只存储一个登录列表。
但是如果你有一个活跃的用户群,并且60%的用户是活跃的。事实证明,与在列表中存储ID相比,必须存储1位(实际上小于平均值,因为redis只存储位掩码,直到达到最高的设置位(1) )对内存更友好。将in存储在列表中将导致使用例如32位(整数)来表示1位信息,这是浪费的。如果列表使用的是具有指向相关节点的显式指针的树概念,则可能会更多。由于我们的RAM有点昂贵/有限,而且我们希望东西也是可伸缩的,所以我们应该在满足所有查询要求的同时,尽量减少内存的使用。
所以这是我从用例到用例的决定。
然而,使用位掩码可以非常快速地批量安装庞大的数据集。假设您存储了两个位掩码:一个是loggedInToday,一个是signedUpForNewsletter。通过使用位操作例如和(处理器可以非常快地完成这些操作),您可以突然过滤掉今天登录并注册了通讯的所有用户in (由1的位位置表示)。由于位掩码的交叉点可以由比id的两个有序列表的至少快一个数量级,所以您可以突然对数百万用户执行此操作,但仍然停留在50‘s以下。
用来总结我的答案:位掩码的使用允许进行一些实时分析,如果你期望列表中有很多东西,就可以节省大量的内存。注意到,这只是一种用法,还有很多其他的用法(比如布卢姆过滤器)。
发布于 2015-05-16 07:55:27
位是计算机使用的基本数据单元,Redis的BIT*命令允许您轻松地操作位值。在OP提供的示例中,使用比特流将主要节省空间。
为每个登录保留一个密钥将花费(至少)密钥和值的大小,总计约10个字节,而一个比特流只需要每个用户1位。
https://stackoverflow.com/questions/30269158
复制相似问题