Вообще всегда при подобных задачах встает вопрос - что выбирать - скорость или память, в последнее время разруливать стало проще -
сейчас очень дешевая память, поэтому если важна скорость то экономить на памяти нет смысла - купить память дешевле чем мутить что то очень сложное.
Поэтому если важна скорость (миллионы проверок в секунду на наличие ключа) то хранить можно хоть в текстовом файле,
а для проверки создавать програмный хэш, (map, set) и загружать значения при старте сервера, 50 миллионов ключей не так уж и много и для стандартного std::set это примерно (зависит от реализации)
(sizeof(key)+sizeof(_Rb_tree_node_base))*50000000 = (20+16)*50000000 = около 2х гигабайт (тут можно налететь на ограничения скриптовых языков на память но недолго написать такой простой C++ модуль)
Если скорость не важна и устраивает на уровне несколько тысяч проверок в секунду то вам правильно советуют redis или любое другое key value хранилище, сразу есть где хранить, сразу есть api для любых языков
но редис тоже по сути inmemory база т.e память любит
Отсюда если важна память а скорость совсем неважна - сотни проверок в секунду, то добро пожаловать в мир sql или подобных баз.