кэширование — есть ли хорошее решение для тегирования кеша на PHP / Redis?

Я ищу простой способ хранения кеша в Redis и пометить части кеша tagsпоэтому, когда мне было нужно, я мог легко удалить весь кеш, помеченный определенным тегом.

Есть ли хорошее готовое решение для этого? (Я собираюсь использовать доступ Redis с PHP)

Я бы сделал это сам, так как я понимаю, что мне нужно хранить теги как наборы, где значения являются ключами кеша, которые используют тег. Я даже могу охватить ситуацию, когда я удаляю кеш, и его ключ должен быть удален из набора тегов (для этого я могу сохранить список тегов в кэшированном элементе). Но я не уверен, как это сделать, когда срок действия кэша истечет, в этом случае его ключ будет «застревать» в теге, а в следующий раз, когда я удаляю кэш по тегу — он будет очищать кэш ключом, где этот ключ больше не может использоваться. ,

Поэтому я ищу готовое решение, хотя бы посмотреть, как это делается.

4

Решение

Вы можете сделать это с помощью Illuminate \ Cache, которая является частью Laravel, хотя может использоваться сама по себе.

Для его настройки необходимо установить следующие библиотеки композиторов:

  • predis / predis
  • загореться / Redis
  • загореться / кэш

Вот пример:

<?php
require_once __DIR__ . '/vendor/autoload.php';

$servers = [
'cluster' => false,
'default' => [
'host'     => '127.0.0.1',
'port'     => 6379,
'database' => 0,
],
];

$redis = new Illuminate\Redis\Database($servers);
$cache = new Illuminate\Cache\RedisStore($redis);

$cache->tags('posts', 'author_1')->put('post_1', 'Post 1 by Author 1', 1);
$cache->tags('posts', 'author_2')->put('post_2', 'Post 2 by Author 2', 1);
var_dump($cache->tags('posts', 'author_1')->get('post_1'));
var_dump($cache->tags('posts', 'author_2')->get('post_2'));
$cache->tags('author_2')->flush();
var_dump($cache->tags('posts', 'author_1')->get('post_1'));
var_dump($cache->tags('posts', 'author_2')->get('post_2'));

Результатом будет:

php test.php
string(18) "Post 1 by Author 1"string(18) "Post 2 by Author 2"string(18) "Post 1 by Author 1"NULL
4

Другие решения

Я бы сделал это сам, так как я понимаю, что мне нужно хранить теги как наборы, где значения являются ключами кеша, которые используют тег.

Это будет работать, если вы не будете ограничивать доступную память для Redis (и обычно существует жесткое ограничение для доступной памяти для кеша). Потому что, если Redis удалит набор, содержащий ключи, и оставит эти ключи, вы не сможете удалить их по тегу.

Решения:

  • убедитесь, что у вас достаточно памяти для кеша
  • положить наборы в другой экземпляр Redis, который не имеет ограниченной памяти
  • положить наборы в совершенно другое место (например, БД)
  • не используйте тейджинг, используйте хэши Redis http://redis.io/commands/hset создавать пространства имен (вы можете сгруппировать ключи по одному «тегу»).
0

По вопросам рекламы [email protected]