问题描述:
项目当中使用了memcached做为缓存.经常会出现一些奇怪的问题,比如修改了数据并通过程序刷新缓存以后,在我们的一个服务程序里仍然读取到的依然是旧的缓存.
问题排查:
之前一直怀疑是memcached有问题,因为每次都是清空了缓存的,但是程序读到的确依然是旧的数据.
想到既然可能是memcached有问题,那就暂时先这样凑合着吧,反正目前也无能为力.
但是昨天突然灵光一闪,想到因为服务的那个进程一直读取有问题,是不是跟服务有关.
看了代码后,突然才恍然大悟.
因为程序的多线程的,所以在设置属性的时候,加了lock判断,这样第一个线程给属性赋值以后,其他线程再需要访问的时候,就不需要
再请求一次缓存了,直接读取静态变量即可.
这个代码本来是没有问题的,但是我们却忽略了一个问题,那就是这个程序的windows 服务形式的.那就说明这个进程是一直开着的.
这个变量第一次加载以后,就一直驻留在进程的内存里了,不管这个缓存以后如何变换,只要这个进程不断,变量的值就不会重新获取.
My God,竟然是这样的一个低级错误,导致了新的缓存一直无法获取.
问题解决:
既然问题的原因找到了,那么就要想下以后如何处理这个问题.
有2种方式:
想了一下,使用bat程序,然后弄个windows计划任务定时自动重启应该就可以搞定了吧.
(当然这种方式,并不能实时解决缓存刷新的问题)
3.尝试修改代码,并不是把整个list缓存在memcached的一个key里,而是一个key仅缓存一个对象.这样就不担心每次重复装载大量的缓存到变量中了.
扩展阅读:
memcached的简单限制就是键(key)和item的限制。最大键长为250个字符。可以接受的储存数据不能超过1MB,因为这是典型slab 的最大值。这里我们可以突破对key长度的限制。
解决后的思考:
有时候多半还可能是环境的为难题.(就象处理昨天一个同事不能打开邮箱里下载的excel文件,发现不是excel的问题,而是浏览器的问题.
浏览器会把报错的页面也存储为.xlsx结尾的了,导致小白同事以为文件已经下载,但是无法打开,然后告诉他换个浏览器问题即解决)
参考资料:
http://winsystem.ctocio.com.cn/266/11877766.shtml
http://suchalin.blog.163.com/blog/static/55304677201191224612650/