列表数据部分字段缓存
action本身肯定不能缓存数据的。http请求是短链接,不能保证每次被同一个实例访问到。所以要传输数据有两种方法。一个是通过画面的隐藏字段,再次将参数传过来,不过你这里是数组,会麻烦一点。还有一种方式是通过session,这是最常用的。
2. 在页面上进行缓存后又要保证局部的数据不缓存,如何实现
页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容。实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。设置控件缓存的实质是对用户控件进行缓存配置。主要包括以下3种方法:一是使用@ OutputCache指令以声明方式为用户控件设置缓存功能,二是在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存;三是使用ControlCachePolicy类以编程方式指定用户控件缓存设置。另外,还有一种称为“缓存后替换”的方法。该方法与控件缓存正好相反,将页面中的某一部分设置为不缓存,因此,尽管缓存了整个页面,但是当再次请求该页时,将重新处理那些没有设置为缓存的内容。
使用@ OutputCache指令
控件缓存与页面输出缓存的@ OutputCache指令既有相似之处,又有不同的方面。二者的共同点在于它们的设置方法基本相同,都是文件顶部设置包含属性的@ OutputCache指令字符串。不同点包括以下两个方面:一是控件缓存的@ OutputCache指令设置在用户控件文件中,而页面输出缓存的@ OutputCache设置在普通ASP.NET文件中。二是控件缓存的@ OutputCache指令只能设置6个属性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在页面输出缓存的@ OutputCache指令字符串中设置的属性多达10个。以上是设置控件缓存时需要注意的问题。下面列举了一些利用@ OutputCache指令设置控件缓存的示例,其中重点说明了VaryByParam和VaryByControl等属性应用。
用户控件中的@ OutputCache指令设置源代码
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>
以上代码设置用户控件缓存有效期时间是120秒,并且允许使用CategoryID和SelectedID参数来改变缓存。通过VaryByParam属性设置,在服务器缓存中可能存储多个用户控件的实例。例如,对于一个包含用户控件的页面,可能存在如下的URL链接。
包含用户控件的页面的URL链接
http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1
当请求如上URL地址的页面时,由于控件中@ OutputCache指令的设置,尤其是属性VaryByParam的设置,那么在服务器缓存中就会存储两个版本的用户控件缓存实例。
控件缓存设置除了支持以上所述VaryByParam属性外,还支持VaryByControl属性。VaryByParam属性基于使用POST或者GET方式发送的名称/值对来改变缓存,而VaryByControl属性通过用户控件文件中包含的服务器控件来改变缓存。下面是VaryByControl属性的应用示例代码。
用户控件中的@ OutputCache指令设置源代码
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>
以上代码设置缓存有效期是120秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“Category”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来存储用户控件数据。
如果读者已经掌握了页面输出缓存的@ OutputCache指令设置方法,那么控件缓存的@ OutputCache指令也会迎刃而解,无非仅使用其中的6个属性而已。然而,可能会产生疑问:如果ASP.NET页面和其中包含的用户控件都通过@ OutputCache指令设置了缓存,那么缓存该如何运行呢?
遇到这个问题时,应掌握以下个基本原则:一是ASP.NET允许在页面和页面的用户控件中同时使用@ OutputCache指令设置缓存,并且允许设置不同的缓存过期时间值。二是如果页面输出缓存过期时间长于用户控件输出缓存过期时间,则页面的输出缓存持续时间优先。例如,如果页面输出缓存设置为100秒,而用户控件的输出缓存设置为50秒,则包括用户控件在内的整个页将在输出缓存中存储100秒,而与用户控件较短的时间设置无关。三是如果页面输出缓存过期时间比用户控件的输出缓存过期时间短,则即使已为某个请求重新生成该页面的其余部分,也将一直缓存用户控件直到其过期时间到期为止。例如,如果页面输出缓存设置为50秒,而用户控件输出缓存设置为100秒,则页面其余部分每到期两次,用户控件才到期一次。
3. java memcached怎么缓存部分数据
其实就相当于在应用程序和数据库之间开了一块内存区域,将一些高频访问的数据放在其中,避免每次都请求数据库。至于之所以用memcached和redis,而不是自己在程序里开个hashmap,是因为这块区域可以共享且容易管理,在集群环境下更方便使用。
4. 查询数据放入了redis中缓存,怎么查看缓存的数据
普通分页
一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。
如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。
比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式很难应对。
一种思路
最近想到了另一种思路。
数据以ID为key缓存到Redis里;
把数据ID和排序打分存到Redis的skip list,即zset里;
当查找数据时,先从Redis里的skip list取出对应的分页数据,得到ID列表。
用multi get从redis上一次性把ID列表里的所有数据都取出来。如果有缺少某些ID的数据,再从数据库里查找,再一块返回给用户,并把查出来的数据按ID缓存到Redis里。
在最后一步,可以有一些小技巧:
比如在缺少一些ID数据的情况下,先直接返回给用户,然后前端再用ajax请求缺少的ID的数据,再动态刷新。
5. 启用数据库字段缓存有什么好处
thinkphp 3.2关闭/开启字段缓存实例
通常每个模型类是操作某个数据表,在大多数情况下,系统会自动获取当前数据表的字段信息。
系统会在模型首次实例化的时候自动获取数据表的字段信息(而且只需要一次,以后会永久缓存字段信息,除非设置不缓存或者删除),如果是调试模式则不会生成字段缓存文件,则表示每次都会重新获取数据表字段信息。
字段缓存保存在Runtime/Data/_fields/ 目录下面,缓存机制是每个模型对应一个字段缓存文件(注意:并非每个数据表对应一个字段缓存文件),命名格式是:
数据库名.模型名(小写).php
例如:
demo.user.php // User模型生成的字段缓存文件
demo.article.php // Article模型生成的字段缓存文件
字段缓存包括数据表的字段信息、主键字段和是否自动增长,如果开启字段类型验证的话还包括字段类型信息等等,无论是用M方法还是D方法,或者用原生的实例化模型类一般情况下只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。
可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存,如果在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文件中增加如下配置:
// 关闭字段缓存
'DB_FIELDS_CACHE'=>false
注意:调试模式下面由于考虑到数据结构可能会经常变动,所以默认是关闭字段缓存的。
如果需要显式获取当前数据表的字段信息,可以使用模型类的getDbFields方法来获取当前数据对象的全部字段信息,例如:
$User = M('User');
$fields = $User->getDbFields();
如果你在部署模式下面修改了数据表的字段信息,可能需要清空Data/_fields目录下面的缓存文件,让系统重新获取更新的数据表字段信息,否则会发生新增的字段无法写入数据库的问题。
如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age');
protected $pk = 'id';
}
pk属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义。
除了可以设置数据表的字段之外,我们还可以定义字段的类型,用于某些验证环节。例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age',
'_type'=>array('id'=>'bigint','username'=>'varchar','email'=>'varchar','age'=>'int')
);
}
6. java如何将1个list存入缓存中并在缓存在修改数据
publicclassTest2{
publicstaticvoidmain(String[]args){
try{
List<String>list=newArrayList<>();
//模拟传过来的值
inti=0;
while(true){
Longtime=newDate().getTime();
//将当前时间与值拼接成字符串保存到list
list.add("value"+i+","+time);
//调用处理方法
processing(list);
i++;
//模拟每次传入的时间长度
Thread.sleep(3000);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidprocessing(List<String>list){
//第一个存入的值
Stringsrc1=list.get(0);
//最后一个存入的值
Stringsrc2=list.get(list.size()-1);
//通过转换成数组
String[]c1=src1.split(",");
String[]c2=src2.split(",");
//拿到第一个存入的时间字符串转换成Long
Longl1=Long.parseLong(c1[1]);
//拿到最新的时间字符串转换成Long
Longl2=Long.parseLong(c2[1]);
//如果大于等于30000毫秒就说明了过了30秒清空
if((l2-l1)>=30000){
list.clear();
}
System.out.println("每次的值"+src2);
System.out.println("是否30秒清空"+(list.size()==0));
}
}
/*******************************第二种方式*************************************/
publicclassTest2{
//定义一个全局变量用于接收时间
privatestaticLongtime=0L;
publicstaticvoidmain(String[]args){
try{
List<String>list=newArrayList<>();
//模拟传过来的值
inti=0;
while(true){
//如果list是在清空状态那么就创建个时间为第一次时间
if(list.size()==0){
time=newDate().getTime();
}
//将字符串保存到list
list.add("value"+i);
//调用处理方法,没次传入一个当前存入对象的时间
processing(list,newDate().getTime());
i++;
//模拟每次传入的时间长度
Thread.sleep(3000);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidprocessing(List<String>list,Longtimes){
//当前时间-第一次存入的时间大于等于30000毫秒
//就是过了30秒执行清空操作
if((times-time)>=30000){
list.clear();
}
for(Stringls:list){
System.out.println("每次的值"+ls);
}
System.out.println("是否30秒清空"+(list.size()==0));
}
}
我没有redis 只能模拟一个 你看下 其实 你就多了一步 从缓存中取值 判断不能 等于 30000毫秒 因为 时间会有所偏差 可能大于 所以 大于等于,你要是觉得 毫秒太长你可以 转换成秒存入 在计算
第二种 的话 你的程序 可能不需要太大改掉
7. java怎么将数据库的数据做缓存,方便查找。
你的数据非常大,那你写入内存会不会比较占资源,为什么不用异步刷新,让它显示不部分再慢慢加载
8. asp.net如何将经常访问的数据库表放入缓存中
如果单是为减小数据库压力建议采用页片断缓存,即缓存页面中部分内容(与数据相关的)。
可以采用Cache类、Session对象和Application对象(后两者很常见,就不多说了)。
而Cache类是提供数据缓存的类,三者类似。
例如要经常读取数据库中一个的内容(销售记录等等)可将其存放一个dataset
首先从数据库读取并填充到一个名为DS的Dateset里(....这个不是楼主的问题就不讨论了)
直接Cache("ds")=DS,则实现了将DataSet“存”到Cache("ds")里。
调用则是
首先定义一个新的Dateset 如 DS1
DS1=Cache("ds")即可
9. 怎么写一个缓存把从数据库中的数据放入缓存中,在页面直接读取缓存中的数据
先定义成结构,把表里的字段存进结构,然后把结构定义成vector,把结构存入vector,也就是缓存了,要的时候取就是了
10. 什么是缓存数据缓存是什么意思
手机缓存数据是手机上的应用程序在使用过程中下载的临时文件,方便下次使用时快速调用,但是如果手机的应用程序的缓存数据过多会占用手机的存储空间。
以iPhone 7手机为例,清除手机的缓存数据操作步骤如下:
1、打开手机上需要清除缓存数据的应用。