mysql - 同步 mysql 和 memcached/membase

标签 mysql memcached membase

我有一个应用程序,我想将某些信息汇总到 membase 中以避免昂贵的分组查询。例如,在 MySQL 中将记录一次点击转化,我想在内存缓存键中保留某个用户按小时分组的点击总数。 在那里我可以使用我需要的值取消/序列化一个数组。我还有许多其他需求,例如收入、点赞等等。

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

最佳答案

在高层次上,要使用 membase/memcache 等作为 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 中删除 key 之前,它是同步的)。

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

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

每次添加点击时,只需在当前小时的计数器上使用内存缓存增量。然后,当您收到读取请求时,查找之前所有时间的数组,然后是当前时间,以及所有之前的时间,当前时间附加到末尾。作为免费奖励,增量是原子的这一事实为您提供了实际同步的值,因此您可以跳过锁定。

关于mysql - 同步 mysql 和 memcached/membase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8966717/

相关文章:

java - 存储可以通过调用 url 呈现的二进制数据的理想位置

java - Tomcat 7 与 Memcached session 管理器

java - Java中的Membase节点故障处理

php - 将表单信息发送到存储在数据库中的电子邮件

mysql - 错误 1396 (HY000) : Operation CREATE USER failed for 'jack' @'localhost'

mysql - 登录链接调用存储过程

mysql - 如何创建一个由两个表组成的表

php-fpm 子进程在信号 11 上退出

javascript - Membase 有哪些 JavaScript 库