一、在大数据量访问读取中,数据缓存是最普遍采用的解决方案之一,但在读过很多代码的缓存实现,代码可圈可点的弹性都很大,在一并发数不多时,功能是完全没有问题的,但是对大数量的多并发操作上就有些差强人意了。以下为集数家之长实现的数据缓存核心机制代码片段,以抛砖引玉,供大家学习,此片段的核心代码参考sun的源码实现。sun没有对此段代码开放,它的功能在ArrayBlockingQueue(jdk1.5)中已经实现并提供开放接口。没有时间看下面的代码的可直接查看ArrayBlockingQueue的api,如果对象ArrayBlockingQueue也没有兴趣的同学,可以直接调用ConcurrentHashMap(jdk1.5), ConcurrentSkipListMap(jdk1.6),这些类,api中有更加祥细的说明,这里不多说,需要注意的是因为此功能解决多线程并发问题,故null不能做为key和value的键值,可以理解为HashTable的提升。
package com.henry;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDataTest {
static Map<Integer,Object> dataMap=new HashMap<Integer,Object>();
static ReadWriteLock lock=new ReentrantReadWriteLock();//创建读写锁的实例
static Object getData(Integer key){
lock.readLock().lock();//读取前先上锁
Object val=null;
try{
val=dataMap.get(key);
if(val == null){
// Must release read lock before acquiring write lock
lock.readLock().unlock();
lock.writeLock().lock();
try{ if(val==null){
//dataMap.put(key, "");//query from db
val=queryDataFromDB(key); }finally{
//Downgrade by acquiring read lock before releasing write lock
lock.readLock().lock();
// Unlock write, still hold read
lock.writeLock().unlock(); }
}finally{
lock.readLock().unlock();//最后一定不要忘记释放锁 System.out.println("get data key="+key+">val="+val);
return val;
static Object queryDataFromDB(Integer key){
Object val=new Random().nextInt(1000);
dataMap.put(key, val);
System.out.println("write into data key="+key+">val="+val);
return val;
}
public static void main(String[] args) {
for(int i=0;i<10;i++){
new Thread(new Runnable(){public void run() {
getData(new Random().nextInt(5));
}}).start(); }
}
分享到:
相关推荐
在Java中,高速缓存的实现通常依赖于数据结构如哈希表(HashMap)或并发容器如ConcurrentHashMap。哈希表提供快速的查找和插入操作,而ConcurrentHashMap则为多线程环境提供了线程安全的访问。在这个项目中,对比了...
Java 缓存工具 SimpleCache 是一个用于在 Java 应用程序中实现高效数据存储和检索的框架。在高并发和大数据量的场景下,缓存是提高系统性能的关键技术之一。SimpleCache 提供了一种简洁的方式来管理短期数据,避免了...
本项目实现了一个基于Java的对象缓存系统,其中包含了LRU(Least Recently Used)算法,以及支持集群同步功能。这里我们将深入探讨相关知识点。 **LRU算法** LRU是一种常用的页面替换算法,其核心思想是:当内存...
在这个场景中,我们看到两个核心类:`CacheData` 和 `CacheOperation`,它们共同实现了基础的缓存功能。 `CacheData` 类是用于存储缓存数据的bean,包含三个主要属性: 1. `data`: 存放实际的缓存内容,可以是任何...
### Jive缓存机制的实现 #### 一、引言 Jive作为一款经典的开源论坛系统,凭借其灵活的设计架构和强大的功能,在Java开发者社区中享有极高的声誉。本文将重点探讨Jive缓存机制的设计与实现,尤其关注其如何通过...
本项目主题聚焦于“基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库”,这涉及到Java开发中的多个核心技术。首先,我们来逐一解析这些知识点。 **1. SSM框架** SSM...
7. **扩展性**:EhCache支持插件机制,可以通过添加不同插件来实现更高级的功能,如缓存监控、统计分析等。 在`ehcache-core-2.4.5`这个版本中,包含了EhCache的核心库,提供了基础的缓存管理功能。开发者可以通过...
综上所述,Google Guava的定时缓存功能使得我们能够轻松地在Java应用中实现高效的缓存机制,有效减少计算和网络请求的负担,提升整体性能。通过灵活的配置和丰富的API,我们可以根据具体需求定制合适的缓存策略。在...
- **简介**:Memcached是一个高性能、分布式的内存对象缓存系统,旨在通过将数据缓存在内存中来减轻数据库的负担。 - **工作原理**:当客户端发起请求时,Memcached首先检查请求的数据是否已存在于缓存中。如果...
由于现代计算机架构中,每个CPU核心都有自己的本地缓存,而主内存中的数据可能与本地缓存中的数据不一致,这就产生了线程安全问题。Java虚拟机(JVM)通过内存模型来解决这个问题,确保当一个线程修改了共享变量后,...
HttpServetRequest对象缓存数据的核心思想是在用户请求到达服务器时,将用户信息作为属性保存在ServletRequest对象中。由于在同一个请求中,多个servlet可以通过request对象共享数据,这使得用户信息在整个请求链中...
在Java世界里,缓存机制是一个重要的设计模式,广泛应用于各种场景,如Web应用、大数据处理、分布式系统等。 `SimpleCache`的设计思想简洁易用,通常由一个Key-Value结构组成,其中Key用于标识存储的数据,Value则...
Spring 缓存机制是Spring框架中的一个重要特性,它允许开发者在应用程序中轻松地实现缓存功能,从而提高性能,减少数据库的访问压力。在“spring缓存机制-自定义缓存(五, 六)”中,我们将深入探讨如何扩展Spring的...
"一个基于Ajax和Java缓存的聊天室"这个标题揭示了该项目的核心技术栈,即使用Ajax进行实时通信,以及Java作为后端处理数据并实现缓存功能,构建了一个在线聊天平台。Ajax(Asynchronous JavaScript and XML)是一种...
Java岗面试核心MCA版.pdf Java基础知识点 1. Java概述:Java是一种面向对象的编程语言,具有跨平台性, Java程序可以在任何支持Java的平台上运行。 2. 什么是Java?Java是一种高级的编程语言,能够开发出独立...
### 缓存机制在XML文件数据读取中的应用 #### 一、背景介绍与问题提出 在现代软件开发中,XML(可扩展标记语言)作为一种轻量级的数据存储和交换格式,广泛应用于不同系统间的数据交换及配置文件的管理。然而,当...
- **数据缓存**:对于频繁读取数据库的数据查询结果,使用LRUCache可以在内存中缓存这些结果,减少数据库的访问次数,提高响应速度。 - **网络请求结果缓存**:对于网络请求的结果,可以将其缓存在LRUCache中,避免...
DelayQueue的核心接口是`java.util.concurrent.Delayed`,实现这个接口的类需要提供一个`getDelay(TimeUnit unit)`方法来返回元素还需要等待多久才能被处理。当这个延迟时间到达零时,元素才可从队列中取出。在订单...
本文将深入探讨如何实现一个自定义缓存,并结合提供的`MyCacheManager.java`文件,分析其核心功能和设计原理。 首先,让我们理解缓存的基本概念。缓存是一种存储技术,用于临时存储频繁访问的数据,以便下次请求时...