当前位置:首页 » 硬盘大全 » aj分页缓存怎么用
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

aj分页缓存怎么用

发布时间: 2022-08-09 05:41:45

1. ehcache怎么实现从缓存中分页取数据

ehcache初始化单个cache的时候会创建diskstore,diskstore的目录位置可以自己去设置,在Cache构造函数中可以指定;这样Cache的initialise方法会自动读取diskstore目录下对应的缓存的data和index文件然后加载到系统中,通过cache的get方法就能读...

2. 关于在jfinal中分页是怎么处理

尽瞎扯,我只听说把所有结果集放入缓存,然后分页查询结果集,对list截取就OK了,方法:subList,详情度娘

3. 怎么样设置缓存和虚拟内存

Windows 9x的虚拟内存分页位置,其实就是保存在C盘根目录下的一个虚拟内存文件(也称为交换文件)Win386.swp,它的存放位置可以是任何一个分区,如果系统盘C容量有限,我们可以把Win386.swp调到别的分区中,方法是在记事本中打开System.ini(C:\Windows下)文件,在[386Enh]小节中,将“PagingDrive=C:WindowsWin386.swp”,改为其他分区的路径,如将交换文件放在D:中,则改为“PagingDrive=D:Win386.swp”,如没有上述语句可以直接键入即可。
而对于使用Windows 2000和Windows XP的,可以选择“控制面板→系统→高级→性能”中的“设置→高级→更改”,打开虚拟内存设置窗口,在驱动器[卷标]中默认选择的是系统所在的分区,如果想更改到其他分区中,首先要把原先的分区设置为无分页文件,然后再选择其他分区。
或者,WinXP一般要求物理内存在256M以上。如果你喜欢玩大型3D游戏,而内存(包括显存)又不够大,系统会经常提示说虚拟内存不够,系统会自动调整(虚拟内存设置为系统管理)。
如果你的硬盘空间够大,你也可以自己设置虚拟内存,具体步骤如下:右键单击“我的电脑”→属性→高级→性能 设置→高级→虚拟内存 更改→选择虚拟内存(页面文件)存放的分区→自定义大小→确定最大值和最小值→设置。一般来说,虚拟内存为物理内存的1.5倍,稍大一点也可以,如果你不想虚拟内存频繁改动,可以将最大值和最小值设置为一样

虚拟内存设置- -

一, 什么是虚拟内存?

Windows操作系统用虚拟内存来动态管理运行时的交换文件。
为了提供比实际物理内存还多的内存容量以供使用,Windows操作系统
占用了硬盘上的 一部分
空间作为虚拟内存。当CPU有要求时,首先会读取内存中的资料。当内存容量
不够用时,Windows就会将需要暂时储存的数据写入硬盘。所以,计算机的
内存大小等于实际物理内存容量加上“分页文件”(就是交换文件)的大小。
如果需要的话,“分页文件”会动用硬盘上所有可以使用的空间。如果条
件允许,你应尽可能应用这种功能设置。当然,如果你能自己动手设置的话,
会取得比Windows操作系统自动设置更好的效果。

二, 计算虚拟内存

在你设置虚拟内存大小之前,你会想到应该怎样进行“实际设置”。有人
推荐应用一个常规公式:物理内存数*2.5,当然这是不对的。应用这样的公式,
对于拥有16MB内存的用户就应该设置40MB;对于拥有128MB内存的用户来说则应
设置320MB。很显然,对于拥有较少内存的用户来说,他需要比拥有内存容量较
大的用户设置更多的虚拟内存。要想看你的机器中内存工作的情况,应先
安装“系统管理器”。打开“控制面版”窗口,点击“添加/删除程序”,选择
“Windows安装程序”,从中选择“系统工具”,在“系统监视器”项前打勾,
并安装它。运行“系统监视器”(开始-程序-附件-系统工具-系统监视器),
选择“编辑”,然后选择“添加项目”里的“内存管理程序”,在右边的
窗口里添加“正在使用交换文件”和“交换文件大小”。这时“系统监视器”就会
显示轨迹图示。此外,你也可以通过“编辑”项里的“删除项目”删去不需要的项目。
点击“选项”里的“图表”并设置“更新间隔”,可以根据你打算监
视时间的长短来选择。一定要确认点击“文件”选择“开始记录”,并且保存
记录日志(sysmon.log)到你的硬盘上,以便于以后参考使用。

