ServiceStack.Redis: PopRight / PopLeft отсутствует, вместо странно названных методов? - PullRequest
1 голос
/ 01 мая 2020

Я тестирую библиотеку ServiceStack.Redis, и сначала не мог понять, почему я не мог определить, делаю ли я всплывающее окно влево или вправо. Сначала я видел только

redis.BlockingPopItemFromList("list1", null);

, но задавался вопросом, где выбор, чтобы щелкнуть влево или вправо? Затем я нахожу:

redis.BlockingRemoveStartFromList("list1", null);

, а также

redis.BlockingDequeueItemFromList("list1", null);

Кажется, что:

  • BlockingPopItemFromList извлекает и удаляет самый старый сначала, всплывающее право
  • BlockingRemoveStartFromList извлекает и удаляет самые новые сначала, всплывает влево
  • BlockingDequeueItemFromList извлекает и удаляет самые старые сначала, всплывает снова вправо

Итак, три отдельных метода с тремя разными именами, два из которых делают одно и то же.

Кроме того, существуют следующие методы:

  • RemoveStartFromList
  • BlockingRemoveStartFromList
  • RemoveEndFromList

но нет BlockingRemoveEndFromList. Я предполагаю, что это BlockingPopx...

Почему бы не назвать его PopLeft и PopRight, или, один метод Pop с параметрами, указывающими, откуда взяться?

1 Ответ

0 голосов
/ 01 мая 2020

API имеют описательный смысл для улучшения читабельности в обычных базах кода для разработчиков, которые не знакомы с командами redis keycode .

Но если вы хотите знать, что каждая операция API просто ищет в исходном коде github.com / ServiceStack / ServiceStack.Redis , чтобы узнать, какую команду Redis они вызывают. Или, если вы просто заинтересованы в API списков, многие из них определены в RedisClient_List.cs .

Вы очень редко захотите использовать API Blocking*, которые вызывают redis блокирует команды , если это не то поведение, за которым вы хотите заблокировать поток, пока элемент не будет добавлен в список.

Другие API являются обычными операциями, в зависимости от как вы хотите относиться к структуре данных списка. ИМО, имена API очень описательны с их поведением, например, если вы хотите рассматривать его как список, есть:

Добавление элементов в список

  • PrependItemToList - добавьте к начало списка (LPU SH)
  • AddItemToList - добавить элемент в конец списка (RPU SH)

Добавить диапазон элементов

  • PrependRangeToList - добавить диапазон элементов к началу списка (LPUSH [])
  • AddRangeToList - добавить диапазон элементов в конец списка (RPUSH [ ])

Удаление элементов из списка

  • RemoveStartFromList - удалить элемент из начала списка (LPOP)
  • RemoveEndFromList - удалить элемент из конца списка (RPOP)

Также есть псевдонимы для вышеуказанных команд, если вы предпочитаете использовать другую номенклатуру в своей кодовой базе, например, если вы хотите обработать перечислите в качестве другой структуры данных, такой как Очередь или Стек, вместо которой вы будете использовать парные API для работы с ними, например:

  • EnqueueItemOnList - поставьте в очередь элемент t o очередь (LPU SH)
  • DequeueItemFromList - удалить элемент из очереди (RPOP)

или, если вы хотите обработать свой список как стек:

  • PushItemToList - Pu sh a Item (RPU SH)
  • PopItemFromList - Pop Item (RPOP)

If вместо этого вы хотите использовать свою собственную номенклатуру, вы можете просто добавить свои собственные методы расширения в интерфейсы Redis Client, например:

public static class MyRedisApis
{
    public static string PopLeft(this IRedisClient client, string listId) =>
        client.RemoveStartFromList(listId);

    public static string PopRight(this IRedisClient client, string listId) =>
        client.RemoveEndFromList(listId);
}

, где вы теперь можете использовать вместо этого свои собственные именованные API в своей кодовой базе:

var item = redis.PopLeft(myList);

При необходимости вы можете привести свой Redis Client к IRedisNativeClient и получить доступ к тем же именам команд, что и на redis-сервере, но потребуется преобразовать необработанный тип byte[] в UTF-8 string, где это необходимо.

...