Appearance
Модуль для работы с 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);