Управление кэшированием в G-WAN с хранилищем KV

В настоящее время я разрабатываю веб-приложение на C с использованием веб-сервера G-Wan, и я хочу использовать KV Store, включенный в G-Wan, для хранения сгенерированной веб-страницы и счетчика количества просмотров страницы. .

Хранилище KV — это хэш-карта, которую можно использовать для хранения сложных данных, таких как структуры.

Это то, что я использовал для хранения данных HTML и целого числа, которое является счетчиком:

typedef struct
{    
  char* HTML;    
  int nbDisplays;    

} my_data;

Веб-сервер использует несколько потоков, и хранилище KV совместно используется потоками.

Для обновления поля nbDisplays я использую атомарную операцию __sync_fetch_and_add (...) Но я не знаю, как лучше всего обновить поле HTML, которое является указателем.

Это лучше:

  1. построить новую структуру, используя существующую, хранящуюся в KV, чтобы получить текущие значения и добавить их в хранилище KV с помощью функции add(), предоставляемой G-WAN (эта функция заменяет старую структуру новой)
  2. Или обновить напрямую значения структуры, хранящиеся в хранилище KV?

Я не привык программировать в многопоточной среде и боюсь некоторых "странных" поведений...


person user1606908    schedule 17.08.2012    source источник
comment
Никакого ответа... Никто не пользуется этим веб-сервером?   -  person user1606908    schedule 20.08.2012


Ответы (1)


kv_add() задокументировано как атомарная операция. Вы можете использовать его для обновления счетчика, но это медленнее, чем простое использование атомарной операции для увеличения счетчика nbDisplays, не касаясь указателя HTML (имя страницы не меняется).

Но функции G-Wan KV Store не делают его похожим на hash map. Вы не можете выполнять эти запросы диапазона с hash map.

person Karl    schedule 21.08.2012
comment
ОК спасибо за ответ. У меня возникли некоторые проблемы со счетчиком: я использовал CURL, чтобы запросить 10 раз одну и ту же страницу, первый вызов выполняется без KV, а после того, как 9 других вызовов выполняются с использованием KV и увеличением nbDisplays. В конце nbDisplays=6 вместо 10. Не понимаю почему. Если у вас есть ключ, мне интересно. Жером - person user1606908; 22.08.2012
comment
Исходный код (явно) предупреждает, что вы должны сделать атомарное увеличение счетчика. Именно поэтому у вас проблемы с потоками. - person Gil; 14.10.2012