当前位置:文档之家› play框架手册-13.使用缓存

play框架手册-13.使用缓存

play框架手册-13.使用缓存
play框架手册-13.使用缓存

13.使用cache

为了创建高效的系统,有里会需要缓存数据。play有一个cache库,在分布式环境中使用Memcached。

如果没有配置Memcached,play将使用标准的缓存来存储数据到JVM heap堆中。在JVM应用程序里缓存数据打破了play创造的“什么都不共享”的原则:你不能在多个服务器上运行同一应用程序,否则不能保证应用行为的一致性。每个应用实例将拥有不同的数据备份。

清晰理解缓存约定非常重要:当把数据放入缓存时,就不能保证数据永久存在。事实上不能这样做,缓存非常快,只在内存里存在(并没有进行持久化)。

因此使用缓存最好的用途就是数据不需要进行修改的情况

public static void allProducts() {

List products = Cache.get("products", List.class);

if(products == null) {

products = Product.findAll();

Cache.set("products", products, "30mn");

}

render(products);

}

The cache API

缓存API由play.cache.Cache类提供,这个类包含了许多用于从缓存设置、替换、获取数据的方法。参考Memcached文档以了解每个方法的用法。

示例:

public static void showProduct(String id) {

Product product = Cache.get("product_" + id, Product.class);

if(product == null) {

product = Product.findById(id);

Cache.set("product_" + id, product, "30mn");

}

render(product);

}

public static void addProduct(String name, int price) {

Product product = new Product(name, price);

product.save();

showProduct(product.id);

}

public static void editProduct(String id, String name, int price) {

Product product = Product.findById(id);

https://www.doczj.com/doc/0f10323708.html, = name;

product.price = price;

Cache.set("product_" + id, product, "30mn");

showProduct(id);

}

public static void deleteProduct(String id) {

Product product = Product.findById(id);

product.delete();

Cache.delete("product_" + id);

allProducts();

}

有一些方法是以safe前缀开头的方法,比如safeDelete, safeSet。而标准方法是非阻塞式的,比如:

Cache.delete("product_" + id);

delete方法将立即返回,不会一直等到缓存对象是否真的删除。因此,如果发生错误时,比如IO错误,那么要删除的对象仍旧存在。

在继续之前如果需要确定是否真的把对象删除了,就可以使用safeDelete方法:

Cache.safeDelete("product_" + id);

这个方法是阻塞式的,并且会返回一个boolean值来确定是否真的把对象删除了。因此,从缓存中删除对象的完整模式应该是这样的:

if(!Cache.safeDelete("product_" + id)) {

throw new Exception("Oops, the product has not been removed from the cache");

}

...

注意:这些方法会导致调用中断,安全方法会慢慢的顺着执行下去,一般情况下,只要确实需要的时候才使用这些方法。

同时要注意,当expiration == "0s" (0秒)时,真正的中止时间可能与缓存执行的时间不同。

不要把Session当成缓存!

如果使用框架带来的内存式的session来作缓存,你就会发现play只允许很小的字符串数据可以存入HTTP Session,这里不应该是缓存应用程序数据的地方!

如果你已经习惯了这样做:

httpServletRequest.getSession().put("userProducts", products);

...

// 之后进行请求

products =

(List)httpServletRequest.getSession().get("userProducts");

在Play里可以用其他方式实现相同效果:

Cache.set(session.getId(), products);

...

//接下来的请求为:

List products = Cache.get(session.getId(), List.class)

在这里,我们使用唯一的UUID来为每个用户在缓存里保存唯一信息。请记住,这和session对象不同,缓存并不绑定任何特定的用户!

配置mcached

如果需要允许真正的Memcached实现,就需在memcached configuration定义守护地址memcached.host configuration。

缓冲溶液及其作用机制的教案

缓冲溶液及其作用机制(教学教案) 授课人:张瑞林 授课时间:20分钟 【教学目标】: 通过缓冲溶液的定义、作用、组成及作用机制的介绍,使学生对缓冲体系有一个基本的了解,为以后学习人体缓冲体系打下理论基础。 【教学方式】:多媒体结合板书进行讲解式教学 【教学内容】: 1、缓冲溶液的定义 2、缓冲溶液的作用 3、缓冲溶液的组成 4、缓冲溶液的作用机制 【教学重点及难点】:缓冲溶液的组成、缓冲溶液的作用机制 【教学过程】: 引言: 通过医学常识我们知道正常人的血液pH范围为7.35 ~ 7.45,pH值不因代谢过程中产生酸、碱性物质而变化。为什么血液的pH的范围能保持在7.35 ~ 7.45? 知识准备: 1.弱电解质的电离平衡 2.盐类水解 一、缓冲溶液的概念(由实验引出) 缓冲溶液:能抵抗外加少量强酸或强碱,而维持pH基本不发生变化的溶液。 缓冲作用:缓冲溶液所具有的抵抗外加少量强酸或强碱的作用。 【提问】:1.缓冲溶液的组成是怎样的? 2.缓冲溶液为什么能对抗外来少量强酸、强碱或适当稀释,而保持溶液的pH几乎不变的? 二、缓冲溶液的组成和作用机制 1.缓冲溶液的组成 根据缓冲对不同,缓冲溶液分为三种: 弱酸及其盐 弱碱及其盐 多元弱酸的酸式盐与其次级盐

