天天看点

利用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做存储了,也不担心内存的容量问题。

继续阅读