localcache与memcache性能比较
先来个本地缓存与memcache缓存的性能比较,有个直观上的概念
Cache
|
请求方式
|
次数
|
时间
|
平均
|
Localcache
|
hashmap中get请求
|
1亿
|
1344ms
|
0.00001344ms
|
Memcache
|
简单的get请求,不做序列化
|
1万
|
4437ms
|
0.4437ms
|
Db
|
单表查询(有索引)
|
|
|
1-2ms
|
以上测试在开发机器.生产环境采集的数据显示memcache的一次请求大约在0.2ms左右,如果存储的是java object,那算上发序列化的时间在0.5ms以上.与测试数据在同一个数量级上.
通过以上数据对比,可以得知localcache的效率比memcache高1万倍以上.这个数字让我对使用本地缓存充满了极大的兴趣.
使用localcache会带来哪些问题
localcache有着极大的性能优势,单机情况下,适当使用localcache会使程序的效率得到很大的提升.但在集群环境下localcache就存在很多问题了,主要体现在多个jvm之间cache的同步问题.
有很多框架在这上面做了很多工作,比如ehcache ,主要是通过cache复制(copy或invalidate)来解决,大概的思路是使用消息多播机制,当一个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 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...
Java LocalCache 本地缓存的实现实例 Java LocalCache 本地缓存的实现实例主要介绍了两种LocalCache的实现方法,一种是基于ConcurrentHashMap实现基本本地缓存,另外一种是基于LinkedHashMap实现LRU策略的本地缓存...
描述中提到,日志在大约2分钟后中断,这与Local Cache的工作机制有关。下面将详细解释这个问题及其解决方案,并探讨Java应用在Azure云平台上的日志管理和存储。 Local Cache是Azure App Service的一项功能,它提供...
"Visual Studio 2017 2019 2022 Local Packages Cache Cleaner"就是这样一款实用工具,专为解决这一问题而设计。 该工具的目的是帮助用户轻松地清理Visual Studio的本地包缓存,包括NuGet包和其他依赖项的临时文件...
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
buffer=======Introduction(介绍)采用C写的扩展完全不担心性能问题采用HashMap数据结构和LRU算法支持此扩展采用进程级共享本地缓存(local cache),能友好的预备热冷数据提供类似于php static静态池,伸缩方便参考...
JetCache是一个基于java的缓存系统封装,提供统一的API和注解简化...通过注解实现声明式的方法缓存 通过注解创建并配置Cache实例 针对所有Cache实例和方法缓存的自动统计 Key的生成策略和value的序列化策略是可以配置的
LocalCacheConfig local = CacheBuilder.createCacheConfig("localCache", CacheType.LOCAL_MEM_CACHE) .limit(1000) .expireAfterWrite(1, TimeUnit.MINUTES) .build(); // 创建Redis缓存配置 ...
在IT行业中,"LocalCache4D"可能是一个特定的软件组件或者存储解决方案,尤其是在使用Pascal编程语言的环境中。Pascal是一种结构化编程语言,它以其清晰的语法和对初学者友好的特性而闻名,同时也被广泛应用于各种...
本地缓存增强现实世界场景的 LocalStorage API HTML5 / SessionStorage 提供了在浏览器的键值存储中存储永久或临时任意数据的基础。 然而,当您希望用它实现一些“真实”的东西时,您很快就会意识到 API/实现中有...
但是,与 cookie 不同的是,我们无法使我们在 localStorage 中设置的项目过期。 这个扩展提供了这样的功能:在 localStorage 中设置当你告诉他们过期的项目。 示例: localStorage.setCacheItem(...
本质上,它与 memcached 等其他键/值存储非常相似,不同之处在于 LocalStash 仅将内容保存在当前进程的内存中,而不保存在某些外部服务中。 LocalStash 没有外部依赖项。 我为什么要用这个? 有时您想存储一些计算...
Guava Cache是一个功能强大且灵活的缓存解决方案,可以与Spring Boot应用集成,以提高程序的性能。在实际应用中,需要根据实际情况选择合适的缓存策略,以提高程序的性能。 知识点: 1. Guava Cache是一个全内存的...
Cachecloud 使用 Maven 构建,提供了 `local.properties` 和 `online.properties` 两种配置文件,分别适用于测试和线上环境。配置文件中包含了系统的各项设置,例如 SSH 用户名、密码等重要参数。 #### 三、系统...
### Linux下释放Cache内存 #### 一、理解Linux内存管理机制 在Linux系统中,内存管理机制非常高效且复杂。为了提升文件系统访问速度,Linux内核会利用空闲内存来缓存文件数据(称为Page Cache)和其他类型的缓存...
以深入探索和展示VxLAN(Virtual eXtensible Local Area Network)技术与EVPN(Ethernet Virtual Private Network)在集中式网关配置下的应用与实现。VxLAN技术允许二层网络跨越三层IP网络进行扩展,通过封装二层帧...
骨干本地缓存 为 Backbone 添加离线模式支持。 使用这个模块,每个请求都缓存在...Backbone.LocalCache.CacheStorage 这是缓存存储接口,它将使用浏览器的localStorage。 但是您可以通过替换 get 和 set 方法来实现您自
2. **对象数据库**:与传统的关系型数据库不同,Cache采用面向对象的模型,允许存储复杂的数据结构,如嵌套对象和数组,这在处理医疗领域的复杂数据时非常有用。 3. **实时数据访问**:Cache提供实时的数据处理能力...
最后,`lais.m`可能是一个实现局部平均信息合成(Local Area Information Fusion, LAIS)的函数,这是集中式融合的一种方法。LAIS通过在局部区域内的数据融合来提高全局决策的性能。它可能包括对每个传感器数据的...