Skip to content

Модуль для работы с Redis. realweb.api.redis

Совместимость

realweb.api v.6

Описание

Redis позволяет хранить данные не на жестком диске, а в оперативной памяти, за счет чего достигается максимальная скорость записи и чтения таких данных.

Модуль предоставляет инструмент для хранения данных в redis в привычной форме для программиста. (В стиле реляционных БД).

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

Варианты использования:

  • Кэширование данных
  • Подписка на сообщения
  • Очереди задач
  • etc..

Более подробно об использовании Redis можно прочитать в статье

Установка

Описание установки описано в документации в репозитории

Практическое использование

Модуль предоставляет возможность хранить данные в двух форматах: Объекты (Ассоциативные массивы) и простые строки

Единица данных представляет собой экземпляр класса \Realweb\Api\Module\Redis\Model\Orm\Entity с описанными полями в таблице \Realweb\Api\Module\Redis\Model\Orm\Table

Table

Table - необходима для контроля полей в единице данных

Ключевые методы:

  • public static function getMap(): array - возвращает массив полей
  • public static function getEntity(): string - возвращает класс сущности
  • public static function getCollection(): string - возвращает класс коллекции сущности
  • public static function getByValue(string $strField, string $strValue): Redis\Model\Orm\Collection - возвращает коллекцию найденных сущностей по значению множественного поля

Для хранения значений доступны 2 вида полей - множественные значения и не множественные значения.

Для множественных полей доступен поиск по значению getByValue(string $strField, string $strValue)

Поиск по обычным полям недоступен

Пример
php
<?php

namespace Realweb\Api\Module\Redis\Model\Message;

use Realweb\Api\Module\Redis;

/**
 * Class \Realweb\Api\Module\Redis\Model\Message\Table
 */
class Table extends Redis\Model\Orm\Object\Table
{
	public static function getName(): string
	{
		return 'message';
	}

	public static function getEntity(): string
	{
		return Entity::class;
	}

	public static function getCollection(): string
	{
		return Collection::class;
	}

	public static function getMap(): array
	{
		return array(
			(new Redis\Model\Orm\Field\Entity("COUNT")), //Обычное поле
			(new Redis\Model\Orm\Field\Entity("TAG"))->setMultiple(true), //Множественное поле
		);
	}
}

Entity

Entity - сущность единицы данных, наследуется от класса \Realweb\Api\Model\Data\Data Ключевые методы:

  • public function __construct(string|int $mId, array $arData = array()) - в конструктор необходимо передать уникальный id сущности и опционально значения полей.
  • public function getData(): array - возвращает значения в виде ассоциативного массива
  • public function getId(): string|int - возвращает уникальный id сущности
  • public function isExist(): bool - проверка на существование
  • public function save(): bool - сохранение
  • public function delete(): bool - удаление
Пример
php
<?php

namespace Realweb\Api\Module\Redis\Model\Message;

use Realweb\Api\Module\Redis;

/**
 * Class \Realweb\Api\Module\Redis\Model\Message\Entity
 * @method int getCount()
 * @method array getTag()
 *
 * @method $this setCount(int $iValue)
 * @method $this setTag(array $arValue)
 */
class Entity extends Redis\Model\Orm\Object\Entity
{
	protected static function _getTable(): string
	{
		return Table::class;
	}
}

Collection

Collection - хранение коллекции сущности, наследуется от \Realweb\Api\Model\Data\Collection

Пример
php
<?php

namespace Realweb\Api\Module\Redis\Model\Message;

use Realweb\Api\Module\Redis;

/**
 * Class \Realweb\Api\Module\Redis\Model\Message\Collection
 */
class Collection extends Redis\Model\Orm\Object\Collection
{
	/**
	 * @param Entity $obItem
	 * @return $this
	 */
	public function addItem($obItem): self
	{
		if (!($obExistItem = $this->getByKey($obItem->getId()))) {
			$this->_collection[] = $obItem;
			$this->_keys[] = (int) $obItem->getId();
		}

		return $this;
	}

	/**
	 * @return Entity[]
	 */
	public function getCollection(): array
	{
		return parent::getCollection();
	}

	/**
	 * @param string $strKey
	 * @return Entity|null
	 */
	public function getByKey($strKey): ?Entity
	{
		return parent::getByKey($strKey);
	}
}

Объекты

Могут содержать любое количество полей, описанных в Table. Поля могут быть как обычными, так и множественными.

Строки

Могут содержать единственное поле, описанное в Table. Поле может быть как обычным, так и множественным.

Практический пример

php
use Realweb\Api\Module\Redis;
use Realweb\Api\Module\User;

//Создание и сохранение сущности
$obMessage = new Redis\Model\Message\Entity(User\Model\User::getInstance()->getId());
$obMessage
    ->setCount(1)
    ->setTag(array('iblock_id_1','iblock_id_2','iblock_id_3','iblock_id_5'));
$obMessage->save();


//Получение сущности по уникальному id
$obMessage = new Redis\Model\Message\Entity(User\Model\User::getInstance()->getId());
print_r($obMessage->getTag());
print_r($obMessage->getCount());

//Поиск по множественному полю
$obCollection = Redis\Model\Message\Table::getByValue("TAG","iblock_id_5");
print_r($obCollection);

Репозиторий

Репозиторий модуля