如果想获得更好的轨迹来参考,那就需要做一些能使你的机器处于“重压”
下的任务,例如玩游戏,或是运行一些大程序。在运行一些极限时的Demo或是玩
[虚幻]游戏时,能帮助你确定所需要的“虚拟内存”大小。当然,这种“重压”
测试是在计算机可以承认的情况下进行的,从测试结果表明处理图形的能力
与“交换文件大小”有关。设置完“系统监视器”后,你就可以参考“记录日志”
了。用“记事本”打开“sysmon.log”文件。其中文件的大小是以字节来
表示的,我们就用1048576(1024*1024)来转换。125829120/1048576=120MB。
你应该取计算的最大值,一般与计算值的差距不超过5MB。

三,设置虚拟内存

基于测试结果,现在设置虚拟内存一般有两种不同的方法。一种方法是创建
一个“长期固定” 的转换文件,另一个是创建“半长期” 的转换文件。创建“半长期”
转换文件的好处在于一旦有必要,Windows操作系统可以扩大转换文件的大小,
这将避免“内存不足”的错误。在应用完毕后,Windows操作系统又会将转换文件
的大小恢复到最初(也是最小)的大小。如果你想创建“长期固定” 的转换文件,
则设置数值应该比计算数值多留30-50MB空间,并将“最大值和最小值” 的标准
设为150MB。特别是在有额外虚拟内存需求时,“长期固定”的转换文件更能
防止意外情况的发生。其实,通常而言,硬盘上有150MB的虚拟
内存应该可以应付额外的内存空间需求了。

一旦确定了要选择的方法,请按以下步骤进行:

1.整理你的硬盘,然后从新启动;

2.右键点击“我的电脑”,选择“属性”项

3.选择“性能”项;

4.选择“虚拟内存”项,在弹出的窗口中选择“用户自己指定虚拟内存设置”
(下面所谓的A或B取决于你选择“长期固定”或“半长期”的转换文件形式);

A如果选择“长期固定”的转换文件,那么请根据上面说过的方法来设定各数值;

B如果你选择“半长期”的转换文件,就如上述设置(当然具体数值由计算数值来决定)。
其中最大值就是你硬盘上的所有空余空间;

5.从新启动使修改设置生效。

注意:你也可以通过文件“system.ini”来设定虚拟内存的大小。
点击“开始”弹出窗口的“运行”项,键入“system.ini”后敲击回车键。
在[3 8 6 E n h]下用“MinPagingFileSize,MaxPagingFileSize & PagingDrive=”
来设置放置转换文件的硬盘盘符以及转换文件的最大和最小值。这里的数值是用KB为
单位来计算的,请用MB*1024的方法来转换。

四,进一步完善交换文件

在设置完虚拟内存以后,还可以进一步完善它。交换文件最好放置在硬盘的边缘,
可惜Windows操作系统自带的磁盘清理程序并不支持,但你可以用类似
于Norton Speed Disk 这样的磁盘清理工具。我建议你不要把交换文件放到
不同的分区里,因为这样硬盘磁头会不断的移动,从而浪费时间和硬盘的本身。相
反,我建议你要把交换文件放到最常用的分区里,也就是说放到安装了Windows操作
系统“C:/”里面去。在设定虚拟内存时,改变硬盘设置就要改变交换文件设置。

五,虚拟缓存——Vcache

注意:以下的设置在Windows 95操作系统里面得到的效果会比在Windows 98里
的效果要好,所以如果你使用Windows 98系统,就可以不必设置“最大和最小
缓存文件(Min & MaxCacheFile)”的大小。

点击“开始”弹出窗口里的“运行”项,键入“system.ini”,然后按回车键。
从文件中寻找“[vcache]”项,并在标题下面键入以下信息:

MinFileCache=16384

MaxFileCache=16384

你可以使用“剪切”(ctrl+L),然后“粘贴”(ctrl+V)完成。其中
“最小和最大缓存文件(Min & MaxCacheFile)”取决于物理内存的大小,如果你有
64MB内存,应该设置虚拟缓存为物理内存的?大小。如果有128MB的内存,
就应将数值加倍。如果想达到最好的效果,还需要对其中的一些数值进行实验。
现在,请将下面内容加入到“最小和最大缓存文件”设置的下面。

Chunksize=512

NameCache=2048

DirectoryCache=48

