记一次Redis bitmap导致的miss问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16399991/article/details/83548533

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数据丢失。
  • 做后续数据还原

原因分析

  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淘汰机制。

 

猜你喜欢

转载自blog.csdn.net/qq_16399991/article/details/83548533