分页系统的设计与实现

最近要做一个分页系统,页数可能有多,数据有点大,如果每次都去数据库重新查找数据,虽然是后台,但是也会对数据库和编辑的体验造成很大的影响,比较好的办法就是添加缓存,可以强制刷新获取最新数据,也可以从缓存中获取几分钟之前的数据。

所有要呈现的数据从数据库里面检索出来之后是一个大数组,然后对数组进行整理,形成按用户成仙的数组格式,考虑到效率,在缓存中保存整理之后的数据比较好,也就是以用户的id为下表的数组。

如何保存,有三种方案。

一个是将整个大数组进行序列化打包,然后存储字符串,比较简单方便,真正读取数据的时候,先获取全部的,然后根据下表显示指定的数据。而且还有一个担心,就是redis的字符串最大长度是512mb,在用户为1百万的时候,每个用户只有500+字节,显然不够用,虽然1百万用户的情况比较少,但是不可不防。

第二是将数组进行拆分,以用户的id为单元存储,或者是插入的时间+id进行存储,然后每次显示的时候根据uid或者时间时间进行展示。

还有第三种办法,就是按页进行保存,优点是高效,直接获取全部所有的想要展示的,缺点是一旦数据更新,需要更新全部数据,用不好,反而效率不高,这个时候,需要优雅降级。

第一个降级的办法是,一定时间内更新全部的页数据,也是有一定压力的,而且,首页数据就已经不是实时的了。

其实还有另外一种降级的办法,就是刷增量,每次更新page之后,保存一个最新的数据插入时间戳,用户访问的时候,查询数据库里面时间戳大于这个时间点的数据,整理,表明这些数据是最新的,不在page缓存中的,然后将这些数据作为首页将要呈现的数据,如果不足一页,从page缓存中的首页得到一页的数据,抽调其中一部分,补充,作为新的首页数据,然后配合定时刷新全部page页数据的部分,这样在保持效率的同时,保证了第一页,最重要 的部分始终是最新的数据,当然,第二页的数据就可能面临刷新时间间隔,不同步的问题。

 

Leave a comment

Your email address will not be published.

*