[Dbix-class] REPOST: memcache / DBIx::Class
Brian Kirkbride
brian.kirkbride at deeperbydesign.com
Wed May 30 00:23:34 GMT 2007
Brandon Black wrote:
> If we have a real PK/UNIQUE column to key on, we can probably reliably
> invalidate the cache on ins/upd/del of that key, which makes for a
> consistent cache model within that limited usage. We could probably
> do special cases for "SELECT * FROM foo" too, and just invalidate on
> any ins/upd/del on anything in the table. This is a very simplistic
> but useful caching model, where the PK/UK value is the key, and the
> object's data is the data. You could probably even extend it to cache
> objects returned by a complex search by their PKs as they are fetched
> via the ->next iterator too.
>
I agree, this is the easiest and most direct way to map a cache key to a cache
entry and it's easy to hook into the ResultSet to add to the cache. If a cache
keyed off of PK only cached on ->find that wouldn't be very useful. But hooking
into ->next and ->all in ResultSet would probably be pretty effective.
> An even bigger issue with this is that there probably isn't a general
> solution that also covers update/delete with complex where clauses, as
> opposed to update/delete of a specific key. (As in, "UPDATE people SET
> account_type=30 WHERE person_id > 200", or "DELETE FROM people WHERE
> person_id > 200").
>
This is true though, meaning that UPDATEs or DELETEs that aren't PK apparent
should invalidate all cache entries for that table.
On a somewhat related note, I've never understood why relationships don't save
roundtrips to the database when possible. It may be a consistency issue that
I'm not seeing, or possible DBIC does do this and I just don't know how to
"encourage" it. When I do:
# generates a query
my $foo = My::Schema->resultset('Foo')->find(123);
# generates another unless prefetch is set for Foo
my $bar = $foo->bar;
# much later in different code context, generates another query for Foo(123)
my $foo2 = $bar->foo;
shouldn't I get $foo2 without a trip to the database?
Assuming that Foo has_a Bar and Bar belongs_to Foo, of course. Maybe there's
just no good way to tell from the relationship meta data?
- Brian
More information about the Dbix-class
mailing list