Преглед изворни кода

Use a redis script instead of doing 7 incr round trips

Jordi Boggiano пре 9 година
родитељ
комит
87a25dd2e3

+ 2 - 0
app/config/config.yml

@@ -54,6 +54,8 @@ snc_redis:
             type: predis
             alias: default
             dsn: %redis_dsn%
+            options:
+                profile: 2.8
 
 # Swiftmailer Configuration
 swiftmailer:

+ 24 - 0
src/Packagist/Redis/DownloadsIncr.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace Packagist\Redis;
+
+class DownloadsIncr extends \Predis\Command\ScriptedCommand
+{
+    public function getKeysCount()
+    {
+        return 7;
+    }
+
+    public function getScript()
+    {
+        return <<<LUA
+redis.call("incr", KEYS[1]);
+redis.call("incr", KEYS[2]);
+redis.call("incr", KEYS[3]);
+redis.call("incr", KEYS[4]);
+redis.call("incr", KEYS[5]);
+redis.call("incr", KEYS[6]);
+redis.call("incr", KEYS[7]);
+LUA;
+    }
+}

+ 15 - 11
src/Packagist/WebBundle/Model/DownloadManager.php

@@ -112,8 +112,13 @@ class DownloadManager
      * @param \Packagist\WebBundle\Entity\Package|int $package
      * @param \Packagist\WebBundle\Entity\Version|int $version
      */
-    public function addDownload($package,  $version)
+    public function addDownload($package, $version)
     {
+        static $loaded;
+        if (!$loaded) {
+            $redis->getProfile()->defineCommand('downloadsIncr', 'Packagist\Redis\DownloadsIncr');
+        }
+
         $redis = $this->redis;
 
         if ($package instanceof Package) {
@@ -124,15 +129,14 @@ class DownloadManager
             $version = $version->getId();
         }
 
-        $redis->incr('downloads');
-
-        $redis->incr('dl:'.$package);
-        $redis->incr('dl:'.$package.':'.date('Ym'));
-        $redis->incr('dl:'.$package.':'.date('Ymd'));
-
-        $redis->incr('dl:'.$package.'-'.$version);
-        $redis->incr('dl:'.$package.'-'.$version.':'.date('Ym'));
-        $redis->incr('dl:'.$package.'-'.$version.':'.date('Ymd'));
+        $redis->downloadsIncr(
+            'downloads',
+            'dl:'.$package,
+            'dl:'.$package.':'.date('Ym'),
+            'dl:'.$package.':'.date('Ymd'),
+            'dl:'.$package.'-'.$version,
+            'dl:'.$package.'-'.$version.':'.date('Ym'),
+            'dl:'.$package.'-'.$version.':'.date('Ymd')
+        );
     }
-
 }