多条件分页查询该如何设计缓存

pang51a 2012-03-10 03:34:55
有没有好的思路可以说下各位大神 我觉得主要是这个缓存的key怎么处理 还有分页
一个严格的查询条件可能只是一个宽松条件的子集
我想是如果以前缓存过这个宽松的条件 我就不用再查数据库 而是利用这个缓存再进一步的利用linq删选结果
但是涉及到分页 我那个宽松的条件可能只是缓存了部分数据 不是全部的

可是如果我把缓存规则定的太死 比如完全按照条件和页数去匹配 我又感觉命中率肯定不高。。。。

...全文
650 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
phoebuswei 2012-03-11
  • 打赏
  • 举报
回复
果以前缓存过这个宽松的条件 我就不用再查数据库 而是利用这个缓存再进一步的利用linq删选结果
但是涉及到分页 我那个宽松的条件可能只是缓存了部分数据 不是全部的
>>>>>>>>>>>>>>>>>>>?>??????????????????????????
这里叫我很迷茫,您说是子集为什么数据不全啊
您要开缓存当然要开最大的
您完全可以规定,分页不查询数据库的,或者10%2不查询
命中率,应该是100的,及我们缓存开最大开销
  • 打赏
  • 举报
回复
你把10万条记录中的1000条缓存,哪怕是很傻瓜化地一条一条地缓存,无论如何其平均命中率也要比这个大的缓存单元高许多许多倍!

更何况你是对查询页面做缓存!

数据缓存就好象给软件做皮肤、搞交互设计一样,是“立竿见影”地对性能产生极端影响的。不是那种花费好多时间研究一大堆理论结果对测试结果的影响很小的技术。你就是要从最终的查询设计出发去直截了当地缓存就行了,不要太繁琐。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pang51a 的回复:]

我在想 这个可能就跟加索引一样 把缓存key值关联到最能细致筛选条件的一个条件上 比如我这有个省市的选择 我就加在这个省市上 第一次把这个市的数据全查出来 以后再碰到这个市的细致条件 就在这个市的结果集上去筛选。。。还得再想想。。那如果他就没选市那个条件呢?
[/Quote]

这是空想。

数据缓存的原则就两条:1. 简单傻瓜化而不要想当然地搞什么“聪明的”分层查询;2. 当真实数据修改时必须尽快(立刻)删除缓存。
  • 打赏
  • 举报
回复
[Quote=引用楼主 pang51a 的回复:]
有没有好的思路可以说下各位大神 我觉得主要是这个缓存的key怎么处理 还有分页
一个严格的查询条件可能只是一个宽松条件的子集
我想是如果以前缓存过这个宽松的条件 我就不用再查数据库 而是利用这个缓存再进一步的利用linq删选结果
但是涉及到分页 我那个宽松的条件可能只是缓存了部分数据 不是全部的

可是如果我把缓存规则定的太死 比如完全按照条件和页数去匹配 我又感觉命中率肯定不高。。……
[/Quote]

命中率不高什么意思呢?你是不是认为假设把10万条记录放到内存里那么命中率就“高”了?如果是,那么你说的所谓命中率完全就不是真正的命中率了!这就是我对你所谓的“缓存了全部的数据”的看法,你的命中率概念完全是相反的。

假设我们只是缓存一条数据,而不是10万条数据,这一条的命中率是很高的。因为你想,假设你把10万条记录一起作为一个缓存单元,那么这个缓存单元的命中率是不是就完全等于最低点的一条记录的命中率?而你把10万条记录中的1000条缓存,无论如何其平均命中率要比这个大的缓存单元高许多许多倍!

一个分页查询,你可以用其sql语句作为缓存的key。即时是这个页面中数据在其它的查询缓存中有重复,也没有关系。也比你一下在缓存什么几万条数据命中率高多了。更何况.net的cache有很高的智慧,会自动根据内存情况自动清理内存占用,所以根本不用担心不同的数据缓存中有重复的数据。关键是使用相同的key查询时根本不用再次重复查询,这就够了。
pang51a 2012-03-10
  • 打赏
  • 举报
回复
我在想 这个可能就跟加索引一样 把缓存key值关联到最能细致筛选条件的一个条件上 比如我这有个省市的选择 我就加在这个省市上 第一次把这个市的数据全查出来 以后再碰到这个市的细致条件 就在这个市的结果集上去筛选。。。还得再想想。。那如果他就没选市那个条件呢?
pang51a 2012-03-10
  • 打赏
  • 举报
回复
那像京东 或者淘宝他们是怎么做的呢?一般他们的筛选条件都很复杂 他们是怎么做的呢?一点缓存没有吗?还是他们的 缓存就没在程序这一层设计?
bdmh 2012-03-10
  • 打赏
  • 举报
