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


    use Net::Async::Redis;
    use Future::AsyncAwait;
    use IO::Async::Loop;
    my $loop = IO::Async::Loop->new;
    $loop->add(my $redis = Net::Async::Redis->new);
    (async sub {
     await $redis->connect;
     my $value = await $redis->get('some_key');
     $value ||= await $redis->set(some_key => 'some_value');
     print "Value: $value";

    # You can also use ->then chaining, see L<Future> for more details
    $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;


Provides client access for dealing with Redis servers.

See Net::Async::Redis::Commands for the full list of commands, this list is autogenerated from the official documentation here:

Note that this module uses Future::AsyncAwait.


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.

Returns a Future which resolves to a Net::Async::Redis::Subscription instance.


Subscribes to one or more channels.

Returns a Future which 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



A convenience wrapper around the keyspace notifications API.

Provides the necessary setup to establish a PSUBSCRIBE subscription on the __keyspace@*__ namespace, setting the configuration required for this to start emitting events, and then calls $code with each event.

Note that this will switch the connection into pubsub mode, so it will no longer be available for any other activity.


The string describing the remote endpoint.


A string describing the local endpoint, usually host:port.


Connects to the Redis server.


Establishes a connection if needed, otherwise returns an immediately-available Future instance.


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


Called when the socket is closed.


Generate a label for the given command list.


Defines the buffer size when reading from a Redis connection.

Defaults to 1MB, reduce this if you're dealing with a lot of connections and want to minimise memory usage. Alternatively, if you're reading large amounts of data and spend too much time in needless epoll_wait calls, try a larger value.


The buffer size when writing to Redis connections, in bytes. Defaults to 1MB.

See "stream_read_len".


Some other Redis implementations on CPAN:



append, auth, bgrewriteaof, bgsave, bitcount, bitfield, bitop, bitpos, blpop, brpop, brpoplpush, bzpopmax, bzpopmin, client_getname, client_id, client_kill, client_list, client_pause, client_reply, client_setname, client_unblock, 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_replicas, 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, memory_doctor, memory_help, memory_malloc_stats, memory_purge, memory_stats, memory_usage, 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, replicaof, 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, xack, xadd, xclaim, xdel, xgroup, xinfo, xlen, xpending, xrange, xread, xreadgroup, xrevrange, xtrim, zadd, zcard, zcount, zincrby, zinterstore, zlexcount, zpopmax, zpopmin, 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 <>, with patches and input from, and @eyadof.


Copyright Tom Molesworth and others 2015-2019. Licensed under the same terms as Perl itself.