-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRedisStringHandler.php
More file actions
125 lines (104 loc) · 3.15 KB
/
RedisStringHandler.php
File metadata and controls
125 lines (104 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\ModelCache\Handler;
use Hyperf\Codec\Packer\PhpSerializerPacker;
use Hyperf\Contract\Arrayable;
use Hyperf\Contract\PackerInterface;
use Hyperf\ModelCache\Config;
use Hyperf\ModelCache\Exception\CacheException;
use Hyperf\Redis\RedisProxy;
use Hyperf\Support\Traits\InteractsWithTime;
use Psr\Container\ContainerInterface;
use function Hyperf\Support\make;
class RedisStringHandler implements HandlerInterface
{
use InteractsWithTime;
protected RedisProxy $redis;
protected PackerInterface $packer;
public function __construct(protected ContainerInterface $container, protected Config $config)
{
if (! $container->has(RedisProxy::class)) {
throw new CacheException(sprintf('Entry[%s] of the container is not exist.', RedisProxy::class));
}
$this->redis = make(RedisProxy::class, ['pool' => $config->getPool()]);
$this->packer = $container->get(PhpSerializerPacker::class);
}
public function get($key, $default = null): mixed
{
$data = $this->redis->get($key);
if (! $data) {
return $default;
}
return $this->packer->unpack($data);
}
public function set($key, $value, $ttl = null): bool
{
if (is_array($value)) {
$data = $value;
} elseif ($value instanceof Arrayable) {
$data = $value->toArray();
} else {
throw new CacheException('The value must is array.');
}
$serialized = $this->packer->pack($data);
if ($ttl) {
$seconds = $this->secondsUntil($ttl);
if ($seconds > 0) {
return $this->redis->set($key, $serialized, ['EX' => $seconds]);
}
}
return $this->redis->set($key, $serialized);
}
public function delete($key): bool
{
return (bool) $this->redis->del($key);
}
public function clear(): bool
{
throw new CacheException('Method clear is forbidden.');
}
/**
* @param iterable $keys
* @param mixed $default
* @return array|iterable
*/
public function getMultiple($keys, $default = null): iterable
{
$data = $this->redis->mget((array) $keys);
$result = [];
foreach ($data as $item) {
if (! empty($item)) {
$result[] = $this->packer->unpack($item);
}
}
return $result;
}
public function setMultiple($values, $ttl = null): bool
{
throw new CacheException('Method setMultiple is forbidden.');
}
public function deleteMultiple($keys): bool
{
return (bool) $this->redis->del(...$keys);
}
public function has($key): bool
{
return (bool) $this->redis->exists($key);
}
public function getConfig(): Config
{
return $this->config;
}
public function incr($key, $column, $amount): bool
{
return $this->delete($key);
}
}