以上设置都意味着什么呢?

1.“Min & MaxCacheFile”设置了系统中最小和最大的磁盘缓存。这种设置
将会直接影响到物理内存的实际应用大小,设置值越高,就会有越少的内存被应
用到转换用途上去。

2.“Chunksize”设置会直接影响到工作效果。磁盘缓存是内存里面的一个
独立的模块;它分有很多“块”(Chunk),如果块尺寸(Chunksize)设置过小就一
定会增加占用的块数。如果块尺寸设置的太大就会浪费很多资源。所以,最好
的取值是不大不小。如果必要,你可以用乘以512(或1024,2048等)的方法改变数值。

3.“NameCache”设定了一个Windows 系统所能跟踪的文件数上限。

4.“DirectoryCache”设定了一个Windows系统所能跟踪的目录数上限

此外,还有另一种方法来优化内存。但在使用之前,你必须在计算机上
安装“Windows scripting”程序。你可以在控制面版里选择“添加/删除程序”,然
后选择Windows安装程序这一项。

经过以上的设置以后,你的虚拟内存在各方面都会提高很多。
你将会发现你的系统有了明显的变化:比如硬盘驱动器不再频繁存取了等等。
既然完善你的系统虚拟内存设置将会使你获得巨大的收益。
那么,请快加入到虚拟内存的行列中来吧。

4. spring redis cacheable 怎么做分页

普通分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。 如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。 比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式

5. java 缓存分页

可以查询的时候就查五条呀,这样不用每次查出所有的,而是根据当前是第几页来查询当前的几条。

6. php 分页查询怎么redis缓存

对于有分页条件的缓存,我们也可以按照不同的分页条件来缓存多个key,比如分页查询产品列表,page=1&limit=10和page=1&limit=5这两次请求可以这样缓存查询结果

proctList:page:1:limit:10

proctList:page:1:limit:5
这个是一种常见方案,但是存在着一些问题:

缓存的value存在冗余,proctList:page:1:limit:10缓存的内容其实是包括了proctList:page:1:limit:5中的内容(缓存两个key的时候,数据未发生变化的情况下)

仅仅是改变了查询条件的分页条件,就会导致缓存未命中,降低了缓存的命中率

为了保证数据一致性,需要清理缓存的时候,很难处理,redis的keys命令对性能影响很大,会导致redis很大的延迟,生产环境一般来说禁止该命令。自己手动拼缓存key,你可能根本不知道拼到哪一个page为止。

放弃数据一致性,通过设置失效时间来自动失效,可能会出现查询第一页命中了缓存,查询第二页的时候未命中缓存,但此时数据已经发生了改变,导致第二页查询返回的和第一页相同的结果。
以上,在分页条件下这样使用常规方案总感觉有诸多困扰,诸多麻烦,那是不是就应该放弃使用缓存?
基于SortedSet的分页查询缓存方案
首先想到的解决方法是使用@see ListOperations<K, V>不再根据分页条件使用多个key,而是使用一个key,也不分页将全部的数据缓存到redis中,然后按照分页条件使用range(key,start,limit)获取分页的结果,这个会导致一个问题,当缓存失效时,并发的写缓存会导致出现重复数据
所以想到通过使用set来处理并发时的重复数据,@see ZSetOperations<K, V>
代码逻辑如下:

range(key,start,limit)按照分页条件获取缓存,命中则直接返回

缓存未命中,查询(没有分页条件)数据库或是调用(没有分页)底层接口

add(key,valueScoreMap<value,score>)写入缓存,expire设置缓存时间

当需要清理缓存时,直接删除key,如果是因为数据新增和删除,可以add(key,value,score)或remove(key,value)

redis中会按照score分值升序排列map中的数据,一般的,score分值是sql语句的order by filedA的filedA的值,这样能保证数据一致性
但是这种方式也存在一定问题:

这个key缓存的value确实是热数据,但可能只有少数数据被频繁使用其余的可能根本就未被使用,比如数据有100页,实际可能只会用到前10页,这也会导致缓存空间的浪费,如果使用了redis虚拟内存,也会有一定影响

sql查询由原来的分页查询变成了不分页查询,缓存失效后,系统的处理能力较之前会有下降,尤其是对于大表.

7. redis 怎么缓存用户列表,做到可以分页展示

