2014-11-21 5 views
2

Для обмена данными через процессы я намереваюсь использовать список Redis. Производитель подталкивает к списку, в то время как набор потребителей потребляет содержимое списка с помощью BRPOP.Redis - есть ли blpush

Чтобы ограничить список неограниченным размером, я хочу ограничить размер списка фиксированным значением (например, 10 тыс. Элементов). Я с удивлением обнаружил эквивалентную команду, такую ​​как BLPUSH или BRPUSH. Это намеренно опущено Редисом?

Итак, я предполагаю, что мне нужно создать Txn с Watch/multi, чтобы проверить размер списка перед нажатием. Правильно ли это, или какие-либо лучшие методы?

ответ

2

Я бы выбрал сценарий lua для этой функции.

LUA, который принимает один ключ (имя списка) и два аргумента, new_element_name и max_size. Возвращаемое значение может быть возвращенным значением LPUSH или -1, когда список заполнен.
Вот скрипт, который делает это:

if tonumber(ARGV[2]) > redis.call('LLEN', KEYS[1]) then 
    return redis.call('LPUSH', KEYS[1], ARGV[1]) end 
return -1 

Вы должны загрузить его один раз с SCRIPT НАГРУЗКИ:

cat blpush.lua | redis-cli -x script load 

И использовать его с EVALSHA

evalsha 96d1fb35d6173758facda9dbc108296fd4a1512d 1 <myList> <new_element_name> <max_size> 
Смежные вопросы