initial 2.0.0-a3 commit

This commit is contained in:
jerry
2020-10-03 23:00:18 +08:00
parent f91d24aaaa
commit da584e0542
28 changed files with 580 additions and 225 deletions

View File

@@ -6,6 +6,7 @@ namespace ZM\Store;
use Exception;
use Swoole\Table;
use ZM\Console\Console;
class LightCache
{
@@ -14,13 +15,31 @@ class LightCache
private static $config = [];
public static $last_error = '';
public static function init($config) {
self::$config = $config;
self::$kv_table = new Table($config["size"], $config["hash_conflict_proportion"]);
self::$kv_table->column("value", Table::TYPE_STRING, $config["max_strlen"]);
self::$kv_table->column("expire", Table::TYPE_INT);
self::$kv_table->column("data_type", Table::TYPE_STRING, 12);
return self::$kv_table->create();
$result = self::$kv_table->create();
if ($result === true && isset($config["persistence_path"])) {
$r = json_decode(file_get_contents($config["persistence_path"]), true);
if ($r === null) $r = [];
foreach ($r as $k => $v) {
$write = self::set($k, $v);
Console::debug("Writing LightCache: " . $k);
if ($write === false) {
self::$last_error = '可能是由于 Hash 冲突过多导致动态空间无法分配内存';
return false;
}
}
}
if ($result === false) {
self::$last_error = '系统内存不足,申请失败';
}
return $result;
}
/**
@@ -56,12 +75,14 @@ class LightCache
*/
public static function set(string $key, $value, int $expire = -1) {
if (self::$kv_table === null) throw new Exception("not initialized LightCache");
if (is_array($value) || is_int($value)) {
if (is_array($value)) {
$value = json_encode($value, JSON_UNESCAPED_UNICODE);
if (strlen($value) >= self::$config["max_strlen"]) return false;
$data_type = "json";
} elseif (is_string($value)) {
$data_type = "";
} elseif (is_int($value)) {
$data_type = "int";
} else {
throw new Exception("Only can set string, array and int");
}
@@ -97,20 +118,31 @@ class LightCache
$r = [];
$del = [];
foreach (self::$kv_table as $k => $v) {
if ($v["expire"] <= time()) {
$del[]=$k;
if ($v["expire"] <= time() && $v["expire"] >= 0) {
$del[] = $k;
continue;
}
$r[$k] = self::parseGet($v);
}
foreach($del as $v) {
foreach ($del as $v) {
self::unset($v);
}
return $r;
}
public static function savePersistence() {
$r = [];
foreach (self::$kv_table as $k => $v) {
if ($v["expire"] === -2) {
$r[$k] = self::parseGet($v);
}
}
$r = file_put_contents(self::$config["persistence_path"], json_encode($r, 128 | 256));
if($r === false) Console::error("Not saved, please check your \"persistence_path\"!");
}
private static function checkExpire($key) {
if (($expire = self::$kv_table->get($key, "expire")) !== -1) {
if (($expire = self::$kv_table->get($key, "expire")) >= 0) {
if ($expire <= time()) {
self::$kv_table->del($key);
}
@@ -120,6 +152,7 @@ class LightCache
private static function parseGet($r) {
switch ($r["data_type"]) {
case "json":
case "int":
return json_decode($r["value"], true);
case "":
default: