Skip to content

Commit 7c218c7

Browse files
committed
[cache] Adjust Dns component to use cache component
1 parent f9a8b04 commit 7c218c7

5 files changed

Lines changed: 61 additions & 34 deletions

File tree

Query/CachedExecutor.php

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,28 @@ public function __construct(ExecutorInterface $executor, RecordCache $cache)
1919

2020
public function query($nameserver, Query $query)
2121
{
22-
$cachedRecords = $this->cache->lookup($query);
23-
24-
if (count($cachedRecords)) {
25-
$cachedResponse = $this->buildResponse($query, $cachedRecords);
26-
27-
return When::resolve($cachedResponse);
28-
}
29-
22+
$that = $this;
23+
$executor = $this->executor;
3024
$cache = $this->cache;
3125

32-
return $this->executor
33-
->query($nameserver, $query)
34-
->then(function ($response) use ($cache, $query) {
35-
$cache->storeResponseMessage($query->currentTime, $response);
36-
return $response;
37-
});
26+
return $this->cache
27+
->lookup($query)
28+
->then(
29+
function ($cachedRecords) use ($that, $query) {
30+
return $that->buildResponse($query, $cachedRecords);
31+
},
32+
function () use ($executor, $cache, $nameserver, $query) {
33+
return $executor
34+
->query($nameserver, $query)
35+
->then(function ($response) use ($cache, $query) {
36+
$cache->storeResponseMessage($query->currentTime, $response);
37+
return $response;
38+
});
39+
}
40+
);
3841
}
3942

40-
private function buildResponse(Query $query, array $cachedRecords)
43+
public function buildResponse(Query $query, array $cachedRecords)
4144
{
4245
$response = new Message();
4346

Query/RecordBag.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,4 @@ function ($value) {
2424
$this->records
2525
));
2626
}
27-
28-
public function expire($currentTime)
29-
{
30-
foreach ($this->records as $key => $value) {
31-
list($expiresAt, $record) = $value;
32-
if ($expiresAt <= $currentTime) {
33-
unset($this->records[$key]);
34-
}
35-
}
36-
}
3727
}

Query/RecordCache.php

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,38 @@
22

33
namespace React\Dns\Query;
44

5+
use React\Cache\CacheInterface;
56
use React\Dns\Model\Message;
67
use React\Dns\Model\Record;
8+
use React\Promise\When;
79

810
class RecordCache
911
{
10-
private $records = array();
12+
private $cache;
13+
private $expiredAt;
14+
15+
public function __construct(CacheInterface $cache)
16+
{
17+
$this->cache = $cache;
18+
}
1119

1220
public function lookup(Query $query)
1321
{
1422
$id = $this->serializeQueryToIdentity($query);
15-
$records = isset($this->records[$id]) ? $this->records[$id]->all() : array();
1623

17-
return $records;
24+
$expiredAt = $this->expiredAt;
25+
26+
return $this->cache
27+
->get($id)
28+
->then(function ($value) use ($query, $expiredAt) {
29+
$recordBag = unserialize($value);
30+
31+
if (null !== $expiredAt && $expiredAt <= $query->currentTime) {
32+
return When::reject();
33+
}
34+
35+
return $recordBag->all();
36+
});
1837
}
1938

2039
public function storeResponseMessage($currentTime, Message $message)
@@ -27,15 +46,28 @@ public function storeResponseMessage($currentTime, Message $message)
2746
public function storeRecord($currentTime, Record $record)
2847
{
2948
$id = $this->serializeRecordToIdentity($record);
30-
$this->records[$id] = isset($this->records[$id]) ? $this->records[$id] : new RecordBag();
31-
$this->records[$id]->set($currentTime, $record);
49+
50+
$cache = $this->cache;
51+
52+
$this->cache
53+
->get($id)
54+
->then(
55+
function ($value) {
56+
return unserialize($value);
57+
},
58+
function ($e) {
59+
return new RecordBag();
60+
}
61+
)
62+
->then(function ($recordBag) use ($id, $currentTime, $record, $cache) {
63+
$recordBag->set($currentTime, $record);
64+
$cache->set($id, serialize($recordBag));
65+
});
3266
}
3367

3468
public function expire($currentTime)
3569
{
36-
foreach ($this->records as $recordBag) {
37-
$recordBag->expire($currentTime);
38-
}
70+
$this->expiredAt = $currentTime;
3971
}
4072

4173
public function serializeQueryToIdentity(Query $query)

Resolver/Factory.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace React\Dns\Resolver;
44

5+
use React\Cache\ArrayCache;
56
use React\Dns\Query\Executor;
67
use React\Dns\Query\CachedExecutor;
78
use React\Dns\Query\RecordCache;
@@ -40,7 +41,7 @@ protected function createRetryExecutor(LoopInterface $loop)
4041

4142
protected function createCachedExecutor(LoopInterface $loop)
4243
{
43-
return new CachedExecutor($this->createRetryExecutor($loop), new RecordCache());
44+
return new CachedExecutor($this->createRetryExecutor($loop), new RecordCache(new ArrayCache()));
4445
}
4546

4647
protected function addPortToServerIfMissing($nameserver)

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"license": "MIT",
66
"require": {
77
"php": ">=5.3.2",
8+
"react/cache": "0.2.*",
89
"react/socket": "0.2.*",
910
"react/promise": "1.0.*"
1011
},

0 commit comments

Comments
 (0)