2.缓冲溶液的作用机制 以HAc — NaAc为例 HAc、NaAc足量 HAc + H 2O H 3 O+ + Ac- + 左移 H 3 O+抗酸成分 + 抗碱成分右移 OH- 2H 2 O 共轭酸—抗碱成分共轭碱—抗酸成分三、讨论: NH 3—NH 4 Cl的缓冲原理 四、练习: 五、小结: 概念:缓冲溶液 缓冲溶液组成和缓冲作用 缓冲原理 六、作业: 搜集资料: 缓冲溶液在日常生活中的应用。

丰田锐志用户使用手册

丰田锐志用户使用手册 丰田锐志车主手册> 1、电动后视镜控制开关 2、侧通风口3、侧除霜器出风口 4、仪表组 5、中央通风口 6、驾驶模式选择开关 7、音响遥控开关 8、电动车窗开关 9、杂物箱 10、门兜 11、后控制箱 12、后通风口 13、后排烟灰盒 14、电源插座 15、杯架 16、自动变速器选档杆 17、倾斜和伸缩式转向锁止释放杆

> 1、前照灯清洁器开关或前照灯光束水平旋钮 2、后电动遮阳帘开关 3、前照灯、转向信号灯、前雾灯开关和后雾灯开关 4、雨刷器和喷洗器开关 5、空调。音响和导航系统控制器(有关导航系统,请参见“导航系统用户手册”。) 6、Plasmacluster(空气电离器)开关 7、危险告警灯开关 8、后车窗和车外后视镜除雾器开关 9(前排乘员座椅安全带提示灯 10、辅助储物箱或音响系统控制器(有关音响系统控制器,请参见“导航系统用户手册”。) 11、座椅加热器开关 12、点烟器和烟灰盒 13、时钟 14、“TRCOFF”(牵引力控制系统关闭)开关 15、巡航控制开关

16、点火开关(发动机开关) 17、发动机罩锁定释放杆 18、辅助储物箱和卡片盒 19、自适应性前照灯系统关闭开关 > 1、音响遥控开关 2、电话按钮(有关细节,请参见“导航系统用户手册”。) 3、外界温度和遥航信息显示器控制开关 > > 1、前方个人用灯

2、前方个人用灯开关 3、辅助储物箱 4、电动月亮天窗开关 5、麦克风(有关细节,请参见“导航系统用户手册”。) 6、“ROOM”(冷光顶灯)开关 > 1、短距离里程表复位按钮 2、车速表 3、维修提示指示灯和指示灯 4、车门,发动机罩,行李厢开启指示显示器 5、自动变速器档位显示器 6、外界温度显示器和,或巡航信息显示器 7、转速表 8、仪表板照明控制按钮 9、里程表和双短距离里程表 10、发动机冷却液温度表 11、燃油表

Android客户端缓存方案

概述: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 缓存文件保存策略: 1.文字缓存: 文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域. 根据两者的更新频率区分它们的过期时间. 更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到关闭的这段时间).这种情况会有专门的缓存文件夹存放该类缓存文件,以及专门的缓存数据库表存放信息.每次应用程序启动的时候都会先将该类数据清空. 另一种很少更新的区域,它的缓存不设置过期时间,而是提供一个按钮或者Menu可以让用户选择手动更新(如我的好友列表,我的订阅,我的分享.等等….) 具体的文字缓存划分,详见附录1. (1)通常情况下,我们与服务器交互都是采用JSON格式获取数据的,获取的JSON数 据仅仅是一段字符串,我们可以考虑将这些字符串使用文件流写入一个TXT,保存到 SD卡中,在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是 请求的URL,另一个则是本地保存后的文件地址.日后每次向服务器发起请求之前都会根据URL在数据库中检索. 该方法好处:降低系统数据库数据量,不会出现数据库满了的现象. 缺点:IO操作频繁,有时代码书写有误会造成内存泄露等状况. (2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的 数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回. 该方法好处:如果本地存在文字缓存,那么读取缓存速度快. 缺点:增加数据库数据量. 2.多媒体文件缓存 (1)图片缓存 图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录, 同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片 的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索, 如果没有则连接服务器下载,下载之后再服务器中作出相应记录. (2)视频文件缓存 考虑到视频文件就是动画片,每一集的大小应该超过20MB,如果边播放边下载的话 用户的3G流量负担是很大的,而且用户看完一集动画片,基本上不会再去看第二遍. 从这个状况来看,建议不要对视频文件进行下载缓存.另外也能降低程序员的编码负 担.

缓存机制

3.1、缓存策略 3.1.1、一级缓存 之前每一个数据库操作都是一个Session,那么对于Session来说本身是存在着缓存,可以保留之前的查询结果。 但是对于Session的缓存只针对于一个Session有效,那么如果现在想针对于多个Session 有作用,则必须在SessionFactory上配置缓存,那么这样的缓存称为二级缓存。 在Hiernate按ID查询有两个方法:load、get 那么下面使用以上的查询方法,查询两次 程序虽然调用了两次load方法,但是只发出了一条的查询命令,证明,第一次的查询结果被保存下来了,那么这就是一级缓存。

与之前的相比,查询了两次操作,所以此时,证明一级缓存只是针对于一个Session起作用的。但是一级缓存是无法关闭的,始终会存在。

从运行结果可以发现,如果之前先进行了保存操作,那么之后再查询的话也不会重新发出查询语句。证明实体被缓存下来。 问题: 如果现在要求使用程序插入100000万条记录?该怎么办? 如果使用Hibernate处理的话,则可能会出现内存的溢出,所以在这种情况下首先是绝对不建议使用Hibernate完成的,就使用最基本的JDBC操作完成即可。 如果非要使用Hibernate做,则必须使用到Session中关于缓存的一些操作方法:·清空Session中的所有缓存:clear() ·清空Session中一个指定的实体:evict(Object obj) 例如:下面验证clear()方法 因为程序中,将所有的缓存清空了,所以之后再查询相同实体的时候,在Session中已

以上因为只清空了一个实体,所以只发出了三个查询语句。 那么就可以通过以上的方式完成100W条记录的插入 思路:按照每十条清空缓存的操作,并将缓存中的内容强制性的写到数据库之中 3.1.2、二级缓存(重点) 在Hibernate本身中支持了多种的二级缓存组件。本次使用EHcache。如果要想使用ehcache话,则首先必须进行配置,配置ehcache的缓存文件。 ehcache.xml:

丰田OBD使用说明

丰田OBD红色智能钥匙匹配仪,钥匙专家必备工具专业匹配丰田系列智能钥匙 支持丰田佳美大霸王凌志霸道皇冠锐志凯美瑞卡罗拉普瑞斯等等芯片钥匙匹配及智能 新皇冠的需要新皇冠智能钥匙匹配仪匹配 几秒的时间就可以做好一条钥匙 匹配普通4D钥匙: ?用带正确4D晶片的钥匙打开点火开关至“ON” ?把匹配仪插到汽车诊断口OBD,匹配仪通电后回发出一声短促的“滴” 仪器进入自动搜索车辆状态,7秒后与汽车电脑连接成功仪器会“滴”“滴” 叫2-3声,(叫两声,表示车辆系统是2代,叫3声表示系统是3代) 等待20秒钟后仪器会“滴”长鸣,表示车辆进入“学习钥匙状态” ?学习钥匙进防盗电脑 o匹配2把主钥匙和1把副钥匙到IMMO电脑(注意:必须要有2把新的主钥匙和一把副钥匙自动关闭学习程序) b.插入第一把新的钥匙到点火锁中等5秒,SEC灯亮。(插入钥匙 不能打开点火开关) c.插入另一把主钥匙到点火锁中等5秒SEC灯亮。(插入钥匙不能 打开点火开关) d.插入一把副钥匙到点火锁中,SEC灯灭。(插入钥匙不能打开点 火开关) e.只匹配1把或2把主钥匙到IMMO电脑(匹配完成后必须手动关闭 匹配模式) f.插入第一把主钥匙等5秒,SEC灯亮。(插入钥匙不能打开点火 开关) g.插入第二把主钥匙等5秒,SEC灯亮。(插入钥匙不能打开点火 开关) h.插入第一把刚匹配好的主钥匙,很快地开关点火开关5次,然后取 出。(2002-2005年的霸道,结束学习钥匙模式:拔出最后一把钥 匙后,踩刹车踏板6次,SEC灯灭) 匹配智能卡钥匙使用说明: (1)有主钥匙增加其它钥匙: 1,把匹配仪插到汽车诊断接口OBD,匹配仪通电后会发出一声短促的“滴”仪器进入自动搜索车辆状态。 2,按放启动按键两次。7秒钟后设备连接汽车成功,设备会“滴”叫4-5声,

FTP文件下载不能及时更新

FTP文件下载“不能及时更新”都是IE缓存的错 事件回放:学期末,信息技术课学生正在微机室进行在线考试。”上面有答案,”下面有同学小声议论经,我看了一下,原来我在制作试卷时将答案与试题做成了一个文档,学生在下载试卷的同时,答案也就下载了。我赶紧嘱咐学生自觉考试,同时将答案自觉删除。幸好是第一个班,我赶紧登陆到学校FTP服务器上,将考试文档中答案删除。每想到第二个班考试时,下载的考试文档还有答案。我直接到FTP服务器上操作,发现确实已经删除了。怎么加事?经过一番分析,原来都是IE缓存引起的。 关于IE缓存 为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里。这个存放空间,我们就称它为IE缓存。以后我们每次访问网站时,IE会首先搜索这个目录,如果其中已经有访问过的内容,那IE就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速度。 FTP默认工作方式也是通过IE打开,我们不难分析产生这种现象的原因: 从FTP服务器下载文档到本地或是直接打开文档,首先到IE缓存检查有没有同名的文件存在,如果有,就直接从IE缓存打开或下载。如果没有,先下载到IE缓存,然后再从IE缓存下载到本地,当在FTP服务器上对文件内容修改时,只要文件名没改变时,即使内容变了或者文件大小变了,客户端先检查本地IE缓存,如果存在同名(不管大小或文件最后修改时间),就直接从本地IE缓存下载,当然还是原来那个文件了。 小秘密:关于文件在缓存中的位置。在IE的“工具”菜单下选择“Internet选项”,然后在“常规”选项卡中你会看到有“Internet临时文件”这一项,单击“设置”按钮,然后在弹出的“设置”对话框中就可以看到IE缓存的位置,winxp与win7略有不同了。这里有一个不能不说的秘密了。我开始在实验中,在该缓存目录下没有发现任何我要下载的文档,通过WINDOWS的文件查找功能在该目录下也没有找到任何文档了,其实下载的文档应该还是从缓存COPY过来的,因为在FTP服务端已经更改了内容了。后来查阅了相关资料才知道在系统提示的IE缓存目录下还有一个文件夹“\Content.IE5”,它即不是隐藏的也不是系统的,所以不通过手工输入,是无法进入的。当进入到该目录下,你看到那些在"content.ie5"目录下以数字和字母命名的文件夹了么?这是微软试图通过使用复杂的文件名来使他的计划越发难以理解,这些数字和字母命名的文件夹就是微软生成的用来保存你的cookies和缓存的文件夹,如下图所示。

缓存管理需求说明

缓存管理功能需求说明 缓存管理开发背景 缓存管理功能的开发,意在减少系统对数据库的过多访问,通过减少对数据库的访问次数,改用访问内存的方式,提升系统的性能。直接从内存获取数据,较之从数据库获取数据,效率可以得到显著的提升。 系统由于多次查询数据库,消耗大量系统资源,且查询效率可能因为开发者的个人能力导致查询效率不高,或占用过多资源影响系统性能。使用缓存管理,系统只有第一次查询访问数据库,而后皆通过访问内存取得数据,不需要在计较这次查询的SQL是否过于复杂,是否效率低下,直接取得数据返回即可。 第一部分、缓存管理 缓存管理提供了缓存工具类CacheUtils以供开发者对缓存进行自定义开发。如果开发者需要自己开发某功能需要涉及缓存管理则可以借助使用CacheUtils工具类来完成。本地缓存管理和redis 缓存管理的区分在于redis是否正确连接且启动。注意,是正确连接并且启动redis服务器。 关于开发者需要自行开发某功能的缓存管理需要了解CacheUtils怎么使用可以查看《缓存管理开发说明》 本地缓存管理 本地缓存管理是在redis没有正常启动运行的时候系统提供的缓存管理方式。本地缓存管理暂无任何持久化操作。对于缓存中的所有数据,在应用重启后一律清空,需要重新载入缓存。本地缓存

管理采用的是标准的key-value形式保存,于Java中采用的结构形式为HashMap结构,HashMap 有利于快速的存取,因而采用该结构保存本地缓存。其中key的类型为string,value的类型为object。本地缓存管理对于类型的限制基本没有。Value可以置入任何Java支持的对象。 本地缓存管理中,保存进入缓存只需要使用CacheUtils中的save方法进行保存即可,保存的数据在本地缓存中不做多余的处理,直接置入缓存中。由于采用的是以Object类型的形式保存,并不会对保存的数据进行转换,获取保存的缓存数据时直接使用CacheUtils中的get方法即可取得保存的数据,达到怎么存就怎么取,存什么取什么。无需更多的变换数据结构,更不会导致因为存储导致类型的变换或者数据的丢失。 由于存什么取得的就是什么,因而直接修改取得的数据对象有可能导致缓存数据也被修改。Redis缓存管理 Redis缓存管理需要开启redis服务器并正确配置连接信息,系统会在启动的时候检测redis是否可以正常连接启用,如果没有正常连接启用则使用本地缓存管理。 Redis缓存管理对于类型具有特别的要求,对于不同的数据类型需要使用对应的类型进行保存。且不允许使用复杂的对象类型进行保存,如list-object是不被允许的,需要转换为list-string的类型再进行保存,同理Map类型也不被允许使用Object,但是单个JavaBean是允许进行存取的。即redis 缓存管理不支持三维结构存储,仅支持二维结构存储。 Redis缓存管理的数据会有简易的持久化。即当redis停止后或者系统停止后,再次启动时redis 依然存有数据提供,不需要再次载入缓存。如果缓存设置了失效则可能会被清除。 Redis缓存管理保存、修改 由于redis数据类型的特殊性,所以所有Java中复杂的对象存储都需要进行相应的转换后才可

减震缓冲技术

减震缓冲技术发展综述 姓名:尚兴超 学号:511011503 指导老师:梁医 一.概述 机械振动、冲击问题广泛存在于工程机械[1]、汽车机械、建筑机械、船舶机械、航空航天、武器领域[2]等,减振器和缓冲器主要是用于减小或削弱振动或冲击对设备与人员影响的一个部件。它起到衰减和吸收振动的作用。使得某些设备及人员免受不良振动的影响,起到保护设备及人员正常工作与安全的作用,因此它广泛应用于各种机床、汽车、摩托车、火车、轮船、飞机及坦克等装备上。 振动问题的基本方程为: ()e sin n t d x A t ζωωφ-=+ 从方程中可以看出,系统振动幅值的衰减与阻尼系数大小ζ有关[3],也就是说,震动产生的能量将会被阻尼所吸收。减震器和缓冲器就是基于此原理而设计的。 二.发展历史 世界上第一个有记载、比较简单的减震器是1897年由两个姓吉明的人发明的。他们把橡胶块与叶片弹簧的端部相连,当悬架被完全压缩时,橡胶减震块就碰到连接在汽车大梁上的一个螺栓, 产生止动。1898年,第一个实用的减震器 由一个法国人特鲁芬特研制成功并被安装到摩托赛车上。他将前叉悬置于弹簧上,同时与一个摩擦阻尼件相连,以防止摩托车的振颤。1899年,美国汽车爱好者爱德华特·哈德福特将前者应用于汽车上。后来,又经历了加布里埃尔减震器、平衡弹簧式减震器和1909年发明的空气弹簧减震器。空气弹簧减震器类似于充气轮胎的工作原理,它的主要缺点是常常产生漏气。 1908年法国人霍迪立设计了第一个实用的液压减震器。其原理是液流通过小孔时产生的阻尼现象。20世纪60年代,通用公司麦迪逊工程师研制了把螺旋弹簧、液压减震器和上悬架臂杆组成的麦迪逊减震器,其体积比较小,得到了广泛的应用[4]。 三.研究现状 液压缓冲器是目前应用最为广泛的减震缓冲装置,其结构简单,运行平稳。

mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache

mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和 mybatis整合ehcache 1 查询缓存1.1 什么是查询缓存mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits 提供一级缓存,和二级缓存。一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper 的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存是多个SqlSession 共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql 中传递参数也相同即最终执行相同的sql语句,第一次执行

完毕会将数据库中查询的数据写到缓存(内存),第二次会 从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。如果缓存中有数据就不用从数据库中获取,大大提高系统性能。1.2 一级缓存1.2.1 一级缓存工作原理下图是根据id查询用户的一级缓存图解第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的 用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession 中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。1.2.2 一级缓存测试mybatis默认支持一级缓存,不需要在配置文件去配置。按照上边一级 缓存原理步骤去测试。@Test public void testCache1() throws Exception{ SqlSessionsqlSession = sqlSessionFactory.openSession();//创建代理对象UserMapperuserMapper = sqlSession.getMapper(UserMapper.class); // 下边查询使用一个SqlSession //第一次发起请求,查询id为1的用户Useruser1 =

openVXI的缓存实现机制

DocumentParser的FetchDocument方法的声明如下: int DocumentParser::FetchDocument(const VXIchar * url, const VXIMapHolder & properties, VXIinetInterface * inet, VXIcacheInterface * cache, SimpleLogger & log, VXMLDocument & document, VXIMapHolder & docProperties, bool isDefaults, bool isRootApp, VXIbyte **content, VXIulong *size); 很明显声明用到了VXIcacheInterface,但是继续阅读代码,却没有发现使用了参数cache。就是参数中虽有VXIcacheInterface,但是函数中并没有用到。浏览一下函数FetchDocument,里面有这样的注释: // (1) Load the VXML DTD for validation. This will override an externally // specified DTD if the user provides a link. // (2) Load the url into memory. // (3) Pull the document from cache. // (4) Not in cache; parse buffer into our VXML document representation // (5) Write the compiled form out to the cache. // (6) Parse was successful, process document. W e want only the top level node. 看一下// (3) Pull the document from cache.下面的代码,会发现是从一个叫DocumentStorageSingleton的变量里面。 DocumentStorageSingleton::Instance()->Retrieve(doc, buffer, bufSize, docURL.c_str()) 看一下DocumentStorageSingleton里面有个成员变量DOC_STORAGE storage;其实是map类型的。注释所指的cache就是DocumentStorageSingleton。也就是说DocumentParser用到的cache的功能是由DocumentSt orageSingleton实现的。 看一下VXIcache.h开头的注释: /* Abstract interface for accessing caching functionality, which * permits writing arbitrary data into the cache with a client * supplied key name, then retrieving that data from the cache one or * more times by reading against that key name. * * Normally the cache implementation can choose to discard the data * between the write and the read when necessary (due to running out * of cache space, etc.), but it is also possible for clients to lock * data in the cache to support built-in grammars and other data that * is explicitly provisioned by system administrators and thus must * not be removed unless by explicit system administrator command. * The interface is a synchronous interface based on the ANSI/ISO C * standard file I/O interface. The client of the interface may use this in * an asynchronous manner by using non-blocking I/O operations, * creating threads, or by invoking this from a separate server

Java 中常用缓存Cache机制的实现

Cache 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。 缓存主要可分为二大类: 一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式; 二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. 代码如下: package lhm.hcy.guge.frameset.cache; import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间 public class CacheManager { private static HashMap cacheMap = new HashMap(); //单实例构造方法 private CacheManager() { super(); } //获取布尔值的缓存 public static boolean getSimpleFlag(String key){ try{ return (Boolean) cacheMap.get(key); }catch(NullPointerException e){ return false;

} public static long getServerStartdt(String key){ try { return (Long)cacheMap.get(key); } catch (Exception ex) { return 0; } } //设置布尔值的缓存 public synchronized static boolean setSimpleFlag(String key,boolean flag){ if (flag && getSimpleFlag(key)) {//假如为真不允许被覆盖 return false; }else{ cacheMap.put(key, flag); return true; } } public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){ if (cacheMap.get(key) == null) { cacheMap.put(key,serverbegrundt); return true; }else{ return false; } } //得到缓存。同步静态方法 private synchronized static Cache getCache(String key) { return (Cache) cacheMap.get(key); } //判断是否存在一个缓存 private synchronized static boolean hasCache(String key) { return cacheMap.containsKey(key); } //清除所有缓存 public synchronized static void clearAll() { cacheMap.clear(); } //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的

小程序的更新机制

背景 此前我们有收到开发者的反馈,当小程序发布新版本后,新版本覆盖率比较慢,尤其是遇到 了一些紧急的 BUG时,线上覆盖速度令人着急。 为了解决这个问题,我们进行了一些探索,最终得出了一个解决方案——小程序更新机制, 今天和大家分享一下。 小程序的更新机制 异步更新机制 小程序的更新需要经过两个关键的步骤: Step1:向微信后台请求新版本信息; Step2:从微信 CDN 下载小程序的代码包。 这两个步骤均需要网络链接,同时这两个步骤都是单独进行,并且是强依赖的,即如果没有 新版本信息,就无法确定新版本的下载地址。 更新检测与下载流程通常会放在启动阶段进行,小程序平台也是如此。 不过小程序的更新流程与启动流程是同时并发执行。 即使更新信息拉取失败了,也不会影响小程序的启动;同时更新也不会影响到小程序的启动 速度。 但由于小程序的更新流程是异步的,无法在本次启动就能够应用上新的版本,如果本次启动 已经下载好新的版本了,需要在下次启动小程序时才能应用上新版本。 超过有效时间强制同步更新机制 为了尽量避免这种更新延迟情况,我们还设计了一个超过有效时间同步检查更新机制,假如 用户已经超过7天没有打开过小程序了,这个时候会强制同步拉取新版本信息、下载新版本,并且使用新版本启动。 更新机制引起的问题 超过有效时间同步检查更新机制能确保到发布版本7天后,绝大部分用户能用上新的版本, 但问题时在 7天之内使用的用户,可能在第一次启动时遇到的是异步更新机制,需要在第二 次启动时才能应用新的版本。 这就导致了一些紧急发布无法在批量检查更新的 7天内无法覆盖到绝大部分用户,对于线上 问题来说是很致命的。 解决这一问题的思路 为了解决这个问题,我们内部也经历了数个方案的讨论,与大家分享一下我们思考的过程:1. 同步检查更新(放弃) 可能是最直接的解决思路,但这个方案的问题在于会影响小程序的启动速度,当下小程序的 更新迭代是非常频繁的,部分用户可能每次启动都命中更新,如果需要同步检查更新 + 同步 下载新的版本,那将会影响这部分用户的启动体验。 2. 模块热替换(放弃) 模块热替换是指小程序运行起来后,将新版本的 JS 代码与页面进行热替换,使之可以在当前版本上应用上新版本的功能。 这种方案可以解决异步更新不能在本次启动马上应用上的问题,从技术上来说,这也是最好 的方案,但同时缺点也比较明显,会存在新旧逻辑、页面共存问题,对于开发者来说,反而 更不好处理,特别是涉及到全局变量时,情况会更复杂。

一级、二级、三级缓存机制

首先我们来简单了解一下一级缓存。目前所有主流处理器大都具有一级缓存和 二级缓存,少数高端处理器还集成了三级缓存。其中,一级缓存可分为一级指 令缓存和一级数据缓存。一级指令缓存用于暂时存储并向CPU递送各类运算指令;一级数据缓存用于暂时存储并向CPU递送运算所需数据,这就是一级缓存的作用(如果大家对上述文字理解困难的话,可参照下图所示)。 那么,二级缓存的作用又是什么呢?简单地说,二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。 需要注意的是,无论是二级缓存、三级缓存还是内存都不能存储处理器操作的 原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。 根据工作原理的不同,目前主流处理器所采用的一级数据缓存又可以分为实数 据读写缓存和数据代码指令追踪缓存2种,它们分别被AMD和Intel所采用。不同的一级数据缓存设计对于二级缓存容量的需求也各不相同,下面让我们简 单了解一下这两种一级数据缓存设计的不同之处。 一、AMD一级数据缓存设计 AMD采用的一级缓存设计属于传统的“实数据读写缓存”设计。基于该架构 的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二级缓存和系统内存当中。做个简单的假设,假如处理器需要读取“AMD ATHLON64 3000+ IS GOOD”这一串数据(不记空格),那么首先要被读取的“AMDATHL”将被存储在一级数据缓存中,而余下的 “ON643000+ISGOOD”则被分别存储在二级缓存和系统内存当中(如下图 所示)。 需要注意的是,以上假设只是对AMD处理器一级数据缓存的一个抽象描述, 一级数据缓存和二级缓存所能存储的数据长度完全由缓存容量的大小决定,而 绝非以上假设中的几个字节。“实数据读写缓存”的优点是数据读取直接快速,

高并发网站多级缓存设计

高并发网站多级缓存设计

什么是多级缓存 所谓多级缓存,即在整个系统架构的不同系统层级进行数据缓存,以提升访问效率,这也是应用最广的方案之一。我们应用的整体架构如图1所示: 图1 多级缓存方案 整体流程如上图所示: 1)首先接入Nginx将请求负载均衡到应用Nginx,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均衡,而一致性哈希可以提升应用Nginx的缓存命中率,相对于轮询,

一致性哈希会存在单机热点问题,一种解决办法是热点直接推送到接入层Nginx,一种办法是设置一个阀值,当超过阀值,改为轮询算法。 2)接着应用Nginx读取本地缓存(本地缓存可以使用Lua Shared Dict、Nginx Proxy Cache(磁盘/内存)、Local Redis实现),如果本地缓存命中则直接返回,使用应用Nginx本地缓存可以提升整体的吞吐量,降低后端的压力,尤其应对热点问题非常有效。 3)如果Nginx本地缓存没命中,则会读取相应的分布式缓存(如Redis缓存,另外可以考虑使用主从架构来提升性能和吞吐量),如果分布式缓存命中则直接返回相应数据(并回写到Nginx本地缓存)。 4)如果分布式缓存也没有命中,则会回源到Tomcat集群,在回源到Tomcat集群时也可以使用轮询和一致性哈希作为负载均衡算法。 5)在Tomcat应用中,首先读取本地堆缓存,如果有则直接返回(并会写到主Redis集群),为什么要加一层本地堆缓存将在缓存崩溃与快速修复部分细聊。

