支持超时, 写入时加锁.
锁冲突时旋转等待.
<?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 2 框架的高级应用模板,版本号为 2.0.10。这个版本可能包含了一些修复和改进,以提供更稳定和高效的开发环境。 Yii 2 是一个基于组件的高...
Yii 2 Advanced Application 是一个基于 Yii 2 框架的高级项目模板,适用于构建复杂的、多应用的 Web 应用程序。版本号 2.0.36 表示这是该框架的一个稳定版本,提供了许多改进和修复。这个 `.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 2的多层架构项目。 Yii 2.0框架是Yii框架的最新迭代,它在性能、安全性和可扩展性方面都有显著...
这个"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框架的基础版本2.0.15,这个版本可能对国内用户来说下载速度较慢,因此提供了镜像下载。 Yii框架的核心特性包括: 1. 高性能:Yii采用缓存机制、优化的...
这个“yii-basic-app-2.0.32.tgz”压缩包包含了Yii2框架的基本应用模板,适用于快速搭建一个新的Web项目。版本号“2.0.32”意味着这是一个稳定且更新到最新状态的版本,确保了安全性与兼容性。 Yii2框架的核心特性...
在本案例中,我们讨论的是Yii2框架的高级应用模板(Advanced App Template)的一个版本——v2.0.35,这个版本的归档文件为“yii-advanced-app-2.0.35.tgz”。 Yii2 高级应用模板是一个预配置的项目结构,旨在满足...
yiren-p8Yii-ve2467575-x64.apk
yiren-p8Yii-v17323.apk
"yii-advanced-app-2.0.4" 是 Yii 2.0 框架的一个高级应用模板,适用于构建复杂的多层应用程序。这个版本是 2.0.4,意味着它包含了该框架在 2.0 主线版本中的第四次更新,通常会包含修复的错误、改进的性能以及可能...
Yii2.0是一个基于组件的高性能PHP框架,用于开发Web 2.0应用程序。这个"yii2-file-upload-master.zip"压缩包包含了一个针对Yii2.0框架的图片上传扩展,特别设计来支持异步加载缩略图功能。这种功能在现代网页应用中...
在"yii-basic-app-2.0.7.tgz"压缩包中,"basic"目录下通常会包含以下文件和目录: - `config/`:配置文件夹,包括应用配置、路由配置等。 - `controllers/`:控制器目录,存放应用的控制层代码。 - `models/`:模型...
"yii-basic-app-2.0.36.tgz"是Yii2框架的基础应用模板的压缩包,版本号为2.0.36。这个压缩包是为了方便开发者快速启动一个新的Yii2项目而设计的,它包含了构建基本Web应用所需的所有核心组件和文件。 首先,让我们...
这个“yii-docs-2.0-en.tar.gz”压缩包包含的是Yii 2.0框架的英文离线文档,对于学习和深入理解Yii框架的各个方面非常有帮助。 首先,让我们来探讨一下Yii框架的核心特性: 1. **性能优化**:Yii 2.0 使用了缓存、...
在"yii-basic-app-2.0.0.tgz"这个压缩包中,我们看到的是Yii 2.0框架的基础应用模板。这个模板是专门为初学者和快速原型设计准备的,包含了创建一个基本Web应用所需的所有基础结构。它提供了一个起点,开发者可以在...
本文档将详细解析`yii-docs-1.1.10.r3566.zip`压缩包中的内容,帮助开发者深入了解Yii框架的核心特性和使用方法。 1. **框架简介** Yii框架以"简单"和"高效"为设计理念,提供了一系列强大的特性,如MVC(模型-视图...
yii-docs-1.1.17.467ff50
"php-yii-api.zip" 文件很可能是 Yii 框架的API文档压缩包,包含了 "yii-api-1.0.7.chm" 和 "yii-api-1.0.7.chw" 两个文件,它们是帮助文件格式,通常用于存储框架或库的官方文档,方便开发者查阅和学习。...