redis-Bitmaps 基础概念:https://blog.csdn.net/qq_16399991/article/details/83512937
Redis 内存淘汰机制:https://blog.csdn.net/qq_16399991/article/details/83547286
背景描述
大致需求:脚本批量导入用户数据到redis中,使用bitmap标记用户是否在导入的白名单中。用户量级 亿。
过程描述
- 运行脚本导入白名单用户
- 5分钟后发现redis中有数据丢失
- 发现redis内存沾满 ,停止导入脚本。删除导入的数据。但是有50G数据丢失。
- 做后续数据还原
原因分析
- key使用了分片处理,把key分成了10w个, 每个key占用(1亿/10w=1000)个bit。理想是key1用于标记uid 为1-1000的用户,key2标记 uid为1001-2000的用户,以此类推...;
- offet但是没有做分片处理,就导致了 key1 占用1000个bit。key2占用了2000个bit,但是前1000个全是0记在key1,是无效的存储(因为前1000个用户全都标记存储在key1中)。以此类推,key3占中3000个bit,前2000个bit是无效的存储.....。key10w就占用了1亿个bit,但是只有最后1000个bit是有效的存储;
- redis配置的内存淘汰机制为。allkeys-lru:在主键空间中,优先移除最近未使用的key。
1亿占用redis内存计算就是(1亿bit + 1亿bit-1000bit + 1亿bit-2000bit ........+1000bit)。是等差数列,求和=5000050000000bit = 625006250000B=610357666 kb=596052M =582G, 远远超出了redis内存,触发redis淘汰机制。