V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lml12377
V2EX  ›  程序员

请教 memcache 如何加速列表分页?

  •  
  •   lml12377 · 2016-03-01 09:14:38 +08:00 · 1628 次点击
    这是一个创建于 2988 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近刚开始接触和使用 memcached ,我的场景是这样的:

    有一张表,假设叫 post :

    id int(10)
    user_id int(10)
    title varchar(100)
    description varchar(120)
    body text

    假设我把除了 body 以外的字段通过数组序列化存到 key 为 post-xxx ( xxx 为 ID )的记录中,这样当取到 id = 333 的记录时,就可以直接 get('post-333') 然后反序列化来使用。

    这个时候有个问题,即使我把 post 单条记录的字段全部缓存起来,能够加快的也只是我读取这单条记录时的速度,但是表数据越来越多时(暂不考虑分表分库),我的 post 列表分页依旧要到 post 表中去 LIMIT ,我该如何设计一种方式来让 memcached 能够为我的 LIMIT 加速呢?

    之前在没有 cache 时为了一定程度上加速列表分页的读取速度,我是将 text 类型的 body 字段分了张表,因为本身读取列表时也不需要 body , text 字段类型也太重。

    我的设想:

    1 、无法到 memcached 中去 LIMIT ,那我能做的就只有在去表中 LIMIT 时能够更快,那就单独建一张表,就只存放 post 的所有 ID ,跟原先 post 表中的 ID 一一对应 。。。 LIMIT 直接从这张表取,等到要取除其他字段时再到 memcached 里取。

    2 、 memcached 能不能实现类似 LIMIT 的功能?

    刚上手,可能问题有点小白了。。。不知道大家遇到这个问题是怎么实现的,有没有哪些优雅或者高效的方法?

    jasontsai
        1
    jasontsai  
       2016-03-01 09:19:28 +08:00   ❤️ 1
    oschina 上那个也是你吧😄
    admol
        2
    admol  
       2016-03-01 09:31:39 +08:00   ❤️ 1
    mark 跟进
    jedrek
        3
    jedrek  
       2016-03-01 09:40:24 +08:00   ❤️ 1
    要用 memcached 分页,不如用 redis 的 list 结构。再根据得到的 id list 查数据库就好了
    jedrek
        4
    jedrek  
       2016-03-01 09:44:14 +08:00   ❤️ 1
    若不用 memcached 和 redis 。可以 select columns... from table where id < xx order by id limit n
    zktz
        5
    zktz  
       2016-03-01 13:02:41 +08:00   ❤️ 1
    不明白你说的分页 limit ,是要 mysql 的 limit x,y 的效果吗?
    如果你的 xxx id 都是整形。又没有其他检索条件。你可以通过循环+1 拼成连续的 xxx ,再从 memcached 里取数据啊。如果 id 不连续,就先判断是否存在这个 key 。
    lml12377
        6
    lml12377  
    OP
       2016-03-01 16:04:38 +08:00
    @zktz 那如果我要 limit 100, 10 ,但是前 100 位里面是有几个坑的(被删掉了几条记录),那我开始的那个 id 还是得从数据库取的吧?
    lml12377
        7
    lml12377  
    OP
       2016-03-01 16:05:28 +08:00
    @jasontsai 终于能回复了,没错是我。。。
    zktz
        8
    zktz  
       2016-03-01 20:11:29 +08:00   ❤️ 1
    @lml12377 我先说我外行啊。
    我之前看 sina sae 的 kvdb 说明。像这种情况呢。就不是从第 100 位往后取。而是直接把前 110 个都取了。反正这种 kvdb 速度非常快。然后你再把第 101 到 110 输出。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1066 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:46 · PVG 06:46 · LAX 15:46 · JFK 18:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.