文档章节

利用MongoDb进行分页方案

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:17
字数 631
阅读 60
收藏 1

MongoDb的一个应用方案,具体场景是,框架是 Play1.x后端+Delphi前端,查询是数据过多,所以有用缓存减小网络压力,前端利用类似瀑布流的技术拉取数据,后端一次查出数据,分页返回。

这里提出两个方案,具体如下: 

一、分析 

综合上次开会,在缓存方面有两种意见,即是否将sessionid作为计算缓存hashkey的条件之一。其实这两种意见可以将此次的服务端的缓存分为两种作用。 

第一种,只做数据的反向缓冲,有减小网络压力之用。将数据从数据库取出,分批取回客户端。这种情况就是用sessionid计算hashkey的情况。如果只做反向的缓冲,则不须考虑数据的时效性。因为用缓冲与不用缓冲的区别只是在于是否一次加载完成。

另一种,就是不计算sessionid。这时将起反向缓冲与数据缓存作用,同时减小网络与数据库的。多个用户的多个请求只要请求参数一致,即hashkey一致,则取同一缓存。 

二、方案 

在后端,采用mongoDB作为缓存,将第一次请求结果缓存下来。缓存的地方在play的Controller层中,利用反射取值,这样可减少代码量。在数据返回时,带有livetime,可让客户端知道数据是否过期。 针对分析中的两种情况,提出下面两种方案: 

 A、 针对缓冲

图片1

缓存策略: 使用 url + requestParam + sessionid + timestamp 做hashkey。根据具体需求,将数据分成N段。每次请求取最前一段的数据,取完后缓存删除此段,当数据超过livetime点之后MongoDB也会自动删除此hashkey的所有数据。   

B、 针对缓冲加缓存

图片2

缓存策略: 

1、使用 url + requestParam 做hashkey 建立一个列表,将这次查询结果加入列表前面中,并设置每个数据项的成活时间点livetime与有效保鲜时间点activetime。 

2、返回hashkey、livetime和nextpage。第二次查询时可以用三个参数拉取数据。如果nextpage为空表示已经没有数据。 

3、如果第二个用户过来,同样的hashkey,会读取相应列表中最后一项的数据,计算是否在其activetime时间点前,如果在,则返回hashkey、livetime、nextpage。如果没有则重复1。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
MongoDB 使用Skip和limit分页

关于MongoDB 数据分页和排序 limit,skip用户的一些基础语句,介绍MongoDB 数据分页和排序实例方法。 使用Skip和limit可以如下做数据分页: Code:   page1 = db.things.find().limit(20)  ...

mysoftsky
2014/08/26
0
1
Docker使用supervisor启动MongoDB

Docker的学习中不断的进行完善、不断的学习,把一些原有的方法进行优化。 镜像下载地址: 旧方案地址:如有不成熟没有上传 新方案地址:https://github.com/aarongo/centos-mongodb-superviso...

aarongo
2014/11/26
0
0
MongoDB系列三(Spring集成方案).

一、前言 MongoDB是最为流行的开源文档数据库之一。Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB: 通过注解实现对象-文档映射; 使用MongoTemplate实现基于模板的数据库访问...

jmcui
03/31
0
0
MongoDB核心贡献者:不是MongoDB不行,而是你不懂!

近期MongoDB在Hack News上是频繁中枪。许多人更是声称恨上了MongoDB,David mytton就在他的博客中揭露了MongoDB许多现存问题。然而恨的人有之偏爱的也同样很多,作为回击:Russell Smith带来...

山海经
2014/07/27
0
0
55最佳实践系列:MongoDB最佳实践

@郑昀汇总 创建日期:2012/9 Application Design: 1)如果发现query没使用你预期的索引,请用hint强制使用指定索引 主站商品中心所使用的文档字段很多,各种索引建得也不少。在沙创排查慢查...

旁观者-郑昀
2013/02/08
0
1

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部