java 缓存原理 与 实例
原理就很简单了,每次需要数据的时候,先去Map 里面看看有没有,有的话就拿出来,没有的话就去数据库找或者构造一个实例,避免了系统额外的开销。
伪代码
下面这段代码是借鉴别人的,基本原理和过程就是这样。
下面代码的解读是
构造一个 线程安全的 ConcurrentHashMap,get方法 每次去拿数据,拿得到的话 就直接返回,如果拿不到 我先把对象锁上(这里没有使用读写锁,是因为 读写锁锁住的话 每条线程都可来读取,读不到就会去 从源数据拿,实际上读写锁配合的好的话也是可以实现的,只是比较繁琐),然后从数据源处拿到,这里的数据源是一个弱键实现的Hash表,weak维护的哈希表 当引用不正常的时候,自动移除表里的对象,所以可以节省一部分资源。put 就不说了,太简单了。
package test;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public final class SimpleCache<K,V> {
private final Lock lock = new ReentrantLock();
private final int maxCapacity;
private final Map<K,V> eden;
private final Map<K,V> longterm;
public SimpleCache(int maxCapacity) {
this.maxCapacity = maxCapacity;
this.eden = new ConcurrentHashMap<K,V>(maxCapacity);
this.longterm = new WeakHashMap<K,V>(maxCapacity);
}
public V get(K k) {
V v = this.eden.get(k);
if (v == null) {
lock.lock();
try{
v = this.longterm.get(k);
}finally{
lock.unlock();
}
if (v != null) {
this.eden.put(k, v);
}
}
return v;
}
public void put(K k, V v) {
if (this.eden.size() >= maxCapacity) {
lock.lock();
try{
this.longterm.putAll(this.eden);
}finally{
lock.unlock();
}
this.eden.clear();
}
this.eden.put(k, v);
}
}
分享到:
相关推荐
在这个“Java缓存技术的使用实例”中,我们将深入探讨Java缓存的实现、工作原理以及如何部署和运行示例代码。 首先,让我们理解什么是缓存。缓存是一种存储机制,用于临时存储常用或最近使用的数据,以便快速访问。...
以下是关于 Memcached 缓存系统、Java 缓存框架以及实例代码的详细说明: 1. **Memcached 基础** - **Cache 定义**:Cache 通常被用来协调不同速度设备之间的数据传输,包括硬件级别的 CPU Cache 和软件层面的...
总的来说,"基于Java的实例源码-Java缓存工具 SimpleCache.zip"是一个宝贵的教育资源,为Java开发者提供了实际操作缓存机制的机会,从而提升他们的技能和理解,对于那些希望优化应用程序性能或构建高效服务的开发者...
这个简单的Java缓存池实例展示了基本的缓存管理机制,包括缓存的创建、存储、检索和过期检查。然而,实际生产环境中,缓存系统可能会更复杂,涉及到并发控制、容量管理、替换策略(如LRU - 最近最少使用)等。例如,...
《Java图形与动画编程实例 上册》是一本深入探讨Java在图形和动画编程领域的实践教程。本书主要针对Java 3D技术,旨在帮助读者掌握如何使用Java语言创建丰富的三维图形和动态效果。以下是对该书内容的详细解读: 1....
### Java缓存理解 #### 一、Java缓存机制概览 在软件开发过程中,缓存是一种非常重要的优化手段,它能够显著提升系统的性能和响应速度。Java平台提供了多种缓存解决方案,其中Ehcache是一种广泛应用且功能强大的...
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
8. **与Spring的集成** - EhCache与Spring框架有很好的集成,可以方便地通过Spring配置来管理缓存。 **EhCache的使用步骤:** 1. **添加依赖** - 在项目中引入EhCache的JAR包或Maven/Gradle依赖。 2. **配置...
**Memcached缓存系统详解与应用实践** Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据的读取速度大大提高,...
在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...
在Java编程中,缓存(Cache)是一种常用的技术,用于提高数据访问的速度。它通过存储最近或频繁访问的数据,使得再次请求...但这个实例提供了一个理解缓存基本工作原理的良好起点,有助于深入学习和实践Java缓存技术。
《DiskLruCache:Java实现的磁盘缓存解析》 在移动开发,尤其是Android应用开发中,数据缓存是优化用户体验的关键技术之一。DiskLruCache是一款基于磁盘的缓存库,由Jake Wharton编写,用于存储关键数据到本地文件...
osCache虽然功能强大,但在Java缓存领域,还有其他如EHCache、Memcached和Redis等解决方案。每种缓存都有其特点和适用场景,比如EHCache同样适用于本地缓存,而Memcached和Redis更适合分布式缓存环境。 总结,...
首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,而`InvocationHandler`接口...
同时,`Java.jpg`可能是一个相关的图片,可能展示了字符串缓存类在内存中的工作原理或者线程安全的实现细节。 总结一下,Java中创建字符串缓存类的主要目的是减少内存消耗和提高性能,特别是在频繁字符串操作的场景...
`@CacheEvict`则用于清除缓存,通常在数据更新或删除后使用,以保持缓存与数据库的一致性。`@Caching`可以组合多个缓存操作,提供更大的灵活性。`@CacheConfig`用于定义全局的缓存配置,如缓存名称、超时时间等。 ...
在实际应用中,SimpleCache可能与其他Java缓存框架,如Ehcache、Guava Cache或Spring框架的Cache抽象层进行对比。Ehcache是一个更全面的缓存解决方案,提供了分布式缓存功能,适合大型系统;Guava Cache是Google提供...
Java 包装类的缓存机制原理实例详解 Java 中的包装类缓存机制是指在 Java 5 中引入的一个功能,该功能可以帮助节省内存、提高性能。这个机制只在自动装箱时有效,即在基本类型转换为封装类对象时。 Java 中的包装...
**Lucene 全文搜索引擎实例:Java Lucene 实例** Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息...通过实践这个实例,你可以深入掌握 Lucene 的工作原理,并将其应用到你的项目中。
Java实现LRU缓存的实例详解 Java实现LRU缓存的实例详解是指通过Java语言实现一种高效的缓存机制,即LRU(Least Recently Used)缓存。LRU缓存是一种常用的缓存策略,其主要思想是将最近使用的数据存储在缓存中,...