以下内容为转载:
现在local cache + 远端cache是提高性能的必备,所以如何做好local cache 很有讲究。
由于有网络传输带来的性能损失(包括连接数并发限制),很多大请求量系统都会考虑做部分本地缓存。但本地缓存最大的问题就是数据同步,如果让集中式存储 (cache,queue)来通知只会增加复杂度,因此通常最简单的方式就是根据业务数据的敏感度设置不同长短的本地失效时间。但现在如果要设置一个较短 的有效期(例如一秒),对于计算机来说已经大大的减轻了压力(1秒对程序来说太久了),但是整体本地缓存对后端保护的效果不佳(特别是后端如果是并发处理 能力较弱的系统),如果遇到并发量大的系统,那么就更为突出了。
早先有想过通过锁来保证请求不会全部放过去(失效时就一个请求过去更新,其他请求等待),一来是针对内容作锁,对锁的需求量很大(当业务数据很多时),二 来如果采用其他请求阻塞(对于系统来说压力也很大),这点后来谈起可以直接返回老数据而不等待。但总体看起来消耗依然很大。
因此给了下图:
首先开始的时候会有部分数据被推送到本地缓存(当然也可以是客户端主动获取全部数据),也可以全部采用lazy加载,推送来的数据缓存在本地,并且设置失 效时间,为每一个key还会有一份失效时间Map用于检查是否失效。应用发起get的请求,先从本地拿,如果有数据且有效,就直接返回。如果没有命中,则 去远端获取资源,并缓存在本地,最后返回给应用(这里如果要防攻击可以采用布隆算法建立白名单)。如果发现本地数据失效,则将失效事件放入到一个本地的 EventMap中,key为当前请求数据的key,然后设置这个key的时间为当前时间+有效间隔时间(不做并发控制,多次放入EventMap会被覆 盖,多次设置时间有效期还是当前时间+间隔时间),后续请求就会认为这个数据是有效的不会连续请求更新,然后返回老数据。后台分发线程检查消息Map,将 事件分发到后台线程池异步执行,最后更新结果并设置有效时间。
最后还有一个后台清理线程将过老的数据从缓存中移除,在map满或者到了清理间隔的时候去执行。
这种设计有一定的复杂度,但是还算是松耦合,在并发高的情况下,牺牲数据较小的即时性换取对后端的保护。不过如果没有必要,做的简单粗暴一点即可,不需要 那么复杂。
相关推荐
本篇文章主要介绍了Java中LocalCache本地缓存实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
第七章 企业项目开发--本地缓存guava cache1、在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计。常用的缓存分
本篇文章主要介绍了Java LocalCache 本地缓存的实现实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
redis本地缓存与redis缓存
主要涉及本地缓存与分布式缓存优缺点,使用,前部宣讲
JS localStorage实现本地缓存的方法,需要的朋友可以参考一下
该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB I_Cache Cache替换策略: ...
简单缓存Cache介绍 asp.net 缓存 cache
tianditu.js 天地图本地缓存4.0下载
在运行TAADPapers的openattack或textattack中可能会用到的文件 ①背景:huggingface连不上 ...③代码请求huggingface之前,会先在缓存文件里寻找,这个压缩文件是我本地缓存的glue,0积分下载,仅供参考~
将ajax请求缓存到本地机器,使页面加载速度更快,更易于预测。 这是一个轻量级的,可配置的扩展,它将缓存对计算机的ajax请求的响应,从而使以后的页面加载更快,更可靠。 当您在演示ajax繁重的网站并希望确保顺利...
Caffeine本地缓存的配置与使用
该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,附带可运行的ISE工程文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB ...
本地缓存 本地缓存 从 Google Code 项目导入 我不是作者,只是想在 Google Code 关闭时保存脚本 #原始自述文件 在 HTML 5 中,我们得到了 localStorage,这是一种在本地存储名称/值对的快速简便的方法。 但是,与 ...
Springboot集成本地缓存Guava本章介绍一个比较好用的本地缓存Guava0x01、添加依赖0x02、添加GuavaLocalCache提供了设置超时时
Guava-Cache本地缓存案例代码,包含:缓存创建、缓存删除、缓存获取、缓存失效监听器、缓存加载、缓存淘汰策略。
ReactNative网路及本地缓存 Fetch之get请求数据, Fetch之Post请求数据, AsyncStorageDemo本地缓存数据
使用sqlite数据库本地缓存