Net::Async::Redis - talk to Redis servers via IO::Async


    use Net::Async::Redis;
    use IO::Async::Loop;
    my $loop = IO::Async::Loop->new;
    $loop->add(my $redis = Net::Async::Redis->new);
    $redis->connect->then(sub {
    })->then(sub {
        my $value = shift;
        return Future->done($value) if $value;
        $redis->set(some_key => 'some_value')
    })->on_done(sub {
        print "Value: " . shift;

    # ... or with Future::AsyncAwait
    await $redis->connect;
    my $value = await $redis->get('some_key');
    $value ||= await $redis->set(some_key => 'some_value');
    print "Value: $value";


See Net::Async::Redis::Commands for the full list of commands.


NOTE: For a full list of the Redis methods supported by this module, please see Net::Async::Redis::Commands.

METHODS - Subscriptions

See for more details on this topic. There's also more details on the internal implementation in Redis here:


Subscribes to a pattern.


Subscribes to one or more channels.

Resolves to a Net::Async::Redis::Subscription instance.


 # Subscribe to 'notifications' channel,
 # print the first 5 messages, then unsubscribe
    ->then(sub {
        my $sub = shift;
    })->then(sub {

METHODS - Transactions


Executes the given code in a Redis MULTI transaction.

This will cause each of the requests to be queued, then executed in a single atomic transaction.


 $redis->multi(sub {
  my $tx = shift;
  $tx->incr('some::key')->on_done(sub { print "Final value for incremented key was " . shift . "\n"; });
  $tx->set('other::key => 'test data')
 })->then(sub {
  my ($success, $failure) = @_;
  return Future->fail("Had $failure failures, expecting everything to succeed") if $failure;
  print "$success succeeded\m";
  return Future->done;

METHODS - Generic





Called for each incoming message.

Passes off the work to "handle_pubsub_message" or the next queue item, depending on whether we're dealing with subscriptions at the moment.


Represents the IO::Async::Stream instance for the active Redis connection.


Number of requests awaiting responses before we start queuing. This defaults to an arbitrary value of 100 requests.

Note that this does not apply when in transaction (MULTI) mode.

See for more details on this concept.

METHODS - Deprecated

This are still supported, but no longer recommended.

METHODS - Internal


Some other Redis implementations on CPAN:



append, bgrewriteaof, bgsave, bitcount, bitfield, bitop, bitpos, blpop, brpop, brpoplpush, client_getname, client_kill, client_list, client_pause, client_reply, client_setname, cluster_addslots, cluster_count_failure_reports, cluster_countkeysinslot, cluster_delslots, cluster_failover, cluster_forget, cluster_getkeysinslot, cluster_info, cluster_keyslot, cluster_meet, cluster_nodes, cluster_replicate, cluster_reset, cluster_saveconfig, cluster_set_config_epoch, cluster_setslot, cluster_slaves, cluster_slots, command, command_count, command_getkeys, command_info, config_get, config_resetstat, config_rewrite, config_set, dbsize, debug_object, debug_segfault, decr, decrby, del, dump, echo, eval, evalsha, exists, expire, expireat, flushall, flushdb, geoadd, geodist, geohash, geopos, georadius, georadiusbymember, get, getbit, getrange, getset, hdel, hexists, hget, hgetall, hincrby, hincrbyfloat, hkeys, hlen, hmget, hmset, hscan, hset, hsetnx, hstrlen, hvals, incr, incrby, incrbyfloat, info, lastsave, lindex, linsert, llen, lpop, lpush, lpushx, lrange, lrem, lset, ltrim, mget, migrate, monitor, move, mset, msetnx, object, persist, pexpire, pexpireat, pfadd, pfcount, pfmerge, ping, psetex, pttl, publish, pubsub, punsubscribe, quit, randomkey, readonly, readwrite, rename, renamenx, restore, role, rpop, rpoplpush, rpush, rpushx, sadd, save, scan, scard, script_debug, script_exists, script_flush, script_kill, script_load, sdiff, sdiffstore, select, set, setbit, setex, setnx, setrange, shutdown, sinter, sinterstore, sismember, slaveof, slowlog, smembers, smove, sort, spop, srandmember, srem, sscan, strlen, sunion, sunionstore, swapdb, sync, time, touch, ttl, type, unlink, unsubscribe, unwatch, wait, watch, zadd, zcard, zcount, zincrby, zinterstore, zlexcount, zrange, zrangebylex, zrangebyscore, zrank, zrem, zremrangebylex, zremrangebyrank, zremrangebyscore, zrevrange, zrevrangebylex, zrevrangebyscore, zrevrank, zscan, zscore, zunionstore


add_child, adopt_future, can_event, children, configure_unknown, debug_printf, get_loop, invoke_error, invoke_event, loop, make_event_cb, maybe_invoke_event, maybe_make_event_cb, new, notifier_name, parent, remove_child, remove_from_parent


Tom Molesworth <>


Copyright Tom Molesworth 2015-2017. Licensed under the same terms as Perl itself.