一个cache的改造过程
十月 18, 2010 By: jiugao Category: java
在分布式的程序中,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的并发性。
分享到:
相关推荐
为了应对这些挑战,Nice团队基于Redis进行了深度定制和改造,构建了一个全新的分布式平台。该平台的核心组件包括Metaserver、Redis Server、Proxy以及一系列自定义的数据结构如XSet等。 ##### 1. Metaserver介绍 -...
【级流水无cacheCPU实验】是计算机组成原理课程中的一个重要实践环节,旨在让学生深入理解无缓存流水线CPU的工作原理和设计方法。在这个实验中,学生需要分析无cache的CPU结构,了解其数据通路和流水线各段的功能,...
本报告主要涉及的是一个五级流水线无缓存CPU的设计与实现,旨在通过实践加深对计算机组成原理的理解。实验内容主要包括无缓存流水CPU的分析与改造,具体任务涵盖以下几个方面: 1. 理解工作原理:首先,要深入理解...
Android TV Launcher 是一个专为 Android TV 设备设计的应用启动器,它提供了用户界面和交互方式,使得电视用户能够便捷地浏览和启动各种应用程序。该项目的开源版本允许开发者深入了解电视应用的构建方式,并对其...
初始阶段,规范编写项目组一直没有一个很确定的名字,后被临时命名为中国电信BSS(九七改造)规范编写组。 在组织结构上分为PMO、总体架构、BSS、OSS、技术架构组以及业务专家组。其中PMO组主要负责项目的协调控制...
- **编写改造指南**:记录改造过程和经验,为后续的维护和升级提供参考。 通过以上改造策略,我们可以使Struts 1在现有项目中继续发挥价值,同时逐步向更先进的框架过渡。当然,对于长远的规划,考虑迁移到更现代...
本项目涉及的是一个基于MIPS架构的多周期流水线CPU的设计,使用Verilog硬件描述语言进行实现。以下是关于这个项目的一些关键知识点: 1. **MIPS指令集**:MIPS指令集包含数十条基本指令,如数据处理指令(如加法、...
1. 服务器端改造:创建一个能记录并更新进度的长时任务方法。 2. 提供查询进度的接口:创建一个WebService供客户端获取任务进度。 3. 客户端交互:使用JavaScript(例如ExtJS)显示进度条,并定时轮询服务器获取进度...
淘宝的核心库硬件优化是一个复杂而全面的过程,涉及到了硬件选型、分布式改造、IO优化等多个方面。通过这一系列的优化措施,淘宝成功地提升了系统的性能和稳定性,为庞大的用户群体提供了更加流畅的购物体验。未来,...
描述中的"卡盟排行榜源码 一个卡盟排行榜的源码 改版于35dir程序"指出这是一套基于原有35dir程序改造的源代码,35dir可能是一个基础的目录列表或者信息管理系统,而现在这个源码专门用于实现卡盟排行榜的功能,可能...
空间局部性则是指如果一个存储单元被访问,那么紧邻这个存储单元的存储单元也可能很快会被访问。 5. 高速缓冲存储器(Cache)的作用:在Cache--主存层次结构中,地址映射和数据交换是由硬件来完成的。Cache的作用是...
海量数据系统的高可用架构设计是IT领域中一个重要的议题,主要目标是确保系统在面对大量数据和复杂业务场景时能够持续稳定...通过不断的压测、优化和改造,可以构建出一个能够在复杂业务环境中稳定运行的高可用系统。
在这个“ASP.NET 实例*改”中,我们将深入探讨 ASP.NET 的核心概念、常用技术以及实例改造的过程。 首先,ASP.NET 提供了多种Web应用程序模型,如Web Forms、MVC(Model-View-Controller)和Web API。Web Forms模式...
而 Nutz 是一个轻量级的框架,它提供了 ORM(对象关系映射)、DAO(数据访问对象)以及一系列实用工具,简化了 Java 开发过程。 这个框架组合,SpringMVC+Nutz,是一个企业级分布式基础开发平台,它整合了多种技术...
针对这一情况,文章提出了一个新的策略,即通过对视频解码算法的改造,以适应L1P Cache的工作机制。作者将解码过程划分为四个模块,每个模块的代码大小不超过L1P Cache的容量(16 kbyte)。这样,每个宏块行的解码...
【描述】提到的"一步一步反向开发nopCommerce_4.10",意味着这个示例是针对NopCommerce 4.10版本的源码分析和改造过程。反向开发通常包括阅读、理解已有的源代码,找出可以改进的地方,以及实现新的功能。在这个过程...
【Kafka集群应用实践与技术演进之路】 ...总结起来,Kafka集群的技术演进历程是一个不断优化、提升稳定性和效率的过程,通过技术创新和精细化管理,满足了大规模数据处理的需求,为未来的业务发展提供了坚实的基础。
站在技术角度来说,PWA技术也是一个渐进式的演化过程,在技术层面会一点点演进,如逐渐提供更好的设备特性支持,不断优化更加流畅的动画效果,不断让页面的加载速度变得更快,不断实现本地应用的特性。
综上所述,房源中台建设是一个涉及业务理解、服务化设计、数据管理、性能优化和分布式架构等多个层面的复杂过程。贝壳找房的经验为我们提供了宝贵的实践指导,有助于其他企业进行类似的中台建设。
OCTO是美团点评推出的一个分布式服务通信框架及服务治理系统。OCTO作为公司级基础设施,为所有业务提供统一的高性能服务通信框架。OCTO支持服务注册、服务自动发现、负载均衡、容错、灰度发布、数据可视化、监控告警...