1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
cacheengineredis.php
См. документацию.
1<?php
2
3namespace Bitrix\Main\Data;
4
5use Bitrix\Main\Config\Configuration;
6use Bitrix\Main\Data\LocalStorage\Storage;
7
9{
10 public function getConnectionName() : string
11 {
12 return 'cache.redis';
13 }
14
15 public static function getConnectionClass()
16 {
17 return RedisConnection::class;
18 }
19
20 protected function configure($options = []): array
21 {
22 $config = parent::configure($options);
23
24 $cacheConfig = Configuration::getValue('cache');
25
26 if (isset($cacheConfig['serializer']))
27 {
28 $config['serializer'] = (int)$cacheConfig['serializer'];
29 }
30
31 $config['persistent'] = true;
32 if (isset($cacheConfig['persistent']) && $cacheConfig['persistent'] == 0)
33 {
34 $config['persistent'] = false;
35 }
36
37 if (isset($cacheConfig['compression']))
38 {
39 $config['compression'] = $cacheConfig['compression'];
40 }
41
42 if (isset($cacheConfig['compression_level']))
43 {
44 $config['compression_level'] = $cacheConfig['compression_level'];
45 }
46
47 if (isset($cacheConfig['timeout']))
48 {
49 $cacheConfig['timeout'] = (float)$cacheConfig['timeout'];
50 if ($cacheConfig['timeout'] > 0)
51 {
52 $config['timeout'] = $cacheConfig['timeout'];
53 }
54 }
55
56 if (isset($cacheConfig['read_timeout']))
57 {
58 $cacheConfig['read_timeout'] = (float)$cacheConfig['read_timeout'];
59 if ($cacheConfig['read_timeout'] > 0)
60 {
61 $config['read_timeout'] = $cacheConfig['read_timeout'];
62 }
63 }
64
65 return $config;
66 }
67
68 public function set($key, $ttl, $value) : bool
69 {
70 $ttl = (int) $ttl;
71 if ($ttl > 0)
72 {
73 return self::$engine->setex($key, $ttl, $value);
74 }
75 else
76 {
77 return self::$engine->set($key, $value);
78 }
79 }
80
81 public function get($key)
82 {
83 return self::$engine->get($key);
84 }
85
86 public function del($key)
87 {
88 self::$engine->del($key);
89 }
90
91 public function setNotExists($key, $ttl, $value)
92 {
93 $ttl = (int) $ttl;
94 if (self::$engine->setnx($key, $value))
95 {
96 if ($ttl > 0)
97 {
98 self::$engine->expire($key, $ttl);
99 }
100 return true;
101 }
102 return false;
103 }
104
105 public function checkInSet($key, $value) : bool
106 {
107 return self::$engine->sIsMember($key, $value);
108 }
109
110 public function addToSet($key, $value)
111 {
112 self::$engine->sAdd($key, $value);
113 }
114
115 public function getSet($key) : array
116 {
117 $list = self::$engine->sMembers($key);
118 if (!is_array($list))
119 {
120 $list = [];
121 }
122 return $list;
123 }
124
125 public function deleteBySet($key, $prefix = '')
126 {
127 $list = self::$engine->sMembers($key);
128 self::$engine->del($key);
129
130 if (is_array($list) && !empty($list))
131 {
132 self::$engine->del($list);
133 }
134 }
135
136 public function delFromSet($key, $member)
137 {
138 if (!is_array($member))
139 {
140 $member = [0 => $member];
141 }
142
143 if (!empty($member))
144 {
145 self::$engine->sRem($key, ...$member);
146 }
147 }
148
149 public function addCleanPath(array $data): void
150 {
151 self::$engine->lPush($this->sid . '/cacheCleanPath', $data);
152 }
153
154 public function delayedDelete(): void
155 {
156 $delta = 10;
157 $deleted = 0;
158 $etime = time() + 5;
159 $needClean = self::$engine->get($this->sid . '|needClean');
160
161 if ($needClean !== 'Y')
162 {
163 $this->unlock($this->sid . '|cacheClean');
164 return;
165 }
166
167 $count = (int) self::$engine->get($this->sid . '|delCount');
168 if ($count < 1)
169 {
170 $count = 1;
171 }
172
173 $step = $count + $delta;
174 for ($i = 0; $i < $step; $i++)
175 {
176 $finished = true;
177 $paths = self::$engine->rPop($this->sid . '/cacheCleanPath');
178 if ($paths)
179 {
180 $partitionListKey = $paths['PREFIX'] . '|' . static::BX_INIT_DIR_LIST;
181 $partitionKeys = $this->getSet($partitionListKey);
182 foreach ($partitionKeys as $partition)
183 {
184 if (time() > $etime)
185 {
186 $finished = false;
187 break;
188 }
189
190 $this->deleteBySet($partitionListKey . '|' . $partition);
191 }
192
193 if ($finished)
194 {
195 $deleted++;
196 }
197 elseif (time() > $etime)
198 {
199 self::$engine->lPush($this->sid . '/cacheCleanPath', $paths);
200 break;
201 }
202 }
203 else
204 {
205 break;
206 }
207 }
208
209 if ($deleted > $count)
210 {
211 self::$engine->setex($this->sid . '|delCount', 604800, $deleted);
212 }
213 elseif ($deleted < $count && $count > 1)
214 {
215 self::$engine->setex($this->sid . '|delCount', 604800, --$count);
216 }
217
218 if ($deleted === 0)
219 {
220 self::$engine->setex($this->sid . '|needClean', 3600, 'N');
221 }
222
223 $this->unlock($this->sid . '|cacheClean');
224 }
225}
$count
Определения admin_tab.php:4
unlock(string $key='')
Определения keyvalueengine.php:250
deleteBySet($key, $prefix='')
Определения cacheengineredis.php:125
static getConnectionClass()
Определения cacheengineredis.php:15
setNotExists($key, $ttl, $value)
Определения cacheengineredis.php:91
addCleanPath(array $data)
Определения cacheengineredis.php:149
delFromSet($key, $member)
Определения cacheengineredis.php:136
checkInSet($key, $value)
Определения cacheengineredis.php:105
addToSet($key, $value)
Определения cacheengineredis.php:110
configure($options=[])
Определения cacheengineredis.php:20
$options
Определения commerceml2.php:49
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$delta
Определения prolog_main_admin.php:363
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$config
Определения quickway.php:69
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
$paths
Определения options.php:2080