一个cache的改造过程
在分布式的程序中,cache的合理使用可以带来性能上的极大提升,尤其是在资源创建需要昂贵的开销时。cache的设计最重要的是要保证线程安全和高效性。下面以代码为例,介绍了三种cache的写法。
1. 粗放的加锁
public class Cache1 { private HashMap<String, ServerGroup> route2SG = null; public Cache1() { route2SG = new HashMap<String, ServerGroup>(); } public synchronized ServerGroup get(String routeKey) throws IOException { ServerGroup sg = null; sg = route2SG.get(routeKey); if (sg == null) { sg = getServerGroup(routeKey); route2SG.put(routeKey, sg); } return sg; } public synchronized void remove(String routeKey) { route2SG.remove(routeKey); } private ServerGroup getServerGroup(String routeKey) throws IOException { ServerGroup sg = null; /** * Construct ServerGroup here */ return sg; } }
2. 读写锁
public class Cache2 { private ConcurrentHashMap<String, ServerGroup> route2SG = null; private final ReadWriteLock lock = new ReentrantReadWriteLock(); public Cache2() { route2SG = new ConcurrentHashMap<String, ServerGroup>(); } public ServerGroup get(String routeKey) throws IOException { ServerGroup sg = null; try { lock.readLock().lock(); sg = route2SG.get(routeKey); if (sg == null) { lock.readLock().unlock(); lock.writeLock().lock(); sg = route2SG.get(routeKey); if (sg == null) { sg = getServerGroup(routeKey); route2SG.put(routeKey, sg); } lock.readLock().lock(); lock.writeLock().unlock(); } } catch (IOException e) { lock.writeLock().unlock(); throw (e); } lock.readLock().unlock(); return sg; } public void remove(String routeKey) { try { lock.writeLock().lock(); route2SG.remove(routeKey); } finally { lock.writeLock().unlock(); } } private ServerGroup getServerGroup(String routeKey) throws IOException { ServerGroup sg = null; /** * Construct ServerGroup here */ return sg; } }
3. 无锁
public class Cache3 { private ConcurrentHashMap<String, FutureTask<ServerGroup>> route2SGFT = null; public Cache3() { route2SGFT = new ConcurrentHashMap<String, FutureTask<ServerGroup>>(); } public ServerGroup get(String routeKey) throws IOException, InterruptedException, ExecutionException { FutureTask<ServerGroup> ft = route2SGFT.get(routeKey); if (ft != null) { return ft.get(); } FutureTask<ServerGroup> sft = new FutureTask<ServerGroup>(new ConstructSGTask(routeKey)); FutureTask<ServerGroup> old = route2SGFT.putIfAbsent(routeKey, sft); if (old == null) { old=sft; old.run(); } return old.get(); } public void remove(String routeKey) { route2SGFT.remove(routeKey); } class ConstructSGTask implements Callable<ServerGroup> { private final String key; public ConstructSGTask(String key) { super(); this.key = key; } @Override public ServerGroup call() throws Exception { return getServerGroup(key); } } private ServerGroup getServerGroup(String routeKey) throws IOException { ServerGroup sg = null; /** * Construct ServerGroup here */ return sg; } }
总结,
从三份代码中可以看出,锁的粒度从粗放到无,这个就极大的提高了cache的并发性。
分享到:
相关推荐
- **Cache vs 持久化存储**:Redis更适合用作缓存系统,在低延迟、高并发场景下表现优秀;但在持久化存储方面存在一些固有限制。 - **AOF vs RDB选择**:AOF提供了更近实时的数据保护,而RDB则有助于快速恢复系统...
在这个实验中,学生需要分析无cache的CPU结构,了解其数据通路和流水线各段的功能,以及处理指令执行过程中的各种相关问题。 1. **无cache流水CPU工作原理**: - 无cache的CPU设计简化了存储层次,减少了硬件复杂...
《5级流水无cacheCPU实验计算机组成原理课程设计报告》 本报告主要涉及的是一个五级流水线无缓存CPU的设计与实现,旨在通过实践加深对计算机组成原理的理解。实验内容主要包括无缓存流水CPU的分析与改造,具体任务...
- **编写改造指南**:记录改造过程和经验,为后续的维护和升级提供参考。 通过以上改造策略,我们可以使Struts 1在现有项目中继续发挥价值,同时逐步向更先进的框架过渡。当然,对于长远的规划,考虑迁移到更现代...
中国电信CTG-MBOSS项目规范编写过程 中国电信集团在2004年初召集了一些传统97建设的厂商和国外应用软件提供商进行规范编写的前期交流,交流内容包括系统定位与发展趋势、中国电信九七系统的问题和发展建议及从功能/...
三、升级改造过程 1. **导入项目**:首先,将项目导入 Android Studio,确保使用与项目兼容的 Gradle 插件版本。 2. **修改 build.gradle 文件**:更新项目的构建配置,例如增加新的依赖库、调整编译选项或定制构建...
例如,在用户库的改造过程中,通过采用Tair缓存系统提高了数据的访问速度;在商品库改造中,则考虑了使用更高级别的存储介质来减少延迟。 #### 七、案例分析:Flashcache应用 Flashcache作为一种高效的缓存解决方案...
信息化则是指信息技术和信息产业发展到一定水平之后,利用信息技术和信息系统改造提升传统产业,促进产业结构调整和优化升级的过程。 3. 信息标准化:为了解决不同系统间的信息孤岛问题,信息标准化是关键技术之一...
2018年8月,Cache改造提高了数据处理速度。2018年10月,实现了平滑扩容,解决了扩容过程中可能引发的数据迁移问题。2018年2月,Mirror集群化建设使得镜像复制更加自动化和高效。2018年11月,资源隔离的引入解决了...
在ASP.NET中,我们可以通过使用HttpContext.Current.Cache对象来存储进度信息。例如,代码片段5至35展示了如何在ExecuteTimeConsumingTask()方法中执行一个循环操作,并在每次迭代时将进度更新到缓存中。通过...
美团点评微服务架构实践的过程展示了微服务架构从理念到实践的过程,从传统单体架构到分布式微服务架构的演进,其中不仅涉及技术选型、服务拆分、治理策略、弹性伸缩等技术问题,还涉及组织结构、技术文化等非技术...
针对这一情况,文章提出了一个新的策略,即通过对视频解码算法的改造,以适应L1P Cache的工作机制。作者将解码过程划分为四个模块,每个模块的代码大小不超过L1P Cache的容量(16 kbyte)。这样,每个宏块行的解码...
【描述】提到的"一步一步反向开发nopCommerce_4.10",意味着这个示例是针对NopCommerce 4.10版本的源码分析和改造过程。反向开发通常包括阅读、理解已有的源代码,找出可以改进的地方,以及实现新的功能。在这个过程...
8. **测试代码和说明文档**:项目提供的测试代码用于验证CPU设计的正确性,而说明文档则详细解释了设计过程、设计思路以及如何运行和测试代码。 总的来说,这个项目提供了一个实际的CPU设计实例,涵盖了计算机体系...
采用读Cache策略可以有效缓解数据读取压力。此外,业务复杂性的挑战不容忽视,这不仅涉及技术层面,还包括人员协作和流程管理。因此,构建分布式化的系统架构和服务化业务功能是必要的,这有助于实现系统的高可用性...
在这个“ASP.NET 实例*改”中,我们将深入探讨 ASP.NET 的核心概念、常用技术以及实例改造的过程。 首先,ASP.NET 提供了多种Web应用程序模型,如Web Forms、MVC(Model-View-Controller)和Web API。Web Forms模式...
在传输流媒体服务器方面,通常基于nginx和nginx-rtmp-module进行改造,将多进程模式改为多线程,以提高效率。通过线程间的消息通信和事件处理逻辑,解决了回源问题。此外,还包括实现RTMP、RTMP2FLV、FLV、HLS等协议...
此外,对已有系统进行前后分离和组件化改造,以实现服务化拆分和模型升级,这需要对既有业务进行大规模改造。 在选择业务蓝本时,理想的模式是选择核心且稳定的业务,如直营房源系统,因为它具有完善的模型和经过...
- 测试过程中,进程部署方式包括每个核部署1个进程,每个核部署2个进程,以及根据需求扩展进程数量。 - 板内分布式部署可构建最多256个进程的全局表。 - 板间分布式可扩展至200块单板,总计3200个核心,10000个...