今天组里的同学和我谈起local cache的一点需求,希望考虑在性能和业务上找到平衡点应该怎么考虑实现。下午给他的意见可能还是有点问题,回家稍微整理了一下,说出来也可以激发大家的讨论,觉得现在local cache + 远端cache是提高性能的必备,所以如何做好local cache 很有讲究。
由于有网络传输带来的性能损失(包括连接数并发限制),很多大请求量系统都会考虑做部分本地缓存。但本地缓存最大的问题就是数据同步,如果让集中式存储(cache,queue)来通知只会增加复杂度,因此通常最简单的方式就是根据业务数据的敏感度设置不同长短的本地失效时间。但现在如果要设置一个较短的有效期(例如一秒),对于计算机来说已经大大的减轻了压力(1秒对程序来说太久了),但是整体本地缓存对后端保护的效果不佳(特别是后端如果是并发处理能力较弱的系统),如果遇到并发量大的系统,那么就更为突出了。
早先有想过通过锁来保证请求不会全部放过去(失效时就一个请求过去更新,其他请求等待),一来是针对内容作锁,对锁的需求量很大(当业务数据很多时),二来如果采用其他请求阻塞(对于系统来说压力也很大),这点后来谈起可以直接返回老数据而不等待。但总体看起来消耗依然很大。
因此给了下图:
首先开始的时候会有部分数据被推送到本地缓存(当然也可以是客户端主动获取全部数据),也可以全部采用lazy加载,推送来的数据缓存在本地,并且设置失效时间,为每一个key还会有一份失效时间Map用于检查是否失效。应用发起get的请求,先从本地拿,如果有数据且有效,就直接返回。如果没有命中,则去远端获取资源,并缓存在本地,最后返回给应用(这里如果要防攻击可以采用布隆算法建立白名单)。如果发现本地数据失效,则将失效事件放入到一个本地的EventMap中,key为当前请求数据的key,然后设置这个key的时间为当前时间+有效间隔时间(不做并发控制,多次放入EventMap会被覆盖,多次设置时间有效期还是当前时间+间隔时间),后续请求就会认为这个数据是有效的不会连续请求更新,然后返回老数据。后台分发线程检查消息Map,将事件分发到后台线程池异步执行,最后更新结果并设置有效时间。
最后还有一个后台清理线程将过老的数据从缓存中移除,在map满或者到了清理间隔的时候去执行。
这种设计有一定的复杂度,但是还算是松耦合,在并发高的情况下,牺牲数据较小的即时性换取对后端的保护。不过如果没有必要,做的简单粗暴一点即可,不需要那么复杂。同时如果有更好的意见和建议的同学请回帖讨论,或者去我的微薄讨论:t.sina.com.cn/fangweng
分享到:
相关推荐
本篇文章主要介绍了Java中LocalCache本地缓存实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
第三种:调shard.go中的del ,同理,也是软删除 第四种:定时删除,此删除式是硬删除 第五种:这种删除式般不会被调,故放在最后,是硬删除
本篇文章主要介绍了Java LocalCache 本地缓存的实现实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
buffer=======Introduction(介绍)采用C写的扩展完全不担心性能问题采用HashMap数据结构和LRU算法支持此扩展采用进程级共享本地缓存(local cache),能友好的预备热冷数据提供类似于php static静态池,伸缩方便参考...
Local caching - Guava Cache在Go中的部分的实现
Visual Studio 2017 2019 2022 Local Packages Cache Cleaner 负责清理本地安装缓存文件,将文件所在夹拖动到程序中,点击Check即可。
本地缓存 本地缓存 从 Google Code 项目导入 我不是作者,只是想在 Google Code 关闭时保存脚本 #原始自述文件 ... 但是,与 cookie 不同的是,我们无法使我们在 localStorage 中设置的项目过期。 ...
主要的设计考虑是小的性能开销和快速的垃圾收集机制。 应用程序接口 LocalStash 公开了以下 API: new LocalStash([cycleInterval], [options]) cycleInterval是垃圾回收周期间隔,以秒为单位。 如果您倾向于存储...
本地缓存增强现实世界场景的 LocalStorage API HTML5 / SessionStorage 提供了在浏览器的键值存储中存储永久或临时任意数据的基础。 然而,当您希望用它实现一些“真实”的东西时,您很快就会意识到 API/实现中有...
骨干本地缓存 为 Backbone 添加离线模式支持。 使用这个模块,每个请求都缓存在...Backbone.LocalCache.CacheStorage 这是缓存存储接口,它将使用浏览器的localStorage。 但是您可以通过替换 get 和 set 方法来实现您自
不过当重新写日志的时候,日志的路径也会和之前不一样,具体请参考:https://www.azure.cn/documentation/articles/aog-
delphi code tip Local Ver DB : SQLLite
Guava Cache是一个全内存的本地缓存实现,本文将讲述如何将 Guava Cache缓存应用到 Spring Boot应用中。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
资源分类:Python库 所属语言:Python 资源全名:orbis_plugin_aggregation_local_cache-2.1.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Cache数据库,东华Cache数据库链接 ,医疗数据库Cache
Local Bus做过嵌入式的应该知道,该总线少见,但很有用
localcache4d 细致入微的准备工作,临时或临时定居
默认插入admin超级管理员2、CacheCloud项目配置 使用了maven作为项目构建的工具,提供了 local.properties和online.properties两套配置作为测试、线上的隔离。 属性配置说明:属性名说明示例cachecloud.db.url...
sudo cp hcache /usr/local/bin/ # 一、查看前10个大文件缓存 hcache -top 10 # 查看指定pid进程号的进程缓存 hcache -pid #可以将结果写入txt然后使用shell统计进程总缓存大小 #取大小 hcache -pid 117466 | ...