[Pkg-owncloud-commits] [owncloud] 393/457: compare-and-set and compare-and-delete using lua scripts for redis

David Prévot taffit at moszumanska.debian.org
Sun Jun 28 20:06:53 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch stable8
in repository owncloud.

commit 1bc56a99e9e368091753ff79facf930336478a35
Author: Robin Appelman <icewind at owncloud.com>
Date:   Mon Jun 8 15:22:20 2015 +0200

    compare-and-set and compare-and-delete using lua scripts for redis
---
 lib/private/memcache/redis.php | 52 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)

diff --git a/lib/private/memcache/redis.php b/lib/private/memcache/redis.php
index cfc35dc..1ef9417 100644
--- a/lib/private/memcache/redis.php
+++ b/lib/private/memcache/redis.php
@@ -26,13 +26,15 @@ namespace OC\Memcache;
 use OCP\IMemcache;
 
 class Redis extends Cache implements IMemcache {
-	use CASTrait;
-
 	/**
 	 * @var \Redis $cache
 	 */
 	private static $cache = null;
 
+	private static $casScript;
+
+	private static $cadScript;
+
 	public function __construct($prefix = '') {
 		parent::__construct($prefix);
 		if (is_null(self::$cache)) {
@@ -57,6 +59,29 @@ class Redis extends Cache implements IMemcache {
 
 			self::$cache->connect($host, $port, $timeout);
 
+			self::$casScript = self::$cache->script('load', '
+local key = ARGV[1]
+local old = ARGV[2]
+local new = ARGV[3]
+
+if redis.call(\'get\', key) == old then
+  redis.call(\'set\', key, new)
+  return true
+end
+
+return false');
+
+			self::$cadScript = self::$cache->script('load', '
+local key = ARGV[1]
+local old = ARGV[2]
+
+if redis.call(\'get\', key) == old then
+  redis.call(\'del\', key)
+  return true
+end
+
+return false');
+
 			if (isset($config['dbindex'])) {
 				self::$cache->select($config['dbindex']);
 			}
@@ -150,6 +175,29 @@ class Redis extends Cache implements IMemcache {
 		return self::$cache->decrBy($this->getNamespace() . $key, $step);
 	}
 
+	/**
+	 * Compare and set
+	 *
+	 * @param string $key
+	 * @param mixed $old
+	 * @param mixed $new
+	 * @return bool
+	 */
+	public function cas($key, $old, $new) {
+		return (bool) self::$cache->evalSha(self::$casScript, [$this->getNamespace() . $key, json_encode($old), json_encode($new)]);
+	}
+
+	/**
+	 * Compare and delete
+	 *
+	 * @param string $key
+	 * @param mixed $old
+	 * @return bool
+	 */
+	public function cad($key, $old) {
+		return (bool)self::$cache->evalSha(self::$cadScript, [$this->getNamespace() . $key, json_encode($old)]);
+	}
+
 	static public function isAvailable() {
 		return extension_loaded('redis')
 			&& version_compare(phpversion('redis'), '2.2.5', '>=');

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list