`
雾的清晨
  • 浏览: 376 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

读方法缓存区

阅读更多

用于A模块读B模块数据,A模块内部缓存。

缓存区内使用两组Map对象:bufferMap对象保存key,value值对,为数据保存对象;chooseMap对象保存key,time值对,维持数据更新,在缓存区满时踢出较老数据。

 

private Map<Object, Object> bufferMap = null; // 存储数据
private Map<Object, Long> chooseMap = null; // 判断退出数据
 

 一组读写锁,用于读写操作控制。

 

private final ReadWriteLock bufferLock = new ReentrantReadWriteLock(false);
private Lock bufferReadLock = null;
private Lock bufferWriteLock = null;
 

 

 读缓存方法,当缓存内部有所要读对象时,返回所读对象。当找不到对象时,返回null。读方法内部分为两步操作,首先从bufferMap中读取key对象,当读取成功后,在chooseMap中标记key对象为当前最新对象(count为全局int对象,用于记录缓存区内最新对象)。读结束后返回所读对象。

 

public Object readBuffer(Object key) {
	Object tmp = null;
	try {
		bufferReadLock.lock();   //加读锁,控制读过程
		tmp = bufferMap.get(key);   
	} finally {
		bufferReadLock.unlock();  //解读锁
	}
	try {
		bufferWriteLock.lock();   //chooseMap对象内容需要写改变,加写锁
		if (tmp != null)
		chooseMap.put(key, ++count);
	} finally {
	bufferWriteLock.unlock();   //解写锁
	}
	return tmp;
}
 

 cleanBuffer()用于在缓存已满时清理掉最老数据。

 

private void cleanBuffer() {
	Long miniCount = Long.MAX_VALUE;     //miniCount用于指向缓存区中最小数据
	Map<Long, Object> tmpChooseMap = new HashMap<Long, Object>(bufferSize);
	for (Map.Entry<Object, Long> entry : chooseMap.entrySet()) {
		if (miniCount > entry.getValue()) {
			miniCount = entry.getValue();
		}                    //将chooseMap键值对反向存储至tmpChooseMap,方便查找出当前最小数据key值
		tmpChooseMap.put(entry.getValue(), entry.getKey());
	}
	int i;//由于chooseMap内键值对存储了key递增过程值,因此使用计数排序,对最小部分删除,保留部分排序
	for (i = 0; i < (bufferSize * (1 - removeParameter)); i++, miniCount++) {
		Object key1 = tmpChooseMap.get(miniCount);   //获取当前最小值对应key
		if (key1 == null) {//判断是否取到,防止跳值
			i--;
			continue;
		}
		chooseMap.remove(key1);   //移出缓存区
		bufferMap.remove(key1);
	}
	for (Long j = (long) 0; i < bufferSize; i++, miniCount++, j++) {
		Object key1 = tmpChooseMap.get(miniCount);   //对缓存区剩下值重新计数排序
		if (key1 == null) {
			i--;
			j--;
			continue;
		}
		chooseMap.put(key1, j);
	}
	count = (long) bufferMap.size();    //设置最新计数值
}

 移除单个对象方法,从缓存区中移除key值对应对象

 

public void remove(Object key) {
	try {
		bufferWriteLock.lock();
		bufferMap.remove(key);
		chooseMap.remove(key);
	} finally {
		bufferWriteLock.unlock();
	}
}

 清空缓存区方法

 

public void removeAll() {
	try {
		bufferWriteLock.lock();
		bufferMap.clear();
		chooseMap.clear();
	} finally {
		bufferWriteLock.unlock();
	}
}
 

 

 

分享到:
评论

相关推荐

    qt 多线程共享全局缓冲区

    通常,我们更倾向于重载QThread的run()方法,然后通过继承QObject并移动到新线程来实现线程业务逻辑。 全局缓冲区是多线程环境中一个常见的数据结构,用于存储数据,供不同线程访问。由于多线程并发访问可能导致...

    行业分类-设备装置-基于一读一写存储器的多读多写存储器及其实现方法.zip

    《基于一读一写存储器的多读多写存储器及其实现方法》这篇文档主要探讨了在IT行业中,特别是设备装置领域,如何利用一读一写存储器(Read-Write Memory,简称RWM)来设计和实现多读多写(Multi-Reader-Multi-Writer,...

    VC6-GDI+.rar_GDI 双缓冲_MFC_MFC 读jpg_mfc 滚动条_璇诲彇 鍐呭瓨

    在实现过程中,犯了一个错误,把读图像的方法放在了OnDraw之中,后来发现拖动滚动条闪烁的很严重,原因在于ScrollBar拖动时会产生消息激活OnDraw,这样的话,每拖动滚动条就读一次文件,重绘一次,效率当然低下了!...

    环形缓冲区实现原理

    通讯中的收发缓冲区一般采用环形队列(或称为 FIFO 队列),使用环形的缓冲区可以使得读写并发执行,读进程和写进程可以采用“生产者和消费者”的模型来访问缓冲区,从而方便了缓存的使用和管理。 环形缓冲区的执行...

    行业分类-设备装置-一种基于弹性块存储的数据写、读方法及装置.zip

    本文将深入探讨标题和描述中提及的“一种基于弹性块存储的数据写、读方法及装置”,并以此为核心,展开讨论相关知识点。 首先,数据写入方法是EBS性能的关键因素之一。在传统的存储系统中,写入操作可能会受到I/O...

    arrayBuffer(环形缓冲区)

    文件`arrayBuffer(环形缓冲区).txt`可能包含了这个环形缓冲区类的详细代码实现,包括类的定义、方法实现以及可能的测试用例。通过阅读和分析这个文件,我们可以更深入地理解这个环形缓冲区的工作原理和多线程同步...

    行业分类-设备装置-单端口存储器件中的读和写冲突避免方法及其半导体芯片.zip

    4. **写缓冲**:使用写缓冲区暂时存储写操作,等到合适的时机再将数据写入存储器。这种方法可以提高系统效率,但也需要额外的缓冲空间。 5. **多级缓存**:在主存和单端口存储器之间添加多级缓存,通过缓存层次结构...

    行业分类-设备装置-具有读优选单元结构、写驱动器的静态随机存取存储器(SRAM)、相关系统和方法.zip

    在实际应用中,SRAM常常用于CPU缓存、图形处理器内存、网络设备缓冲区等场合。为了提高系统性能,SRAM的设计会考虑到各种优化策略,如降低功耗、提升存储密度、增强抗干扰能力等。相关系统和方法的研究不仅涉及硬件...

    网站常见缓存技术

    这种方式特别适合那些读多写少的应用场景。 **实现原理**: - 以查询语句作为标识符,将查询结果存储在缓存文件中。当遇到相同的查询时,直接从缓存中获取数据。 #### 五、按时间变更进行缓存 按时间变更进行...

    Labview实现串口通信与CRC校验并解析缓冲区数据

    例如,你可以使用字符串函数将接收到的二进制数据转换成可读的ASCII字符串,或者使用结构化数据解析工具处理Modbus协议中的寄存器和线圈值。对于Modbus 485协议,解析缓冲区数据意味着解码功能码、提取寄存器值并...

    行业分类-设备装置-一种对缓冲队列并发执行读、写访问的方法和设备.zip

    标题“行业分类-设备装置-一种对缓冲队列并发执行读、写访问的方法和设备”揭示了这个主题专注于在硬件或设备级别的缓冲队列上实现并发的读写操作。这种方法旨在提高系统的并行处理能力和吞吐量,特别是在多任务或多...

    数据库设计准则及方法论.pdf

    2.内存区的配置:内存区的配置需要根据数据库的性能和可扩展性进行调整。 3.刷新脏页的策略:刷新脏页的策略需要根据数据库的性能和可扩展性进行调整。 七、性能评审 性能评审是指对数据库性能的评估和优化,以...

    分布式缓存Redis使用方法[定义].pdf

    最后,Redis还支持读写分离,允许开发者在配置文件中指定读服务器和写服务器,从而减轻主服务器的压力,提升系统的读取性能。通过这种方式,可以在不影响写操作的前提下,扩展系统的读取能力。 总的来说,Redis是一...

    组态王与ARM开发板串口通信实现.pdf

    下位机ARM9通信数据缓存区设计的目的是让下位机通信数据缓存区中的存储单元与组态王中定义的寄存器对应起来,为数据通信做好准备。 知识点4:串口通信接口电路 串口通信接口电路是上位PC机与下位单片机ARM9的串口...

    使用nginx缓存服务器上静态文件的设置方法

    Nginx缓存的设置方法主要涉及对nginx配置文件的修改,包括http、server和location块的配置。下面是设置nginx缓存的详细步骤: 1. 在http块中设置缓存路径及相关参数: - proxy_connect_timeout:服务器连接的超时...

    Java将图片数据读取到缓冲区中的例子.rar

    Java将图片数据读取到缓冲区中的例子,借助图像的缓冲区,可实现像素级的图像数据处理,是一种处理图片数据很实用的一种方法,可实现较为复杂的图像变换加工,本例只是演示如何创建图像缓冲区,并没有其它的任何图像...

    存储智能缓存技术简介.docx

    4. **智能预取**:读缓存具有自动识别当前I/O顺序读的能力,并根据业务模型动态调整预取策略。智能预取算法不仅能自动调整预取深度,还能根据写入特点自动设置预取模型,从而显著提高读取性能。 5. **缓存安全保护*...

    laravel-repository:轻松实现行业标准缓存策略的抽象层

    Laravel Model Repository使用人类可读的链接方法为您现有的Eloquent模型简化了缓存策略:) 节省缓存存储空间和资金 当前用于缓存Laravel模型的可用方法将整个PHP对象存储在缓存中。 这会消耗大量的额外存储空间,...

    live555读内存(直播)实现

    这个类可能包含了从内存缓冲区中读取字节流的方法,如`getNextFrame`或`readNextFrame`,这些方法负责获取直播数据并将其准备给Live555的流处理机制。 `H264VideoLiveServerMediaSubsession`类则可能是针对H.264...

Global site tag (gtag.js) - Google Analytics