`
Breese
  • 浏览: 62904 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

localCache与集中式cache

 
阅读更多

使用memcache缓存数据,减少对数据库的直接访问,提高网站性能已经成了各大网站最基本的技术.如何更好的提高memcache缓存的利用率及命中次数会在后面的blog中单独介绍,本文主要探讨为何及如何使用本地缓存(java localcache)提高网站性能.

localcachememcache性能比较

先来个本地缓存与memcache缓存的性能比较,有个直观上的概念

Cache

请求方式

次数

时间

平均

Localcache

hashmapget请求

1亿

1344ms

0.00001344ms

Memcache

简单的get请求,不做序列化

1

4437ms

0.4437ms

Db

单表查询(有索引)

   

1-2ms

以上测试在开发机器.生产环境采集的数据显示memcache的一次请求大约在0.2ms左右,如果存储的是java object,那算上发序列化的时间在0.5ms以上.与测试数据在同一个数量级上.

通过以上数据对比,可以得知localcache的效率比memcache1万倍以上.这个数字让我对使用本地缓存充满了极大的兴趣.

使用localcache会带来哪些问题

localcache有着极大的性能优势,单机情况下,适当使用localcache会使程序的效率得到很大的提升.但在集群环境下localcache就存在很多问题了,主要体现在多个jvm之间cache的同步问题.

有很多框架在这上面做了很多工作,比如ehcache ,主要是通过cache复制(copyinvalidate)来解决,大概的思路是使用消息多播机制,当一个jvm中的数据做了更新操作后,首先更新本jvm内的localcache,然后广播消息,其他jvm接收到消息后更新自己的localcache. 但这种机制可能带来并发操作时出现脏数据的问题,具体见Potential Issues with Replicated Caching.

其他cache产品也遇到类似的问题,不再一一介绍.

那有没有很好的方法来解决localcache的同步问题,从而可以放心的品尝localcache这块"甜饼"?

这个问题我也很纠结,通过多种方案的组合及补偿机制似乎可以实现一个完美的方案.但也注定成为了一个复杂的方案.类似的方案可以有如下几种:

1.localcache作为一级缓存,通过广播的方式同步缓存,同时设置缓存过期时间,以达到数据同步和出现脏数据后自动修复的功能.

2.localcache作为一级缓存,数据更新后发送异步消息(MQ),其余localcache订阅异步消息,并根据消息来同步缓存.

3.localcache作为一级缓存,memcache中存放缓存变更的信息,定时任务定时获取memcache的信息,并决定是否更新localcache.

4.localcache作为一级缓存,每次从memcache中获取数据更改的标记位,如果标记发生变化,更新localcache

以上的这些实现方案,都在一定程度上加大了架构的复杂性,localcache中数据出现脏数据时,排查问题及清理数据都会变得复杂.

他人经验之谈

1.sohu早期使用广播的方式(jgroup)同步localcache,结果经常会出现脏数据的问题,在后来的架构设计上干脆摒弃了localcache(即使使用,也不再作数据同步),全部使用memcache.

2.taobao在生产环境也很少使用localcache同步,对于非敏感性数据,只是通过简单的过期策略,来保证数据的一致性.

总结

集群环境下对于敏感性要求不高的数据可以使用localcache,只配置简单的失效机制来保证数据的一致性.

对敏感性高的数据直接使用集中式缓存,减低复杂度.

复杂方案看似完美的解决了问题,实际上性能和稳定性却很可能大打折扣.

感谢William 、放翁提出的宝贵建议

分享到:
评论

相关推荐

    LocalCache 学习小记1

    【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...

    Java LocalCache 本地缓存的实现实例

    Java LocalCache 本地缓存的实现实例 Java LocalCache 本地缓存的实现实例主要介绍了两种LocalCache的实现方法,一种是基于ConcurrentHashMap实现基本本地缓存,另外一种是基于LinkedHashMap实现LRU策略的本地缓存...

    Web应用开启了Local cache后,发现应用日志不再更新1

    描述中提到,日志在大约2分钟后中断,这与Local Cache的工作机制有关。下面将详细解释这个问题及其解决方案,并探讨Java应用在Azure云平台上的日志管理和存储。 Local Cache是Azure App Service的一项功能,它提供...

    Visual Studio 2017 2019 2022 Local Packages Cache Cleaner

    "Visual Studio 2017 2019 2022 Local Packages Cache Cleaner"就是这样一款实用工具,专为解决这一问题而设计。 该工具的目的是帮助用户轻松地清理Visual Studio的本地包缓存,包括NuGet包和其他依赖项的临时文件...

    仿redis缓存Java版轻量级缓存组件LocalCache

    仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制

    PHP7-buffer:PHP的高性能local cache扩展(不支持持久化)

    buffer=======Introduction(介绍)采用C写的扩展完全不担心性能问题采用HashMap数据结构和LRU算法支持此扩展采用进程级共享本地缓存(local cache),能友好的预备热冷数据提供类似于php static静态池,伸缩方便参考...

    etCache 是一个基于 Java 的缓存系统封装,提供统一的 API 和注解来简化缓存的使用.rar

    JetCache是一个基于java的缓存系统封装,提供统一的API和注解简化...通过注解实现声明式的方法缓存 通过注解创建并配置Cache实例 针对所有Cache实例和方法缓存的自动统计 Key的生成策略和value的序列化策略是可以配置的

    springboot整合jetcache完整代码

    LocalCacheConfig local = CacheBuilder.createCacheConfig("localCache", CacheType.LOCAL_MEM_CACHE) .limit(1000) .expireAfterWrite(1, TimeUnit.MINUTES) .build(); // 创建Redis缓存配置 ...

    localcache4d:细致入微的准备工作,临时或临时定居

    在IT行业中,"LocalCache4D"可能是一个特定的软件组件或者存储解决方案,尤其是在使用Pascal编程语言的环境中。Pascal是一种结构化编程语言,它以其清晰的语法和对初学者友好的特性而闻名,同时也被广泛应用于各种...

    LocalCache:增强现实世界场景的 LocalStorage API

    本地缓存增强现实世界场景的 LocalStorage API HTML5 / SessionStorage 提供了在浏览器的键值存储中存储永久或临时任意数据的基础。 然而,当您希望用它实现一些“真实”的东西时,您很快就会意识到 API/实现中有...

    local-cache:本地缓存

    但是,与 cookie 不同的是,我们无法使我们在 localStorage 中设置的项目过期。 这个扩展提供了这样的功能:在 localStorage 中设置当你告诉他们过期的项目。 示例: localStorage.setCacheItem(...

    node-localcache:支持 TTL 的 Node.js 本地内存键值数据缓存系统

    本质上,它与 memcached 等其他键/值存储非常相似,不同之处在于 LocalStash 仅将内容保存在当前进程的内存中,而不保存在某些外部服务中。 LocalStash 没有外部依赖项。 我为什么要用这个? 有时您想存储一些计算...

    详解Guava Cache本地缓存在Spring Boot应用中的实践

    Guava Cache是一个功能强大且灵活的缓存解决方案,可以与Spring Boot应用集成,以提高程序的性能。在实际应用中,需要根据实际情况选择合适的缓存策略,以提高程序的性能。 知识点: 1. Guava Cache是一个全内存的...

    Cachecloud文档

    Cachecloud 使用 Maven 构建,提供了 `local.properties` 和 `online.properties` 两种配置文件,分别适用于测试和线上环境。配置文件中包含了系统的各项设置,例如 SSH 用户名、密码等重要参数。 #### 三、系统...

    linux下释放cache内存

    ### Linux下释放Cache内存 #### 一、理解Linux内存管理机制 在Linux系统中,内存管理机制非常高效且复杂。为了提升文件系统访问速度,Linux内核会利用空闲内存来缓存文件数据(称为Page Cache)和其他类型的缓存...

    VxLAN-EVPN集中式网关-ensp实验文件

    以深入探索和展示VxLAN(Virtual eXtensible Local Area Network)技术与EVPN(Ethernet Virtual Private Network)在集中式网关配置下的应用与实现。VxLAN技术允许二层网络跨越三层IP网络进行扩展,通过封装二层帧...

    backbone-local-cache

    骨干本地缓存 为 Backbone 添加离线模式支持。 使用这个模块,每个请求都缓存在...Backbone.LocalCache.CacheStorage 这是缓存存储接口,它将使用浏览器的localStorage。 但是您可以通过替换 get 和 set 方法来实现您自

    cache链接.7z

    2. **对象数据库**:与传统的关系型数据库不同,Cache采用面向对象的模型,允许存储复杂的数据结构,如嵌套对象和数组,这在处理医疗领域的复杂数据时非常有用。 3. **实时数据访问**:Cache提供实时的数据处理能力...

    CentralizedSystem.rar_信息融合_贝叶斯融合_集中式融合

    最后,`lais.m`可能是一个实现局部平均信息合成(Local Area Information Fusion, LAIS)的函数,这是集中式融合的一种方法。LAIS通过在局部区域内的数据融合来提高全局决策的性能。它可能包括对每个传感器数据的...

Global site tag (gtag.js) - Google Analytics