6)作为可选部分,如果步骤4没有命中可以再尝试一次读主Redis集群操作。目的是防止当从有问题时的流量冲击。 7)如果所有缓存都没有命中只能查询DB或相关服务获取相关数据并返回。 8)步骤7返回的数据异步写到主Redis集群,此处可能多个Tomcat实例同时写主Redis集群,可能造成数据错乱,如何解决该问题将在更新缓存与原子性部分细聊。 应用整体分了三部分缓存:应用Nginx本地缓存、分布式缓存、Tomcat堆缓存,每一层缓存都用来解决相关的问题,如应用Nginx本地缓存用来解决热点缓存问题,分布式缓存用来减少访问回源率、Tomcat堆缓存用于防止相关缓存失效/崩溃之后的冲击。 虽然就是加缓存,但是怎么加,怎么用细想下来还是有很多问题需要权衡和考量的,接下来部分我们就详细来讨论一些缓存相关的问题。 如何缓存数据

概率缓存策略的网络传输机制研究

电子设计工程ElectronicDesign Engineering 第25卷Vol.25第2期No.22017年1月Jan.2017 收稿日期:2016-04-07稿件编号:201604073基金项目:国家自然科学基金(61372180) 作者简介:常珞(1975—),男,河南杞县人,讲师。研究方向:计算机科技。 近年来,随着网络设备的普及,用户对数据资源 的使用需求日益增长[1]。与此同时,IP 网络规模指数式 增长而带来的对网络管理和维护的迫切需求[2],研究 数据资源缓存是资源共享网络传输研究中的一个关 键技术[3],也是面向未来网络研究领域的热点问题[4]。 资源缓存是网络传输中的重要特征,对于提升用户 访问共享资源的性能具有重要影响[5]。共享资源下的 网络传输旨在利用内置缓存提高资源获取的传输效 率和网络资源的利用率[6],在网络传输过程中,通过 分布式的内容缓存机制[7],允许节点路由器对传输的资源进行缓存,这样Interest 请求就不会再被转发到远处的数据资源[8],从而不必每次都从源获取资源,提高资源传输效率,使得网络传输能够有效地支持内容业务。本研究考虑网络拓扑对缓存的影响,利用网络传输过程中固定时间段内资源流行度的差异性,结合资源本身的收益因素,提出一种基于概率缓存策略PCS (ProbabilisticCaching strategy )的网络传输机制。在用户发送资源请求沿原路径返回时,由资源收概率缓存策略的网络传输机制研究 常珞,薛念 (河南医学高等专科学校河南郑州451191) 摘要:针对网络传输过程中数据资源以高流行度缓存在路由器内,以提高资源获取的传输效率和资源利用率的问题。本研究考虑网络拓扑对缓存的影响,利用网络传输过程中固定时间段内资源流行度的差异性,结合资源本身的收益因素,提出一种基于概率缓存策略PCS (ProbabilisticCaching strat -egy )的网络传输机制。通过该资源数据请求路径进行概率缓存,以提高网络传输过程中的缓存性能。仿真表明该缓存策略有效地避免了非热门内容的不必要缓存,当缓存容量5%时,平均命中率可达25%,平均跳数仅为3.42,有利于网络传输整体性能的提升。 关键词:概率缓存;网络传输;资源价值;流行度;缓存命中率;平均跳数 中图分类号:TN393文献标识码:A 文章编号:1674-6236(2017)02-0159-04 Research network transport mechanism based on probability caching strategy CHANG Luo ,XUE Nian (Henan Medical College ,Zhengzhou 451191,China ) Abstract:For network transfer data cache resources to high popularity in the router ,access to resources in order to improve the problem of transmission efficiency and resource utilization.In this study ,to consider the impact of network topology cache ,the use of network resources during transmission fixed period of popularity differences ,combined with profit and the resource itself proposed network transmission scheme based on probability caching policy PCS (ProbabilisticCaching strategy )of .By request of the resource data path probability cache to improve network transfer performance cache.The simulation shows that the cache policy effectively avoid unnecessary cache non -popular content ,when the cache capacity is 5%,the average hit rate of 25%,the average number of hops is only 3.42,in favor of the overall performance of the transmission network upgrade. Key words:probability cache ;network transmission ;resource value ;popularity ;cache hit ratio ;the average number -159- 万方数据