redis是类似key_value形式的快速缓存服务。类型较丰富,可以保存对象、列表等,支持的操作也很丰富,属于内存数据库,且可以把内存中的数据及时或定时的写入到磁盘。可设置过期自动删除,速度快,易于使用。

8. 虚拟内存设置在E盘,但在E盘看不到分页文件或者缓存

缓存默认是隐藏属性的。要想看见打开电脑——工具——文件夹选项——选中“显示所有文件和文件夹”,取消“隐藏受保护的操作系统文件”,就可以了。

9. 如何将分页数据 放入redis

普通分页
一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。
如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。
比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式很难应对。
一种思路
最近想到了另一种思路。
数据以ID为key缓存到Redis里;
把数据ID和排序打分存到Redis的skip list,即zset里;
当查找数据时,先从Redis里的skip list取出对应的分页数据,得到ID列表。
用multi get从redis上一次性把ID列表里的所有数据都取出来。如果有缺少某些ID的数据,再从数据库里查找,再一块返回给用户,并把查出来的数据按ID缓存到Redis里。
在最后一步,可以有一些小技巧:
比如在缺少一些ID数据的情况下,先直接返回给用户,然后前端再用ajax请求缺少的ID的数据,再动态刷新。

还有一些可能用Lua脚本合并操作的优化,不过考虑到Lua脚本比较慢,可能要仔细测试。
如果是利用Lua脚本的话,可以在一个请求里完成下面的操作:
查找某页的所有文章,返回已缓存的文章的ID及内容,还有不在缓存里的文章的ID列表。
其它的一些东东:
Lua是支持LRU模式的,即像Memcached一样工作。但是貌似没有见到有人这样用,很是奇怪。
可能是用redis早就准备好把redis做存储了,也不担心内存的容量问题。

10. 缓存分页合适吗

