`
tq02ksu
  • 浏览: 51789 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

YII 框架 中 基于SAE的KV-DB的缓存实现.

 
阅读更多
支持超时, 写入时加锁.
锁冲突时旋转等待.
<?php

/**
 * Cache implementation for saekvdb.
 * Pay attention to the limit of the sae kv db,
 *     max key length : 200,
 *     max value length : 4M.
 *
 * @author tq02ksu
 */
class SAEKVCache extends CCache {

	/**
	 * $kv holds the kv db connection
	 * @var type
	 */
	public $kv;

	/**
	 * Key suffix of lock entry.
	 * @var string
	 */
	public $suffix_lock = 'l';

	/**
	 * Key suffix of content entry.
	 * @var string
	 */
	public $suffix_content = 'c';

	/**
	 * Key of expiration.
	 * @var string
	 */
	public $field_expiration = 'e';

	/**
	 * Key of content.
	 * @var string
	 */
	public $field_content = 'c';
	public $max_spin_wait = 3000;

	public function gen_content_key($key) {
		$suffix = $this->suffix_content;
		return $key . $suffix;
	}

	public function gen_lock_key($key) {
		$suffix = $this->suffix_lock;
		return $key . $suffix;
	}

	/**
	 * Initializes the application component.
	 * This method overrides the parent implementation by setting default cache key prefix.
	 */
	public function init() {
		parent::init();
		if ($this->kv === null) {
			$this->kv = new SaeKV();
			$this->kv->init();
		}
	}

	/**
	 * Retrieves a value from cache with a specified key.
	 * This method should be implemented by child classes to retrieve the data
	 * from specific cache storage. The uniqueness and dependency are handled
	 * in {@link get()} already. So only the implementation of data retrieval
	 * is needed.
	 * @param string $key a unique key identifying the cached value
	 * @return string the value stored in cache, false if the value is not in the cache or expired.
	 * @throws CException if this method is not overridden by child classes
	 */
	protected function getValue($key) {
		$key_content = $this->gen_content_key($key);

		$field_expiration = $this->field_expiration;
		$field_content = $this->field_content;

		$val = $this->kv->get($key_content);

		// deal as a failure:
		if ($val === false) {
			return false;
		}

		$val = unserialize($val);

		if (array_key_exists($field_expiration, $val) && $val[$field_expiration] < time()) {
			// expired
			$this->deleteValue($key);
			return false;
		} else {
			// cache hint:
			return $val[$field_content];
		}
	}

	/**
	 * Stores a value identified by a key in cache.
	 * This method should be implemented by child classes to store the data
	 * in specific cache storage. The uniqueness and dependency are handled
	 * in {@link set()} already. So only the implementation of data storage
	 * is needed.
	 *
	 * @param string $key the key identifying the value to be cached
	 * @param string $value the value to be cached
	 * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire.
	 * @return boolean true if the value is successfully stored into cache, false otherwise
	 * @throws CException if this method is not overridden by child classes
	 */
	protected function setValue($key, $value, $expire) {
		return $this->addOrSetValueByParam($key, $value, $expire, 'set');
	}

	/**
	 * Stores a value identified by a key into cache if the cache does not contain this key.
	 * This method should be implemented by child classes to store the data
	 * in specific cache storage. The uniqueness and dependency are handled
	 * in {@link add()} already. So only the implementation of data storage
	 * is needed.
	 *
	 * @param string $key the key identifying the value to be cached
	 * @param string $value the value to be cached
	 * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire.
	 * @return boolean true if the value is successfully stored into cache, false otherwise
	 * @throws CException if this method is not overridden by child classes
	 */
	protected function addValue($key, $value, $expire) {
		return $this->addOrSetValueByParam($key, $value, $expire, 'add');
	}

	protected function addOrSetValueByParam($key, $value, $expire, $method) {
		$field_content = $this->field_content;
		$field_expiration = $this->field_expiration;

		$val = array(
		$field_content => $value,
		);

		if ($expire > 0) {
			$val[$field_expiration] = time() + $expire;
		}
		$val = serialize($val);

		$key_content = $this->gen_content_key($key);
		$key_lock = $this->gen_lock_key($key);

		for ($i = 0; $i < $this->max_spin_wait; $i++) {
			if ($this->kv->add($key_lock, '')) {
				$success = $this->kv->$method($key_content, $val);
				$this->kv->delete($key_lock);
				return $success;
			}
		}
		return false;
	}

	/**
	 * Deletes a value with the specified key from cache
	 * This method should be implemented by child classes to delete the data from actual cache storage.
	 * @param string $key the key of the value to be deleted
	 * @return boolean if no error happens during deletion
	 * @throws CException if this method is not overridden by child classes
	 */
	protected function deleteValue($key) {
		$key_content = $this->gen_content_key($key);
		$key_lock = $this->gen_lock_key($key);

		for ($i = 0; $i < $this->max_spin_wait; $i++) {
			if ($this->kv->add($key_lock, '')) {
				$this->kv->delete($key_content);
				$this->kv->delete($key_lock);
				return true;
			}
		}
		return false;
	}

	/**
	 * Deletes all values from cache.
	 * Child classes may implement this method to realize the flush operation.
	 * @return boolean whether the flush operation was successful.
	 * @throws CException if this method is not overridden by child classes
	 * @since 1.1.5
	 */
	protected function flushValues() {
		$success = true;
		$step = 100;
		for ($ret = $this->kv->pkrget('', $step); $ret !== false; $ret = $this->kv->pkrget('', $step)) {
			array_walk($ret, function( $value, $key ) use ($kv) {
			    $success = $success && $kv->delete($key) ? true : false;
			});
		}

		return true;
	}

}
分享到:
评论

相关推荐

    yii-advanced-app-2.0.10.tgz

    这个版本是“yii-advanced-app-2.0.10.tgz”,它是一个压缩包,包含了 Yii 2 框架的高级应用模板,版本号为 2.0.10。这个版本可能包含了一些修复和改进,以提供更稳定和高效的开发环境。 Yii 2 是一个基于组件的高...

    yii-advanced-app-2.0.36.tgz

    Yii 2 Advanced Application 是一个基于 Yii 2 框架的高级项目模板,适用于构建复杂的、多应用的 Web 应用程序。版本号 2.0.36 表示这是该框架的一个稳定版本,提供了许多改进和修复。这个 `.tgz` 文件是该模板的...

    yii-basic-app-2.0.5.tgz

    "yii-basic-app-2.0.5.tgz" 是一个压缩包,其中包含了Yii2框架的基础版(Basic App)的源代码,版本号为2.0.5。这个版本修复了一个重要的安全问题,具体涉及到`yii\web\ViewAction`类。 `yii\web\ViewAction`是Yii2...

    yii-advanced-app-2.0.11.tgz

    这个名为 "yii-advanced-app-2.0.11.tgz" 的压缩包包含了所有必要的文件和配置,使得开发者可以快速地搭建起基于Yii 2的多层架构项目。 Yii 2.0框架是Yii框架的最新迭代,它在性能、安全性和可扩展性方面都有显著...

    yii-docs-2.0-zh-cn.tar.gz

    这个"yii-docs-2.0-zh-cn.tar.gz"压缩包包含了Yii 2.0框架的中文离线HTML版文档,使得开发者无需互联网连接也能查阅详尽的指导和API参考。同时,它还提供了英文版本的离线HTML文档以及"yii-guide-2.0-zh-cn"官方中文...

    yii-basic-app-2.0.15.tgz

    "yii-basic-app-2.0.15.tgz"是一个压缩包文件,其中包含了Yii框架的基础版本2.0.15,这个版本可能对国内用户来说下载速度较慢,因此提供了镜像下载。 Yii框架的核心特性包括: 1. 高性能:Yii采用缓存机制、优化的...

    yii-basic-app-2.0.32.tgz

    这个“yii-basic-app-2.0.32.tgz”压缩包包含了Yii2框架的基本应用模板,适用于快速搭建一个新的Web项目。版本号“2.0.32”意味着这是一个稳定且更新到最新状态的版本,确保了安全性与兼容性。 Yii2框架的核心特性...

    yii-advanced-app-2.0.35.tgz

    在本案例中,我们讨论的是Yii2框架的高级应用模板(Advanced App Template)的一个版本——v2.0.35,这个版本的归档文件为“yii-advanced-app-2.0.35.tgz”。 Yii2 高级应用模板是一个预配置的项目结构,旨在满足...

    yiren-p8Yii-ve2467575-x64.apk

    yiren-p8Yii-ve2467575-x64.apk

    yiren-p8Yii-v17323.apk

    yiren-p8Yii-v17323.apk

    yii-advanced-app-2.0.4

    "yii-advanced-app-2.0.4" 是 Yii 2.0 框架的一个高级应用模板,适用于构建复杂的多层应用程序。这个版本是 2.0.4,意味着它包含了该框架在 2.0 主线版本中的第四次更新,通常会包含修复的错误、改进的性能以及可能...

    yii2-file-upload-master.zip

    Yii2.0是一个基于组件的高性能PHP框架,用于开发Web 2.0应用程序。这个"yii2-file-upload-master.zip"压缩包包含了一个针对Yii2.0框架的图片上传扩展,特别设计来支持异步加载缩略图功能。这种功能在现代网页应用中...

    yii-basic-app-2.0.7.tgz

    在"yii-basic-app-2.0.7.tgz"压缩包中,"basic"目录下通常会包含以下文件和目录: - `config/`:配置文件夹,包括应用配置、路由配置等。 - `controllers/`:控制器目录,存放应用的控制层代码。 - `models/`:模型...

    yii-basic-app-2.0.36.tgz

    "yii-basic-app-2.0.36.tgz"是Yii2框架的基础应用模板的压缩包,版本号为2.0.36。这个压缩包是为了方便开发者快速启动一个新的Yii2项目而设计的,它包含了构建基本Web应用所需的所有核心组件和文件。 首先,让我们...

    yii-docs-2.0-en.tar.gz

    这个“yii-docs-2.0-en.tar.gz”压缩包包含的是Yii 2.0框架的英文离线文档,对于学习和深入理解Yii框架的各个方面非常有帮助。 首先,让我们来探讨一下Yii框架的核心特性: 1. **性能优化**:Yii 2.0 使用了缓存、...

    yii-basic-app-2.0.0.tgz

    在"yii-basic-app-2.0.0.tgz"这个压缩包中,我们看到的是Yii 2.0框架的基础应用模板。这个模板是专门为初学者和快速原型设计准备的,包含了创建一个基本Web应用所需的所有基础结构。它提供了一个起点,开发者可以在...

    yii-docs-1.1.10.r3566.zip文档

    本文档将详细解析`yii-docs-1.1.10.r3566.zip`压缩包中的内容,帮助开发者深入了解Yii框架的核心特性和使用方法。 1. **框架简介** Yii框架以"简单"和"高效"为设计理念,提供了一系列强大的特性,如MVC(模型-视图...

    yii-docs-1.1.17.467ff50

    yii-docs-1.1.17.467ff50

    php-yii-api.zip

    "php-yii-api.zip" 文件很可能是 Yii 框架的API文档压缩包,包含了 "yii-api-1.0.7.chm" 和 "yii-api-1.0.7.chw" 两个文件,它们是帮助文件格式,通常用于存储框架或库的官方文档,方便开发者查阅和学习。...

Global site tag (gtag.js) - Google Analytics