+sub del {
+ my ( $self, $key ) = @_;
+ $self->_sock_send( 'DEL', $key );
+}
+
+=head2 type
+
+ $r->type( 'key' ); # = string
+
+=cut
+
+sub type {
+ my ( $self, $key ) = @_;
+ $self->_sock_send( 'TYPE', $key );
+}
+
+=head1 Commands operating on the key space
+
+=head2 keys
+
+ my @keys = $r->keys( '*glob_pattern*' );
+
+=cut
+
+sub keys {
+ my ( $self, $glob ) = @_;
+ return split(/\s/, $self->_sock_result_bulk( 'KEYS', $glob ));
+}
+
+=head2 randomkey
+
+ my $key = $r->randomkey;
+
+=cut
+
+sub randomkey {
+ my ( $self ) = @_;
+ $self->_sock_send( 'RANDOMKEY' );
+}
+
+=head2 rename
+
+ my $ok = $r->rename( 'old-key', 'new-key', $new );
+
+=cut
+
+sub rename {
+ my ( $self, $old, $new, $nx ) = @_;
+ $self->_sock_send_ok( 'RENAME' . ( $nx ? 'NX' : '' ), $old, $new );
+}
+
+=head2 dbsize
+
+ my $nr_keys = $r->dbsize;
+
+=cut
+
+sub dbsize {
+ my ( $self ) = @_;
+ $self->_sock_send('DBSIZE');
+}
+
+=head1 Commands operating on lists
+
+=head2 rpush
+
+ $r->rpush( $key, $value );
+
+=cut
+
+sub rpush {
+ my ( $self, $key, $value ) = @_;
+ $self->_sock_send_bulk('RPUSH', $key, $value);
+}
+
+=head2 lpush
+
+ $r->lpush( $key, $value );
+
+=cut
+
+sub lpush {
+ my ( $self, $key, $value ) = @_;
+ $self->_sock_send_bulk('LPUSH', $key, $value);
+}
+
+=head2 llen
+
+ $r->llen( $key );
+
+=cut
+
+sub llen {
+ my ( $self, $key ) = @_;
+ $self->_sock_send( 'LLEN', $key );
+}
+
+=head2 lrange
+
+ my @list = $r->lrange( $key, $start, $end );
+
+=cut
+
+sub lrange {
+ my ( $self, $key, $start, $end ) = @_;
+ my $size = $self->_sock_send('LRANGE', $key, $start, $end);
+
+ confess $size unless $size > 0;
+ $size--;
+
+ my @list = ( 0 .. $size );
+ foreach ( 0 .. $size ) {
+ $list[ $_ ] = _sock_read_bulk();
+ }
+
+ warn "## lrange $key $start $end = [$size] ", dump( @list );
+ return @list;
+}