aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/memcache
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2015-06-08 15:22:20 +0200
committerRobin Appelman <icewind@owncloud.com>2015-06-12 17:28:09 +0200
commit1bc56a99e9e368091753ff79facf930336478a35 (patch)
tree12f846f36f459401b2f4fa3afbfb6846d9542eb1 /lib/private/memcache
parent446f628136532fe556757c3fe39655c6304e3cb9 (diff)
downloadnextcloud-server-1bc56a99e9e368091753ff79facf930336478a35.tar.gz
nextcloud-server-1bc56a99e9e368091753ff79facf930336478a35.zip
compare-and-set and compare-and-delete using lua scripts for redis
Diffstat (limited to 'lib/private/memcache')
-rw-r--r--lib/private/memcache/redis.php52
1 files changed, 50 insertions, 2 deletions
diff --git a/lib/private/memcache/redis.php b/lib/private/memcache/redis.php
index cfc35dcc377..1ef9417eaf9 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', '>=');