The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use AnyEvent;
use AnyEvent::Redis::RipeRedis;

my $cv = AnyEvent->condvar();

my $redis = AnyEvent::Redis::RipeRedis->new(
  host => 'localhost',
  port => '6379',
  password => 'your_password',
  encoding => 'utf8',

  on_connect => sub {
    print "Connected to Redis server\n";
  },

  on_disconnect => sub {
    print "Disconnected from Redis server\n";
  },

  on_connect_error => sub {
    my $err_msg = shift;
    warn "$err_msg\n";
  },

  on_error => sub {
    my $err_msg = shift;
    my $err_code = shift;
    warn "$err_msg. Error code: $err_code\n";
  },
);

# Increment
$redis->incr( 'foo', {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );

# Set value
$redis->set( 'bar', 'Some string', {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );

# Get value
$redis->get( 'bar', {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );

# Push values
for ( my $i = 1; $i <= 3; $i++ ) {
  $redis->rpush( 'list', "element_$i", {
    on_done => sub {
      my $data = shift;
      print "$data\n";
    },
  } );
}

# Get list of values
$redis->lrange( 'list', 0, -1, {
  on_done => sub {
    my $data = shift;

    foreach my $val ( @{$data} ) {
      print "$val\n";
    }
  },
} );

# Transaction
$redis->multi( {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );
$redis->incr( 'foo', {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );
$redis->lrange( 'list', 0, -1, {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );
$redis->get( 'bar', {
  on_done => sub {
    my $data = shift;
    print "$data\n";
  },
} );
$redis->exec( {
  on_done => sub {
    my $data = shift;

    foreach my $chunk ( @{$data} ) {
      if ( ref( $chunk ) eq 'ARRAY' ) {
        foreach my $val ( @{$chunk} ) {
          print "$val\n";
        }
      }
      else {
        print "$chunk\n";
      }
    }
  },
} );

# Delete keys
foreach my $key ( qw( foo bar list ) ) {
  $redis->del( $key, {
    on_done => sub {
      my $data = shift;
      print "$data\n";
    }
  } );
}

# Disconnect
$redis->quit( {
  on_done => sub {
    my $data = shift;
    print "$data\n";
    $cv->send();
  }
} );

$cv->recv();