zoukankan      html  css  js  c++  java
  • 线上redis服务内存异常分析。

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

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

    redis从2.4更新到了2.6

    因为是租了vps。服务器的内存只有4g可以用,最近发现系统 负载很大。发现是redis服务引起的。

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

    这是很不正常的。想了最近在db1加了很多bit。于是把db1 flushdb。

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

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

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

    setbit 命令

    SETBIT key offset value

    参数 offset  的说明

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

    对使用大的 offset 的 SETBIT 操作来说,内存分配可能造成 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/2/1024/1024=1.4M

    因为 db1 全是bit结构,差不多2k的样子。这样一共占用了1.4*2k=2.8g内存。

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

     

     

     
     
    分类: redis
  • 相关阅读:
    如何禁止在DBGRID末位自动添加一行记录
    DELPHI加密字串(异或运算加密)
    SQL SERVER 正则替换
    sql里的正则表达式
    UFIDA
    delphi raise 语句: 抛出异常
    delphi怎么一次性动态删除(释放)数个动态创建的组件?
    Delphi动态创建组件,并释放内存
    DELPHI 动态 创建和释放 多个 EDIT 控件
    禁止在DBGrid中按delete删除记录
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3162774.html
Copyright © 2011-2022 走看看