同步mysql和memcached / membase

时间:2012-01-23 02:45:50

标签: mysql memcached membase

我有一个应用程序,我想将某些信息汇总到membase中,以避免查询昂贵的组。例如,点击转换将记录在MySQL中,并且我希望在memcache密钥中为特定用户保持按小时分组的运行总点击次数。 在那里,我可以使用我需要的值取消/序列化数组。我有许多其他需求,如收入,喜欢等。

创建某种“事务”以确保MC和Mysql保持同步的最佳方法是什么?我总是可以基于底层的MySQL商店重建密钥库,但我希望在这两个产品之间保持良好的并发性。

1 个答案:

答案 0 :(得分:0)

在高级别上,要使用membase / memcache / etc作为mysql的缓存,您需要执行以下操作:

public Object readMethod(String key) {
    value = membaseDriver->get(key);
    if(value != null) {
        return value;
    }
    value = getFromMysql(key);
    membaseDriver->put(key, value, TTL);
}

public Object writeMethod(String key, String value) {
    writeToMysql(key, value);
    membaseDriver->delete(key); 
    //next call to get will get the value that we just wrote to db
}

这可确保您的数据库仍然是数据的主要来源,并确保membase和mysql保持几乎同步。 (当进程执行write方法,在写入mysql之后以及从membase中删除密钥之前,同步)。

如果希望它们真正同步,则必须确保在任何进程执行writeMethod时,没有进程可以执行readMethod。您可以使用add方法在memcache / membase中执行简单的全局锁定。基本上,你添加一个以你的锁命名的唯一键(例如:“MY_LOCK”),如果添加成功,你有锁定,在这种情况发生后,其他任何人都无法获得锁定。完成写操作后,通过使用锁的键名调用delete来释放锁。通过使用“lock”启动这两个方法,并使用“unlock”结束这两个方法,您可以确保一次只有一个进程执行任一个。您还可以在此基础上构建单独的读写锁,但我认为除非您需要100%更新(而不是最新的99.999%),否则锁定确实是您想要做的。 / p>

在每小时点击次数的情况下,您可以避免每次计算另一次点击时重新运行查询,方法是将当前小时(即:唯一会改变的小时)与前几个小时的数组分开(这可能永远不会改变,对吧?)。

每次添加点击时,只需在当前小时的计数器上使用memcache increment。然后,当您收到读取请求时,请查看前几个小时的数组,然后查看当前小时以及所有前几个小时,并将当前小时附加到结尾。作为免费奖励,增量为原子的事实为您提供了实际的同步值,因此您可以跳过锁定。