When popping items from a sharded LIST, we technically don’t need to use Lua. Redis
already has everything we need to pop items: WATCH, MULTI, and EXEC. But like we’ve
seen in other situations, when there’s high contention (which could definitely be the
case for a LIST that grows long enough to need sharding), WATCH/MULTI/EXEC transactions
may be slow.
To pop items in a nonblocking manner from a sharded LIST in Lua, we only need
to find the endmost shard, pop an item (if one is available), and if the resulting LIST
shard is empty, adjust the end shard information, as demonstrated in the next listing.
When popping items from a sharded LIST, we need to remember that if we pop from
an empty shard, we don’t know if it’s because the whole sharded LIST is empty or just
the shard itself. In this situation, we need to verify that we still have space between the
endpoints, in order to know if we can adjust one end or the other. In the situation
where just this one shard is empty, we have an opportunity to pop an item from the
proper shard, which we do.
The only remaining piece for our promised API is blocking pop operations.