php - 如何使用 memcached 提高我的社交网站的性能?

标签 php memcached

我想在我的社交网站上实现 memcached。作为一个社交网络,大多数数据变化非常频繁。

例如,如果我要在缓存中存储用户的 10,000 个好友,则每当他添加好友时,都需要更新缓存。这很简单,但也需要在其他人将他们添加为 friend 时随时更新。仅在好友列表上就有大量更新。

还有一些用户博客和公告会不停地发布新的,你只能在你的 friend 列表中看到用户创建的,所以我认为这很难缓存。

我可以看到可能会缓存一些个人资料信息,这些信息只会在用户更新他们的个人资料时发生变化,但是这会为每个用户创建一个缓存记录,如果有 100,000 多个用户,那么缓存量会很大。这是个好主意吗?

最佳答案

我会说,尽可能缓存是个好主意……大多数情况下,您将能够比传统 RDBMS 更快地从 memcached 中提取项目(特别是如果您有复杂的连接等)。我目前采用这种策略并取得了巨大成功,以下是我从经验中学到的东西:

  1. 如果可能,无限期缓存,并在发生更改时写入新值。尽量不要执行显式删除,因为您可能会导致竞争条件,同时对尝试更新缓存的数据进行多次并发访问。如果缓存中不存在某个项目,也会实现锁定以防止上述问题(使用 memcached“添加”+ 循环中的短 sleep 时间)

  2. 如果可能,使用队列在后台刷新缓存。我的实现目前使用在后台运行的多线程 perl 进程 + beanstalkd,从而防止前端出现滞后时间。大多数情况下,更改会导致短暂的滞后。

  3. 如果可能,请使用 memcached getmulti,许多单独的 memcached 调用确实累加起来。

  4. 将您的缓存分层,在检查项目时,首先检查本地数组,然后是 memcached,然后是 db。在第一次访问后将结果缓存到本地数组中,以防止在同一项目的脚本执行中多次访问 memcached。编辑:澄清一下,如果使用诸如 PHP 之类的脚本语言,本地数组将只在当前脚本执行时存在:)一个例子:

    class Itemcache {
        private $cached_items = array();
        private $memcachedobj;
    
        public function getitem($memcache_key){
            if(isset($this->cached_items[$memcache_key])){
                return $this->cached_items[$memcache_key];
            }elseif($result = $this->memcachedobj->get($memcache_key)){
                $this->cached_items[$memcache_key] = $result;
                return $result;
            }else{
                // db query here as $dbresult
                $this->memcachedobj->set($memcache_key,$dbresult,0);
                $this->cached_items[$memcache_key] = $dbresult;
                return $dbresult;
        }
    }
    
  5. 编写一个实现上述缓存策略 #4 的包装函数。

  6. 在 memcached 中使用一致的 key 结构,例如。 'userinfo_{user.pk}' 其中 user.pk 是 rdbms 中用户的主键。

  7. 如果您的数据需要后处理,请尽可能在放入缓存之前进行此处理,这将在每次命中该数据时节省几个周期。

关于php - 如何使用 memcached 提高我的社交网站的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1182669/

相关文章:

php - 使用参数数组绑定(bind) Param

php - 如何在 mysql select 语句上连接 4 个表?

java - java中memcached中设置操作的IOException

php - 无法连接到 memcached

java - NoClassDefFoundError 和 Netty

php - php_memcached.dll 现在在哪里可用?

php - 使用 JQuery/AJAX 将 html 表单数据作为 JSON 发送到 PHP

javascript - 分离 PHP 和 Javascript 代码的最佳方法

php - 如果引导模式处于事件状态或正在显示,如何停止每秒刷新一次的页面?

python - 自制微型内存缓存