Redis реализует функцию очереди, обычно используя команду LPUSH и команду BRPOP для ее завершения. Однако очереди также имеют свои собственные приоритеты.Если существует несколько очередей, но есть только один потребитель, как достичь приоритета потребления?
Базовый синтаксис BRPOP
BLPOP LIST1 LIST2 .. LISTN TIMEOUT
第一个是键名,第二个是超时时间,单位是秒,如果列表为空或者超过了超时时间还没获取到新元素,就返回一个nil,否则返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。
超时时间为"0",表示不限制等待的时间。
Можно обнаружить, что первый параметр поддерживает несколько ключей, поэтому команда BLPOP может фактически получать несколько ключей одновременно. Когда команда BLPOP отслеживает несколько ключей одновременно, до тех пор, пока в одном ключе есть элемент, элемент будет всплывать. Если несколько ключей не имеют элементов, он будет заблокирован. Конечно, если есть элементы в нескольких ключах, то элементы в ключе будут появляться в порядке ключей, определенном командой BLPOP, которая косвенно реализует приоритет очереди.
Пример реализации Redis с приоритетной очередью
Сначала откройте два экземпляра redis-cli, порт - 6380, один как потребитель, другой как производитель, следующим образом:
Здесь пусть производитель создает несколько сообщений в трех очередях, а потребитель не будет открывать его временно, иначе эффект не будет очевиден, а именно:
Поместите в очередь следующие 3 элемента: 1 ключ:
Поместите в очередь следующие 2 элемента: 2 ключа:
Поместите в очередь следующий элемент: 3:
Затем позвольте потребителю использовать команду BRPOP для отслеживания вышеуказанных 3 ключей, попытаться извлечь элементы и увидеть порядок, в котором элементы выталкиваются:
из результата вывода элементы выталкиваются по порядку, и только элементы в первом ключе почти потребляются. Когда он исчерпан, элементы во втором ключе будут всплывать, а затем элементы будут извлекаться по порядку, пока не останется элементов в состоянии блокировки.
подводить итоги
С помощью команды BRPOP для одновременного мониторинга нескольких ключей можно реализовать функцию очереди приоритетов.