redis bitset的滥用问题

博客讨论了bitset在处理大量标志位数据时的内存占用问题。虽然bitset提供了一种简洁的解决方案,但实际使用中需要根据最大offset计算内存占用,例如一篇文章两个点赞就可能占用312.5KB。因此,使用bitset前必须谨慎考虑offset基数和实际使用情况,避免资源浪费。适合offset基数小且活跃用户多的场景,否则set或hash等结构更为合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bitset的好处很多,尤其是第一次接触到这个结构的人。觉得只需要一个key就可以很简单的处理这个标志位的数据, 甚至说几个亿的offset占用内存也会很小。
但在项目实际使用过程中还是要好好算算这笔账的。
bitset占用的内存是用最大的offset来决定的,根本不会管你实际要存多少有效数据,计算公式为

占用内存bit = 最大offset
占用内存B = 最大offset / 8
占用内存KB = 最大offset / 8 / 1024
占用内存MB = 最大offset / 8 / 1024 / 1024

比如现在我们要存用户对一篇文章的点赞数, 以及判断用户对文章有没有点赞。
如果使用bitset, 那么确实一篇文章只要一个key就行了,也没有hashset的结构复杂,比如文章id为1, 简单点key的名字就为article:star:1
那么点赞确实很简单,如果用户id=100

## 点赞命令
setbit article:star:1 100 1
## 获取点赞数量
bitcount article:star:1
## 判断指定用户是否点赞
GETBIT article:star:1 100

用户

看下占用内存忽略不计

在这里插入图片描述

使用起来很简单吧,效果看起来也很开心。
但如果这个时候又来了一个用户点赞,用户id=2560000呢
使用方式没有变化,也完成了点赞的统计。但是占用内存呢?

在这里插入图片描述

这是什么概念?记录一篇小小的文章点赞数,即使只有两个人点赞, 就占用了312.5KB,来个几百篇文章或者动态之类的,再加上其他功能也这么使用用,这要浪费吃掉多少内存。
要是系统再使用雪花算法之类的生成用户id那可真是太刺激了。
因此用bitset的时候除了考虑系统人数规模(主要是决定bitset offset值的条件),还要考虑实际会有多少人用到这个功能。即使人数达到了很大的量级,但某个功能是个很偏僻的功能,还是要少用。
总结如下

  • 使用之前永远要作为第一要务考虑的就是offset的基数大小问题
  • 如果uv很小,而且offset基数又很大,不要使用,offset基数很小,可以用
  • 如果uv非常高,offset基数即使大一点,也可以使用,但这个要综合考虑去计算offset基数到底多大,uv又有没有高到离谱的程度。否则仍然还是set或者hash之类的更适用。
Redis Bitset是一种数据结构,它可以用于存储和操作位(bit)的集合。通过使用Redisson提供的相关API,如RBitSet,可以创建和管理Redis Bitset。[1] RBitSet提供了一些常见的操作,比如设置位,过期时间等。 需要注意的是,Redis并不保证数据的强一致性。这意味着在实际的集群中,在特定的条件下,可能会丢失写操作。对于Redis集群之间的复制,具体的实现是通过主从部署架构和哨兵机制来实现的。这种架构可以提供高可用性,但不保证数据的零丢失。 因此,当使用Redis Bitset时,需要注意数据的一致性和可靠性,并在实际应用中根据需求做出相应的权衡和决策。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [RedisBitSet](https://blog.csdn.net/Best_Lynn/article/details/129592065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [redis场景知识分析,基本结构整理](https://blog.csdn.net/weixin_56993128/article/details/125671579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值