线上redis服务内存异常分析。

项目中,新增了一个统计功能,用来统计不一样手机型号的天天访问pv,看了下redis2.6有个setbit的功能,因而打算尝尝鲜把html

redis从2.4更新到了2.6redis

由于是租了vps。服务器的内存只有4g能够用,最近发现系统 负载很大。发现是redis服务引发的。服务器

查了下redis的key db1 6w+。db1 不到2k。内存监控确有4.5g(这个很奇怪)。spa

 

这是很不正常的。想了最近在db1加了不少bit。因而把db1 flushdb。orm

发现内存占用一下就刷刷的降下来了。htm

查了很多关于reids bit的资料。刚开始还坚信多是redis的一个bug。昨天晚上找了凌晨2点多。仍是没啥头绪。很恼火。blog

今天仔细看了下redis的 setbit 命令。恍然大悟。我作了件多么傻b的事情。vps

setbit 命令内存

SETBIT key offset valueget

参数 offset  的说明

offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 以内)。

对使用大的 offsetSETBIT 操做来讲,内存分配可能形成 Redis 服务器被阻塞。具体参考 SETRANGE 命令,warning(警告)部分。

 

而后在程序中查看个人offset设置。

由于是须要统计某个机型天天的pv。全部为了最大限度防止偏差,offset 格式是当前时间的HHmmssss

SimpleDateFormat msdf = new SimpleDateFormat("HHmmssss");
long offset = Long.valueOf(msdf.format(new Date()));//时分秒毫秒
redisClient.setBit(hkey,offset,true);

  算了下offset的最大值是23595999 最小值是0,平均值是11798000,也就是说。在二进制数据上在11798000位上置1

    而后又算了下

    11798000/8/1024/1024=1.4M

由于 db1 全是bit结构,差很少2k的样子。这样一共占用了1.4*2k=2.8g内存。

这就找出问题所在了。修改offset的大小便可。

相关文章
相关标签/搜索