cache 存储方式

Cache 存储方式 :内存或磁盘

2. 单独使用 EHCache

使用CacheManager 创建并管理Cache
使用默认配置文件创建
CacheManager manager = CacheManager.create();
使用指定配置文件创建
CacheManager manager = CacheManager.create("src/config/ehcache.xml");
从classpathq找寻配置文件并创建
URL url = getClass().getResource("/anothername.xml");
CacheManager manager = CacheManager.create(url);
通过输入流创建
InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try {
manager = CacheManager.create(fis);
} finally {
fis.close();
}

卸载CacheManager ,关闭Cache

manager.shutdown();

使用Caches

取得配置文件中预先 定义的sampleCache1设置,生成一个Cache
Cache cache = manager.getCache("sampleCache1");


设置一个名为test 的新cache,test属性为默认
CacheManager manager = CacheManager.create();
manager.addCache("test");

设置一个名为test 的新cache,并定义其属性
CacheManager manager = CacheManager.create();
Cache cache = new Cache("test", 1, true, false, 5, 2);
manager.addCache(cache);


往cache中加入元素
Element element = new Element("key1", "value1");
cache.put(new Element(element);


从cache中取得元素
Element element = cache.get("key1");


3. 在 Hibernate 中运用EHCache

hibernate.cfg.xml中需设置如下:
2.1版本加入
net.sf.ehcache.hibernate.Provider
2.1以下版本加入
net.sf.hibernate.cache.EhCache

在 Hibernate 映射文件的每个需要Cache的Domain中

name="com.somecompany.someproject.domain.Country"
table="ut_Countries"
dynamic-update="false"
dynamic-insert="false"
>
...


加入类似如下格式信息:

比如:


然后在ehcache.xml中加入

maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="false"
/>
TLB(Translation Lookaside Buffer)和 Cache 有多种映射方式,下面分别介绍: ### TLB 的映射方式 TLB 本质上是页表的缓存,其映射方式与一般的 cache 有相似之处,有三种可能的组织方法,分别是直接相联、组相联和全相联。 - **直接相联**:在这种映射方式下,每个虚拟地址只能映射到 TLB 中的一个特定位置。这种方式实现简单,但容易出现冲突,导致 TLB 缺失频率较高。 - **组相联**:将 TLB 分成若干组,每个组包含多个条目。虚拟地址会先映射到特定的组,然后在组内进行查找。这种方式结合了直接相联和全相联的优点,既能减少冲突,又能在一定程度上控制硬件复杂度。在一些设计中,为了设计容量较大的 TLB,会采用组相联的方式。 - **全相联**:虚拟地址可以映射到 TLB 中的任意位置。这种方式查找效率高,能最大程度地减少 TLB 缺失发生的频率,但硬件实现复杂,成本较高,且会导致 TLB 的容量不能太大。在现代处理器中,第一级 TLB 中的指令 TLB 和数据 TLB 一般采用全相联的方式;第二级 TLB 是指令和数据共用的,一般采用组相联的方式[^2]。 ### Cache 的映射方式 - **直接映射**:主存中的每一个块只能映射到 Cache 中的一个特定位置。若 Cache 共有 $2^n$ 行,主存地址被分为三部分:标记位、行索引和块内偏移。行索引用于确定该主存块映射到 Cache 中的哪一行。这种映射方式实现简单,硬件成本低,但冲突率较高,当多个主存块映射到同一 Cache 行时,会频繁发生替换,降低 Cache 的命中率。 - **全相联映射**:主存中的任意一个块可以映射到 Cache 中的任意一行。Cache 只需要一个标记位来表示该 Cache 行存储的是哪个主存块。这种映射方式灵活性高,Cache 命中率高,但查找时需要将主存地址的标记与 Cache 中所有行的标记进行比较,硬件实现复杂,成本高,查找速度慢。 - **组相联映射**:将 Cache 分成若干组,每组包含若干行。主存块首先映射到特定的组,然后在组内进行全相联映射。例如,对于 $2^n$ 组、每组 $k$ 行的组相联 Cache,主存地址分为标记位、组索引和块内偏移。组索引确定主存块映射到哪个组,然后在组内比较标记位来确定是否命中。组相联映射结合了直接映射和全相联映射的优点,既降低了冲突率,又在一定程度上控制了硬件复杂度和查找时间。 ### 代码示例(简单模拟直接映射 Cache) ```python # 模拟一个直接映射的 Cache cache_size = 16 # Cache 大小为 16 个块 cache = [None] * cache_size def direct_mapped_cache_access(address): block_index = address % cache_size # 计算块索引 if cache[block_index] == address: print(f"Cache 命中: 地址 {address}") else: print(f"Cache 缺失: 地址 {address},更新 Cache") cache[block_index] = address # 测试访问 addresses = [0, 16, 32, 0] for address in addresses: direct_mapped_cache_access(address) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值