级二级三级缓存机制

首先我们来简单了解一下。目前所有主流处理器大都具有和二级缓存,少数高 端处理器还集成了。其中,可分为一级指令缓存和一级数据缓存。一级指令缓 存用于暂时存储并向CPU递送各类运算指令;一级数据缓存用于暂时存储并向CPU递送运算所需数据,这就是一级缓存的作用(如果大家对上述文字理解困难的话,可参照下图所示)。 那么,二级缓存的作用又是什么呢?简单地说,二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。同样道理,和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。需要注意 的是,无论是二级缓存、还是内存都不能存储处理器操作的原始指令,这些指 令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。 根据工作原理的不同,目前主流处理器所采用的一级数据缓存又可以分为实数 据读写缓存和数据代码指令追踪缓存2种,它们分别被AMD和Intel所采用。不同的一级数据缓存设计对于二级缓存容量的需求也各不相同,下面让我们简 单了解一下这两种一级数据缓存设计的不同之处。 一、AMD一级数据缓存设计 AMD采用的一级缓存设计属于传统的“实数据读写缓存”设计。基于该架构 的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二级缓存和系统内存当中。做个简单的假设,假如处理器需要读取“AMD 3000+ IS GOOD”这一串数据(不记空格),那么首先要被读取的“AMDATHL”将被存储在一级数据缓存中,而余下的“ON3000+ISGOOD”则被分别存储在二级缓存和系统内存当中(如下图所示)。 需要注意的是,以上假设只是对一级数据缓存的一个抽象描述,一级数据缓存 和二级缓存所能存储的数据长度完全由缓存容量的大小决定,而绝非以上假设 中的几个字节。“实数据读写缓存”的优点是数据读取直接快速,但这也需要 一级数据缓存具有一定的容量,增加了处理器的制造难度(一级数据缓存的单

相关主题
文本预览
相关文档 最新文档