回复
我觉得何时需要获取新数据,合适只是在内存中筛选,你应该是知道的,所以你就定义两种操作,如果需要新数据,你就分页取新数据,并把新数据合并到内存,需要过滤时,就只操作内存

如果你的过滤都是基于全部数据的话,那你这缓存也就没意义了,第一次就需要把全部数据放到内存
《计算机操作系统》可作为计算机硬件和软件以及计算机通信专业的本科生教材,也可作为从事计算机及通信工作的相关科技人员的参考书。 目录 第一章 操作系统引论 1.1 操作系统的目标和作用 1 1.1.1 操作系统的目标 1 1.1.2 操作系统的作用 2 1.1.3 推动操作系统发展的主要动力 4 1.2 操作系统的发展过程 5 1.2.1 无操作系统的计算机系统 5 1.2.2 单道批处理系统 6 1.2.3 多道批处理系统 7 1.2.4 分时系统 9 1.2.5 实时系统 11 1.2.6 微机操作系统的发展 12 1.3 操作系统的基本特性 14 1.3.1 并发性 14 1.3.2 共享性 15 1.3.3 虚拟技术 16 1.3.4 异步性 17 1.4 操作系统的主要功能 18 1.4.1 处理机管理功能 18 1.4.2 存储器管理功能 19 1.4.3 设备管理功能 21 1.4.4 文件管理功能 21 1.4.5 操作系统与用户之间的接口 22 1.5 OS结构设计 24 1.5.1 传统的操作系统结构 24 1.5.2 客户/服务器模式 26 1.5.3 面向对象的程序设计 27 1.5.4 微内核OS结构 29 习题 33 第二章 进 程 管 理 2.1 进程的基本概念 34 2.1.1 程序的顺序执行及其特征 34 2.1.2 前趋图 35 2.1.3 程序的并发执行及其特征 36 2.1.4 进程的特征与状态 37 2.1.5 进程控制块 41 2.2 进程控制 43 2.2.1 进程的创建 43 2.2.2 进程的终止 45 2.2.3 进程的阻塞与唤醒 46 2.2.4 进程的挂起与激活 47 2.3 进程同步 47 2.3.1 进程同步的基本概念 47 2.3.2 信号量机制 50 2.3.3 信号量的应用 53 2.3.4 管程机制 55 2.4 经典进程的同步问题 58 2.4.1 生产者—消费者问题 58 2.4.2 哲学家进餐问题 61 2.4.3 读者—写者问题 63 2.5 进程通信 65 2.5.1 进程通信的类型 65 2.5.2 消息传递通信的实现方法 66 2.5.3 消息传递系统实现中的若干问题 68 2.5.4 消息缓冲队列通信机制 69 2.6 线程 71 2.6.1 线程的基本概念 72 2.6.2 线程间的同步和通信 75 2.6.3 线程的实现方式 77 2.6.4 线程的实现 78 习题 81 第三章 处理机调度与死锁 3.1 处理机调度的层次 84 3.1.1 高级调度 84 3.1.2 低级调度 86 3.1.3 中级调度 87 3.2 调度队列模型和调度准则 88 3.2.1 调度队列模型 88 3.2.2 选择调度方式和调度算法的若干准则 90 3.3 调度算法 91 3.3.1 先来先服务和短作业(进程)优先调度算法 91 3.3.2 高优先权优先调度算法 93 3.3.3 基于时间片的轮转调度算法 95 3.4 实时调度 97 3.4.1 实现实时调度的基本条件 97 3.4.2 实时调度算法的分类 99 3.4.3 常用的几种实时调度算法 100 3.5 产生死锁的原因和必要条件 103 3.5.1 产生死锁的原因 103 3.5.2 产生死锁的必要条件 105 3.5.3 处理死锁的基本方法 105 3.6 预防死锁的方法 106 3.6.1 预防死锁 106 3.6.2 系统安全状态 107 3.6.3 利用银行家算法避免死锁 108 3.7 死锁的检测与解除 111 3.7.1 死锁的检测 111 3.7.2 死锁的解除 113 习题 114 第四章 存 储 器 管 理 4.1 存储器的层次结构 116 4.1.1 多级存储器结构 116 4.1.2 主存储器与寄存器 117 4.1.3 高速缓存和磁盘缓存 117 4.2 程序的装入和链接 118 4.2.1 程序的装入 118 4.2.2 程序的链接 120 4.3 连续分配方式 121 4.3.1 单一连续分配 121 4.3.2 固定分区分配 122 4.3.3 动态分区分配 123 4.3.4 伙伴系统 126 4.3.5 哈希算法 126 4.3.6 可重定位分区分配 127 4.3.7 对换 129 4.4 基本分页存储管理方式 130 4.4.1 页面与页表 130 4.4.2 地址变换机构 131 4.4.3 两级和多级页表 133 4.5 基本分段存储管理方

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