一种是使用本地缓存、另一种是分级缓存。这里谈一谈原设计的缺陷,分级缓存中我提出来通过确定两个不同size的缓存块来缓存两种级别的数据,这里带来一些问题:size的大小难以确定、为了避免边界问题大缓存数据包含了小缓存数据这就带来了缓存数据的冗余(这背离了我们设计的初衷)。针对这些问题我们又在原有基础上结合了应用场景的特殊性修改分级缓存为分页缓存(因为对数据列表的访问往往都是伴随分页需求的),将数据库中原始数据中较常使用部分按照固定大小的页进行缓存,服务端根据客户端分页的数据请求到相应的缓存页内查找数据进行填充。采用分页缓存一方面解决了缓存数据冗余的问题,也不用关注分级的边界,虽然相比分级缓存,分页的内容要零散一些,但是总体上而言灵活性要更高。这里谈谈为什么采用固定大小页进行缓存而不是按照客户端分页请求来缓存结果?如果服务端根据客户端分页请求进行缓存这种耦合关系会导致缓存命中率的下、降性能降低,特别是多类型客户端就更糟糕了。按照固定大小页进行缓存类似与MVC模式中将处理逻辑与显示逻辑解耦的思想,服务端的缓存不要依赖客户端,一方面提高了缓存命中率同时也为缓存清理提供了遍历。 下面是我使用IL动态生成的一个Demo反编译后的代码(这里针对了同时启用本地缓存和分页缓存的情况,还支持分页缓存无本地缓存、仅进行memcache缓存,这里就不加赘述了),可读性不高不想看直接pass吧。 C#代码 public override ListObject GetList(int num5, int num6, int num1, int num4) { ListObject local; int num = num1; int num2 = num4; int num3 = ((num1 - 1) * num4) % 100; num1 = (((num1 - 1) * num4) / 100) + 1;//计算缓存页对应的页码和页大小 num4 = 100; if (num1 > 10)//不在缓存页内直接进行数据库查询 { return base.GetList(num5, num6, num, num2); } ListObject obj3 = new ListObject(); do { string str = string.Concat(new object[] { "DemoCachekeyName", "|", num5, "|", num6, "|", num1, "|", num4 });//根据客户端分页请求计算出对应的cachekey local = CacheManager.get_Instance().GetLocal(str) as ListObject;//LocalCache的访问 if (local == null) { DateTime time; local = CacheManager.get_Instance().Get(str) as ListObject;//访问memcache if (local == null) { local = base.GetList(num5, num6, num1, num4); if (local != null) { time = DateTime.Now.AddSeconds(3600.0); CacheManager.get_Instance().Set(str, local, time); } } if (local != null) { time = DateTime.Now.AddSeconds(100.0); CacheManager.get_Instance().SetLocal(str, local, time); } } num1++; } while (((num1 (obj3, num2, num3, local));//填充结果集 if (obj3.totalCount == 0) { return null; } return obj3; } public override ListObject GetList(int num5, int num6, int num1, int num4){ ListObject local; int num = num1; int num2 = num4; int num3 = ((num1 - 1) * num4) % 100; num1 = (((num1 - 1) * num4) / 100) + 1;//计算缓存页对应的页码和页大小 num4 = 100; if (num1 > 10)//不在缓存页内直接进行数据库查询 { return base.GetList(num5, num6, num, num2); } ListObject obj3 = new ListObject(); do { string str = string.Concat(new object[] { "DemoCachekeyName", "|", num5, "|", num6, "|", num1, "|", num4 });//根据客户端分页请求计算出对应的cachekey local = CacheManager.get_Instance().GetLocal(str) as ListObject;//LocalCache的访问 if (local == null) { DateTime time; local = CacheManager.get_Instance().Get(str) as ListObject;//访问memcache if (local == null) { local = base.GetList(num5, num6, num1, num4); if (local != null) { time = DateTime.Now.AddSeconds(3600.0); CacheManager.get_Instance().Set(str, local, time); } } if (local != null) { time = DateTime.Now.AddSeconds(100.0); CacheManager.get_Instance().SetLocal(str, local, time); } } num1++; } while (((num1 (obj3, num2, num3, local));//填充结果集 if (obj3.totalCount == 0) { return null; } return obj3;}(下次再完善这里的IL代码的流程图,一直想在缓存结果中再织入进一些过滤操作思前想后没想到如何在不污染原有接口的前提下实现,正在努力中...) PS:关于IL代码编写:IL代码因为是一种中间代码可读性不是很高,所以进行IL编码其实还是有一点难度的(学习IL编码可以参看《IL Emit学习之旅》一问)。我简单谈谈我在编写IL代码中遇到的一些小问题和自己总结的一些技巧。 1.先编写c#代码的demo,再参照其IL指令,先完成代码框架,在进一步编码。在IL编码前可以先写一个目标生成的动态代码,再通过参照其IL代码进编码,先用IL写出的主体逻辑(即if else、for、while等),再进一步完善。这样逐步编码查错和编码效率都相对高一点。 2.什么时候用“_S”,IL代码中为了缩减指令长度对于某些同一操作提供了两种指令实现,比如无条件跳转有Br、Br_S,有时候使用Br_S跳转目标地址会被截断导致程序出错。我个人觉得可以先在可能出现这类情况的地方使用不带“_S”的指令,待动态代码生成后查看其IL代码,再对指令进行优化。 关于泛型函数的反射: IL代码中常常需要调用函数,这就需要使用到反射(第一次生成动态代码时的反射对整体的性能影响还是可以接受的)。泛型函数的反射还是稍稍有些绕的: C#代码 //目标函数public static bool FillResult(...) MethodInfo fillResult= typeof(PageFormatUtil).GetMethod("FillResult"); fillResult=fillResult.MakeGenericMethod(info.ReturnParameter.ParameterType.GetGenericArguments()[0]);//info.ReturnParameter.ParameterType.GetGenericArguments()获取函数返回结果中泛型参数的信息,MakeGenericMethod之后才是真正完成了泛型函数的反射 //目标函数public static bool FillResult(...)MethodInfo fillResult= typeof(PageFormatUtil).GetMethod("FillResult");fillResult=fillResult.MakeGenericMethod(info.ReturnParameter.ParameterType.GetGenericArguments()[0]);//info.ReturnParameter.ParameterType.GetGenericArguments()获取函数返回结果中泛型参数的信息,MakeGenericMethod之后才是真正完成了泛型函数的反射C#代码 //public class ListObject{...} reflectType=typeof(ListObject).MakeGenericType(info.ReturnParameter.ParameterType.GetGenericArguments()[0]); reflectConstruct=reflectType.GetConstructor(new Type[]{}); //public class ListObject{...}reflectType=typeof(ListObject).MakeGenericType(info.ReturnParameter.ParameterType.GetGenericArguments()[0]);reflectConstruct=reflectType.GetConstructor(new Type[]{});缓存分页合适吗