Разработка API управления кешем

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

ContentPtr *publish(char *data, ssize_t length);
ContentPtr *publish(FILE *fd);

После вызова данные сохраняются во внутреннем буфере, и возвращается указатель на это содержимое. Контент можно удалить с помощью ContentPtr

boolean remove(ContentPtr *cPtr);

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

  • политики кеша, такие как LRU, FIFO, None (запретить публикацию, когда кеш заполнен)
  • контроль размера кэша

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

Некоторые возможные решения:

  • void configPolicy(enum Policy p);
  • void configPolicy(int flags); //Используйте некоторые флаги и сделайте что-то похожее на fcntl()
  • void configSize(ssize_t size); //размер=-1, если нет ограничений
  • void configSize(string size); //поддерживает 16M или 1G

person Wei Shi    schedule 02.12.2011    source источник


Ответы (1)


Вы можете использовать подход, который использовала библиотека pthreads, используя отдельный класс/структуру для хранения информации об атрибутах потока. В вашем случае эта дополнительная информация об атрибутах будет содержать информацию о политике и т. д. Таким образом, вы можете сделать свои функции похожими на следующие:

ContentPtr *publish(char *data, ssize_t length, cache_attr* attributes);
ContentPtr *publish(FILE *fd, cache_attr* attributes);

Затем, если пользователь передает значение NULL в последний аргумент, используйте любые значения по умолчанию, которые вам нравятся в базовой реализации. В противном случае пользователь может передать структуру/класс, описывающий любые необходимые атрибуты, необходимые для реализации правильной политики. Хорошая вещь в этом подходе заключается в том, что вы всегда можете иметь некоторый тип абстрактного базового класса в качестве интерфейса, а затем создавать производные классы, которые передаются из некоторого типа фабричной функции, если хотите... в любом случае, это делает интерфейс гибкий как для себя, так и для конечного пользователя.

person Jason    schedule 02.12.2011