• 项目bug处理思考


    问题描述:

    项目当中使用了memcached做为缓存.经常会出现一些奇怪的问题,比如修改了数据并通过程序刷新缓存以后,在我们的一个服务程序里仍然读取到的依然是旧的缓存.

       

    问题排查:

    之前一直怀疑是memcached有问题,因为每次都是清空了缓存的,但是程序读到的确依然是旧的数据.

    想到既然可能是memcached有问题,那就暂时先这样凑合着吧,反正目前也无能为力.

       

    但是昨天突然灵光一闪,想到因为服务的那个进程一直读取有问题,是不是跟服务有关.

    看了代码后,突然才恍然大悟.

    因为程序的多线程的,所以在设置属性的时候,加了lock判断,这样第一个线程给属性赋值以后,其他线程再需要访问的时候,就不需要

    再请求一次缓存了,直接读取静态变量即可.

       

    这个代码本来是没有问题的,但是我们却忽略了一个问题,那就是这个程序的windows 服务形式的.那就说明这个进程是一直开着的.

    这个变量第一次加载以后,就一直驻留在进程的内存里了,不管这个缓存以后如何变换,只要这个进程不断,变量的值就不会重新获取.

       

    My God,竟然是这样的一个低级错误,导致了新的缓存一直无法获取.

       

    问题解决:

    既然问题的原因找到了,那么就要想下以后如何处理这个问题.

    有2种方式:

    1. 以后修改缓存以后去手工重启下这个服务.(有点笨的方式,如果忘记操作就杯具了,不太适合程序员的偷懒精神)
    2. 能否在后台触发服务的自动重启?

      想了一下,使用bat程序,然后弄个windows计划任务定时自动重启应该就可以搞定了吧.

      (当然这种方式,并不能实时解决缓存刷新的问题)

    3.尝试修改代码,并不是把整个list缓存在memcached的一个key里,而是一个key仅缓存一个对象.这样就不担心每次重复装载大量的缓存到变量中了.

     扩展阅读:

    memcached的简单限制就是键(key)和item的限制。最大键长为250个字符。可以接受的储存数据不能超过1MB,因为这是典型slab 的最大值。这里我们可以突破对key长度的限制。

     

    解决后的思考:

    1. 在怀疑别人代码是否有问题时候,先检查自己的代码,有时候代码都没有问题的时候,就换个思路,是不是还有其他的问题可能.

      有时候多半还可能是环境的为难题.(就象处理昨天一个同事不能打开邮箱里下载的excel文件,发现不是excel的问题,而是浏览器的问题.

      浏览器会把报错的页面也存储为.xlsx结尾的了,导致小白同事以为文件已经下载,但是无法打开,然后告诉他换个浏览器问题即解决)

         

    2. 在想解决方案的时候,多思考一步,是否可以自动化运行,降低复杂度.

       

    参考资料:

    http://winsystem.ctocio.com.cn/266/11877766.shtml

    http://suchalin.blog.163.com/blog/static/55304677201191224612650/

     

      

  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/xinzhyu/p/3083503.html
Copyright © 2020-2023  润新知