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

社区分页缓存数据

发布时间: 2022-05-19 08:32:19

A. 怎么用memcache缓存搜索分页数据库

void CMultiThread7Dlg::OnSum()
{
m_pCalculateThread=
(CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));

Sleep(500);

m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
}

B. 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查询由原来的分页查询变成了不分页查询,缓存失效后,系统的处理能力较之前会有下降,尤其是对于大表.

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

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

D. asp分页设计中,查询结果缓存如何设计

对于WEB地理信息系统来说,一个需要特别强调的是系统的响应速度,有许多方法来提高系统的速度,我们今天要提到的是利用缓存来提高系统的速度。例如在执行查询时,如果前后多次所查询的得到结果都相同,我们可以将第一次查询的结果放到内存中缓存中去,第二或第二次调用时,我们可以直接返回缓存的信息,节省了从地图服务器中查询的时间,从而提高了响应的效率。ASP.NET提供了强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。缓存是由Cache类实现的,缓存程序是每个应用程序专用的。缓存生存期依赖于应用程序的生存期,重新启动应用程序后,将重新创建Cache对象。设计Cache类是为了便于使用。可以将项放置在Cache中,并在以后使用简单的键/值对来检索这些项。Cache类提供了强大的功能,允许自定义如何缓存项以及将他们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也成为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。当执行清理时,可以只是Cache给予某些项比其他项更高的优先级。若要指示项的重要性,可以在使用Add或Insert方法添加项时,指定一个CacheItemPritory枚举值。当使用Add或Insert方法将项添加到缓存时,您还可以建立项的过期策略。可以通过使用DateTime值指定项的确切过期时间(绝对过期时间),来定义项的生存期。也可以使用TimeSpan值指定一个弹性过期时间,弹性过期时间允许根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,便将它从缓存中移除。试图检索它的值的行为将返回null,除非该项被重新添加到缓存中。此为,ASP.NET允许根据外部文件、目录(文件依赖项)或另一个缓存项(键依赖项)来定义缓存项的有效性。如果具有关联依赖项的项发生更改,缓存项便会失效并从缓存中移除。可以使用该技术在项的数据源更改时从缓存中移除这些项。以下例子代码如何在查询时利用ASP.NET提供的缓存机制。首先在GetCallbackResult 方法的最前面加入如下代码,判断是否存在某一缓存,如果存在(第二次调用相同的操作),则直接将缓存结果返回,如果不存在(首次调用),则不影响程序的执行:// 判断是否有相应的缓存信息 string cachedResponse = Cache[callbackArg] as string; if (cachedResponse != null) { return cachedResponse; }然后在GetCallbackResult方法返回response字符串之前,加入如下代码,用于将查询结果保存到缓存中:TimeSpan cacheDuration = new TimeSpan(0, 0, 999999); Cache.Add(callbackArg, response, null, DateTime.Now.Add(cacheDuration), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);上述代码通过Cache的Add方法将查询结果缓存起来。该方法的第一个参数是用于引用该项的缓存键;第二个参数是要添加到缓存的项;第三个参数表示文件依赖项或缓存键依赖项,当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数为空引用;第四个参数是所添加对象将过期并从缓存中移除的时间。如果使用可调过期,则该参数必须为NoAbsoluteExpiration;第五个参数表示最后一次访问所添加对象时与该对象过期时之间的时间间隔。如果该值等效于20分钟,则该对象在最后一次被访问20分钟之后将过期并从缓存中移除。若果使用绝对过期,则该参数必须为NoSlidingExpiration;第六个参数是对象的相对的优先级,由CacheItemPriority枚举表示。缓存在退出对象时使用该值;具有较低优先级的对象在具有较高优先级的对象之前被从缓存移除;最后一个参数表示从缓存中移除对象时所调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。

E. 缓存分页 和 查询分页哪个更好

查询分页么就是每次点下一页就要查一次数据库,缓存分页么就是第一次就把所有数据拿进缓存,优点和缺点都很明显吧。。。。

F. 如何将分页数据 放入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做存储了,也不担心内存的容量问题。

G. 关于datalist分页缓存

分页的一个目的就是每次加载一部分数据,你一下在把数据都读到内存中分页的优势不久没有了吗,如果数据量小当然可以或许放在缓存中比每次查询还要快,但数据量要大你的服务器就承受不住了

H. thinkphp框架,数据动态缓存后,读取缓存数据时分页怎么办

不确定正确性,但是确实可行,读取缓存后赋值到数组,通过array_slice函数处理,如:
$blog = S('blogname'); //赋值
$count = count($blog); //条数统计
$page = new Page($count,12); //实例化page类
$this -> Blog = array_slice($blog,$page->firstRow,$page->listRows); //分配到模板
$this -> page = $page -> show();
$this -> display();

I. 缓存分页合适吗

一种是使用本地缓存、另一种是分级缓存。这里谈一谈原设计的缺陷,分级缓存中我提出来通过确定两个不同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[]{});缓存分页合适吗

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

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