+=head1 Commands operating on string values
+
+=head2 set
+
+ $r->set( foo => 'bar', $new );
+
+=cut
+
+sub set {
+ my ( $self, $k, $v, $new ) = @_;
+ print $sock ( $new ? "SETNX" : "SET" ) . " $k " . length($v) . "\r\n$v\r\n";
+ my $ok = <$sock>;
+ confess dump($ok) unless $ok eq "+OK\r\n";
+}
+
+=head2 get
+
+ my $value = $r->get( 'foo' );
+
+=cut
+
+sub get {
+ my ( $self, $k ) = @_;
+ print $sock "GET $k\r\n";
+ _sock_result_bulk();
+}
+
+=head2 incr
+
+ $r->incr('counter');
+ $r->incr('tripplets', 3);
+
+=cut
+
+
+
+sub incr {
+ my ( $self, $key, $value ) = @_;
+ if ( defined $value ) {
+ print $sock "INCRBY $key $value\r\n";
+ } else {
+ print $sock "INCR $key\r\n";
+ }
+ _sock_result();
+}
+
+=head2 decr
+
+ $r->decr('counter');
+ $r->decr('tripplets', 3);
+
+=cut
+
+sub decr {
+ my ( $self, $key, $value ) = @_;
+ if ( defined $value ) {
+ print $sock "DECRBY $key $value\r\n";
+ } else {
+ print $sock "DECR $key\r\n";
+ }
+ _sock_result();
+}
+
+=head2 exists
+
+ $r->exists( 'key' ) && print "got key!";
+
+=cut
+
+sub exists {
+ my ( $self, $key ) = @_;
+ print $sock "EXISTS $key\r\n";
+ _sock_result();
+}
+
+=head2 del
+
+ $r->del( 'key' ) || warn "key doesn't exist";
+
+=cut
+
+sub del {
+ my ( $self, $key ) = @_;
+ print $sock "DEL $key\r\n";
+ _sock_result();
+}
+
+=head2 type
+
+ $r->type( 'key' ); # = string
+
+=cut
+
+sub type {
+ my ( $self, $key ) = @_;
+ print $sock "TYPE $key\r\n";
+ _sock_result();
+}
+
+=head1 Commands operating on the key space
+
+=head2 keys
+
+ my @keys = $r->keys( '*glob_pattern*' );
+
+=cut
+
+sub keys {
+ my ( $self, $glob ) = @_;
+ print $sock "KEYS $glob\r\n";
+ return split(/\s/, _sock_result_bulk());
+}
+