利用redis缓存热门数据,分页的一种思路

转载 2016年08月29日 16:14:26

普通分页

一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。

如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。

比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式很难应对。

一种思路

最近想到了另一种思路。

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

相关文章推荐

spring mvc 使用jsr-303 @Valid实现bean的字段验证

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。  此实现与Hibernate ORM 没有任何关系。...

利用redis缓存对 list集合中的数据 进行分页操作(一)

先说 存储的结构:  这里做了两块缓存  绿色是存储索引的缓存  黑色是存数据的缓存 翻页时需要两个参数  向上查询/或向下查询    还一个是   从第二页开始查询时需要一个索引的参数 有了这两...

采用redis缓存数据

reids需要缓存下列5块缓存,在没有什么特殊说明的情况下,超时设置为24小时 这些缓存块包括:有效报价集合、标的详情、当天未成交委托报价集、当天已成交委托报价集、标的自选、前后端pub sub消息格...

在项目中redis做缓存的一些思路

首先,缓存的对象有三种: 1:数据库中单条的的数据(以表名跟id作为key永久保存到redis),在有更新的地方都要更新缓存(不适用于需要经常更新的数据); 2:对于一些不分页,不需要实时(需要多...

REDIS (13) 缓存的穿透,雪崩和热点key

穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层。从而失去缓存的意义。 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键。    ②持久层查询不到就缓存...
  • kkgbn
  • kkgbn
  • 2017-03-06 14:26
  • 1585

如何使用redis缓存加索引处理数据库百万级并发

前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想。准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,...

利用redis缓存热门数据,分页的一种思路

普通分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。 如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。 比如像微博这样的场景,微博下面现在有一个顶次...

redis分页简单实现

简介:实现用户信息的分页查询 1. 实现思路     list链表键存储用户ID,用于分页查询,同时用于查询用户总数,key为personid。     hset用户保存用户详细信息,格式为下: ke...

redis 分页

很多新手对redis 数据库不熟悉,觉得 它的分页无法下手,其实很简单的。以下是我写的类,供参考 d 一、连接数据库(详细代码就不写了) public function __construct() ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)