(Don't) read data from memcache to write back to a database.
Uncached
sub get { my $id = shift;
my ($value) = db_query("SELECT column FROM stuff WHERE id = $id");
return $value;
}
(Don't) read data from memcache to write back to a database.
Cached
sub get { my $id = shift;
my $memkey = "value_$id"; my $value = $mc->get($memkey); return $value if defined $value;
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$mc->set($memkey, $value, 3600); return $value;
}
(Don't) read data from memcache to write back to a database.
Oops, we missed this
sub update { my $id = shift; my $value = get($id);
$value = complex_transformation($value)
db_query("UPDATE stuff SET value=$value WHERE id=$id");
}
(Don't) read data from memcache to write back to a database.
Correctly cached
sub update { my $id = shift; my ($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$value = complex_transformation($value)
db_query("UPDATE stuff SET value=$value WHERE id=$id");
$mc->delete("value_$id"); # could be ->set }
(Don't) forget the negative caching case.
Uncached
sub get { my $id = shift;
my ($value) = db_query("SELECT column FROM stuff WHERE id = $id");
die "Invalid ID" unless defined $value;
return $value;
}
(Don't) forget the negative caching case.
Cached
sub get { my $id = shift;
my $memkey = "obj_$id"; my $value = $mc->get($memkey);
if (defined $value) { return $value;
}
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
die "Invalid ID" unless defined $value;
$mc->set($memkey, $value, 3600); return $value;
}
(Don't) forget the negative caching case.
Correctly cached
sub get { my $id = shift;
my $memkey = "obj_$id"; my $value = $mc->get($memkey);
if (defined $value) {
die "Invalid ID" if $value == -1; return $value;
}
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$value = -1 unless defined $value;
$mc->set($memkey, $value, 3600);
die "Invalid ID" unless defined $value;
return $value;
}
(Don't) set the cache timeouts too low.
sub get { my $id = shift;
my $memkey = "value_$id"; my $value = $mc->get($memkey); return $value if defined $value;
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$mc->set($memkey, $value, 1); return $value;
}
(Don't) forget to lock.
Lock around your memcache misses on expensive lookups. This prevents a stampede on your database.
(Don't) forget to lock.
Lock around your memcache misses on expensive lookups. This prevents a stampede on your database.
Locking with your database could be a bad thing though.
(Don't) forget to lock.
Cached
sub get { my $id = shift;
my $memkey = "obj_$id"; my $value = $mc->get($memkey); return $value if defined $value;
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$mc->set($memkey, $value, 3600);
return $value;
}
(Don't) forget to lock.
Cached and locked
sub get { my $id = shift;
my $memkey = "obj_$id"; my $value = $mc->get($memkey); return $value if defined $value;
get_lock($memkey);
($value) = db_query("SELECT column FROM stuff WHERE id = $id");
$mc->set($memkey, $value, 3600);
release_lock($memkey);
return $value;
}
(Don't) forget to lock.
Cached and locked better
sub get { my $id = shift;
my $memkey = "obj_$id"; my $value = $mc->get($memkey); return $value if defined $value;