memcached通常用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减小访问次数,保证这些数据接口的健壮性。通常memcached的数据都是定时失效的,当数据失效时通常会再次去访问取数据接口,而后将其更新至memcached中。这时就会有一个问题,当某个数据失效时,刚好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,而后都会去调用数据接口去取数据更新,这天然就瞬间地使数据接口失去了memcached的保护,有可能形成系统的故障。 php
那么如何解决这个问题呢? java
第一种:数据不失效,定时更新。即数据存放在memcached中永不失效,可是会有一个定时任务,定时的去更新这个数据。 数据库
第二种:既然该问题的症结在于在数据失效时,会有多个客户端去调用数据接口,那么只要想办法在数据失效时只有一个客户端能访问数据接口便可,要作到这点,天然的想法是加锁:以下: 安全
object value = memcached.get(key); if(null==value){ synchronized{ value = memcached.get(key); if(null==value){ value = db.get(key); memcached.set(key,value); } } } return value;
object value = memcahced.get(key); if(null=value){ if(memcached.add(key)){ value = db.get(); memcached.set(key,value); }else{ while(true){ Thread.sleep(50); value=memcached.get(key); if(null!=value){ break; } } } } return value;
上述的方法存在的缺陷时,一旦数据失效,全部客户端要等待某个客户端更新完毕,这样势必增长服务器压力,能够经过在key失效之间的一段时间就触发更新的方式来解决这个问题。 服务器