`
davidxiaozhi
  • 浏览: 241585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

memcached缓存失效时的高并发访问问题解决

阅读更多

 

memcached一般用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减少访问次数,保证这些数据接口的健壮性。一般memcached的数据都是定时失效的,当数据失效时一般会再次去访问取数据接口,然后将其更新至memcached中。这时就会有一个问题,当某个数据失效时,恰好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,然后都会去调用数据接口去取数据更新,这自然就瞬间地使数据接口失去了memcached的保护,有可能造成系统的故障。

        那么如何解决这个问题呢?

        第一种:数据不失效,定时更新。即数据存放在memcached中永不失效,但是会有一个定时任务,定时的去更新这个数据。

        第二种:既然该问题的症结在于在数据失效时,会有多个客户端去调用数据接口,那么只要想办法在数据失效时只有一个客户端能访问数据接口即可,要做到这点,自然的想法是加锁:如下:

 

 

  1. object value = memcached.get(key);  
  2. if(null==value){  
  3.         synchronized{  
  4.                value = memcached.get(key);  
  5.                if(null==value){  
  6.                       value = db.get(key);  
  7.                       memcached.set(key,value);  
  8.                 }  
  9.         }  
  10. }  
  11. return value;  
这样做的前提是你必须保证这个函数的类是单例的,显然在服务器集群中不可能有这样的场景,那么如果在群集间加锁呢?解铃还需系铃人,既然大家共用一个memcached服务器,那么就使用memcached来实现这个锁机制。即当客户端取不到数据时,先在memcached中设置一个flag表明当前客户端在更新该数据,当其它客户端也来访问时发现失效后就等待直到更新好数据为目。
  1. object value = memcahced.get(key);  
  2. if(null=value){  
  3.     if(memcached.add(key)){  
  4.         value = db.get();  
  5.         memcached.set(key,value);  
  6.     }else{  
  7.         while(true){  
  8.             Thread.sleep(50);  
  9.              value=memcached.get(key);  
  10.              if(null!=value){  
  11.                   break;  
  12.              }  
  13.         }  
  14.     }  
  15. }  
  16. return value;  

memcached中的add方法是实现该功能的关键,该方法是判断memcached中是否有某个key存在,如果存在则返回false,否则返回true,并添加该key值,如果没有该方法,显然我们只能再一次的通过get 和set去设置该值,显然这样做是线程不安全的,有可能有多个客户端同时取为空,同时去取数据并更新。

 

 

 

          上述的方法存在的缺陷时,一旦数据失效,所有客户端要等待某个客户端更新完毕,这样势必增加服务器压力,可以通过在key失效之间的一段时间就触发更新的方式来解决这个问题。

 

分享到:
评论

相关推荐

    memcached缓存使用演示

    它通过将数据存储在内存中,使得数据的读取速度大大提高,尤其在处理高并发请求时表现卓越。 ### 1. Memcached的基本原理 Memcached基于键值对(key-value)存储模式,将数据保存在内存中,以减少对硬盘I/O操作,...

    php memcached 缓存

    **PHP与Memcached缓存** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高网站的响应速度。PHP与Memcached的结合,使得开发者能够轻松地在PHP应用中实现数据...

    memcached缓存系统

    这种技术在大数据量和高并发访问的场景下尤其有效,例如社交媒体、电子商务和内容管理系统等。 **工作原理** Memcached基于键值对(key-value)存储方式,它将数据保存在内存中,以快速响应客户端的请求。当一个Web...

    缓存服务器memcached代码及使用文档

    总结来说,Memcached是一个强大的缓存解决方案,尤其适用于高并发的Web应用。通过合理的使用和配置,可以显著提升应用的响应速度,降低数据库负载。在J2EE项目中,通过Java客户端库,可以轻松地集成和操作Memcached...

    memcached实例

    3. **并发访问**:Memcached 支持多线程和多进程并发访问,但要注意可能出现的并发问题,如竞态条件,确保在设计缓存策略时考虑这些问题。 4. **数据一致性**:由于 Memcached 是无状态的,它不支持事务和数据一致...

    memcached缓存插件

    5. **数据一致性**:在高并发场景下,要注意数据的一致性问题,可能需要配合分布式锁等技术。 **总结** Memcached 缓存插件作为高效分布式缓存解决方案,能显著提升应用程序的性能。通过合理配置和使用,可以有效...

    Memcached缓存.zip

    **Memcached缓存技术详解** Memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问的速度。Memcached基于键值对存储,设计简单而高效,适用于缓存小块的、...

    memcached缓存服务器安装与使用

    **memcached缓存服务器安装与使用** `memcached` 是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升应用程序性能。它广泛应用于网站、API服务和内部应用程序,通过缓存经常访问的数据来...

    memcached缓存

    **Memcached缓存详解** Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高动态网页的响应速度。它通过将数据存储在内存中,实现了快速读取,从而避免了频繁访问...

    Memcached使用点滴 服务集成平台需要对服务有所监控,包括访问频率控制以及访问次数控制

    * 高性能:Memcached 可以提供高性能的缓存服务,能够满足高并发的访问需求。 * 分布式缓存:Memcached 支持分布式缓存,可以将缓存分布在多个服务器上,从而提高缓存的可用性和性能。 * 缓存失效机制:Memcached ...

    缓存memcached下载(目前最稳定的版本)

    在Web开发中,缓存扮演着至关重要的角色,尤其是在高并发、大数据量的场景下,能够显著降低数据库的负担,提升响应速度。 Memcached就是一款广泛应用的分布式内存缓存系统。 **Memcached简介** Memcached是由Danga...

    memcached缓存服务器

    **memcached缓存服务器详解** Memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问的速度。它的设计目标是简单且高效,通过将数据存储在内存中,实现了...

    高并发高流量网站构架

    硬盘级缓存通过存储频繁访问的数据,减少了磁盘I/O操作,而内存级缓存如Redis、Memcached则进一步加快了数据访问速度。CPU与IO平衡技术则是根据程序特性合理分配资源,如将计算密集型任务与I/O密集型任务分开处理。...

    memcached面试专题及答案.pdf

    2. **更快的缓存失效**:Memcached在写操作后不需要立即刷新整个缓存,而MySQL的查询缓存会在表修改时全部失效,可能导致性能下降。 缺点: 1. **自动管理**:MySQL的查询缓存自动缓存SQL查询结果,而Memcached需要...

    memcached+asp.net4.0

    这可能是为了优化ASP.NET应用的性能,特别是处理高并发请求时,通过使用分布式缓存来减轻数据库负载。 **文件名称列表解析:** "TrueMemcached" 这可能是项目或库的名字,或者是一个特定的文件夹,包含与使用...

    memcached工具类源码

    - **缓存失效策略**:LRU(最近最少使用)或LFU(最不经常使用)等策略,决定何时清理旧的或不常访问的数据。 - **缓存击穿和雪崩问题**:设计合理的缓存更新策略,避免大量请求同时导致数据库压力剧增。 6. **...

    memcached_1.4.4.rar

    4. **缓存失效**:设置合理的缓存过期时间,避免数据过期后仍然被使用。 **总结** Memcached作为一个高效的分布式内存缓存系统,是优化数据库性能、提升Web应用响应速度的重要工具。正确理解和使用Memcached,可以...

    php7 的memcached扩展php_memcached.dll扩展

    PHP7中的Memcached扩展是一个用于与Memcached缓存服务器通信的客户端库。Memcached是一种分布式内存对象缓存系统,广泛应用于Web应用程序,以提高数据读取速度,减轻数据库负载。在PHP环境中,使用Memcached扩展可以...

    hibernate-memcached-1.1.0-sources.zip

    《Hibernate与Memcached整合详解——基于hibernate-memcached-1.1.0源码分析》 ...在实际开发中,根据项目需求,可能还需要考虑缓存的扩展性、并发控制以及失效策略等问题,确保系统的稳定性和高效性。

Global site tag (gtag.js) - Google Analytics