记一次Redis bitmap导致的miss问题

在批量导入亿级用户数据到Redis中使用Bitmaps时,因分片与offset处理不当,导致内存占用远超预期,触发内存淘汰机制,造成大量数据丢失。分析问题并提出优化方案。

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

redis-Bitmaps 基础概念:https://blog.youkuaiyun.com/qq_16399991/article/details/83512937

Redis 内存淘汰机制:https://blog.youkuaiyun.com/qq_16399991/article/details/83547286

背景描述

大致需求:脚本批量导入用户数据到redis中,使用bitmap标记用户是否在导入的白名单中。用户量级 亿。

过程描述

  •  运行脚本导入白名单用户
  • 5分钟后发现redis中有数据丢失
  • 发现redis内存沾满 ,停止导入脚本。删除导入的数据。但是有50G数据丢失。
  • 做后续数据还原

原因分析

  1. key使用了分片处理,把key分成了10w个, 每个key占用(1亿/10w=1000)个bit。理想是key1用于标记uid 为1-1000的用户,key2标记 uid为1001-2000的用户,以此类推...;
  2. offet但是没有做分片处理,就导致了 key1 占用1000个bit。key2占用了2000个bit,但是前1000个全是0记在key1,是无效的存储(因为前1000个用户全都标记存储在key1中)。以此类推,key3占中3000个bit,前2000个bit是无效的存储.....。key10w就占用了1亿个bit,但是只有最后1000个bit是有效的存储;
  3. redis配置的内存淘汰机制为。allkeys-lru:在主键空间中,优先移除最近未使用的key。

 

1亿占用redis内存计算就是(1亿bit + 1亿bit-1000bit + 1亿bit-2000bit ........+1000bit)。是等差数列,求和=5000050000000bit = 625006250000B=610357666 kb=596052M =582G, 远远超出了redis内存,触发redis淘汰机制。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值