memcached一般用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减少访问次数,保证这些数据接口的健壮性。一般memcached的数据都是定时失效的,当数据失效时一般会再次去访问取数据接口,然后将其更新至memcached中。这时就会有一个问题,当某个数据失效时,恰好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,然后都会去调用数据接口去取数据更新,这自然就瞬间地使数据接口失去了memcached的保护,有可能造成系统的故障。
那么如何解决这个问题呢?
第一种:数据不失效,定时更新。即数据存放在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;
这样做的前提是你必须保证这个函数的类是单例的,显然在服务器集群中不可能有这样的场景,那么如果在群集间加锁呢?解铃还需系铃人,既然大家共用一个memcached服务器,那么就使用memcached来实现这个锁机制。即当客户端取不到数据时,先在memcached中设置一个flag表明当前客户端在更新该数据,当其它客户端也来访问时发现失效后就等待直到更新好数据为目。
- 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;
memcached中的add方法是实现该功能的关键,该方法是判断memcached中是否有某个key存在,如果存在则返回false,否则返回true,并添加该key值,如果没有该方法,显然我们只能再一次的通过get 和set去设置该值,显然这样做是线程不安全的,有可能有多个客户端同时取为空,同时去取数据并更新。
上述的方法存在的缺陷时,一旦数据失效,所有客户端要等待某个客户端更新完毕,这样势必增加服务器压力,可以通过在key失效之间的一段时间就触发更新的方式来解决这个问题。
分享到:
相关推荐
memcached缓存使用演示小项目,缓存服务器的搭建,增删改查缓存
这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键做分区存储,而这个区就是Memcached服务端的一个或者多个...
memcached 缓存 jar包,tomcat共享缓存可用,java开发数据库缓存也可用。
PHP MemCached 高级缓存应用代码
韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady
memcached缓存服务器,解压后即可使用,无需安装, 版本:1.2.1
实用缓存操作类,可根据需求实例不同的类 操作简单 实用
Memcached缓存技术资料源码
memcached 缓存图片demo 博文链接:https://zhangjialu-vip.iteye.com/blog/1167345
memcached缓存服务器 ,64位安装包 ,内有简单的使用说明
memcached缓存很全的文档及说明memcached缓存很全的文档及说明memcached缓存很全的文档及说明
memcached-1.2.6-win32-bin
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
Memcached缓存技术,kye-value型,提高访问速度。并支持分布式等
在网上找了好久才找到的,我自己试了绝对好合,memcached.dll我的适合php5.2版的 memcached.exe memcached.dll
memcached监控 博文链接:https://sosuny.iteye.com/blog/420110
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
memcached缓存安装配置
memcached缓存编程实战